#include <stdio.h>#include <stdlib.h>#include <string.h>#include "mscbemb.h"Defines | |
| #define | SST_LINE 1 |
| #define | P1_DATA P1 |
Functions | |
| float | avge (float temperature, char chan, int idx) |
| void | user_write (unsigned char index) reentrant |
| void | user_init (unsigned char init) |
| unsigned char | user_read (unsigned char index) |
| unsigned char | user_func (unsigned char *data_in, unsigned char *data_out) |
| void | user_loop (void) |
Variables | |
| unsigned long | _systime |
| char code | node_name [] = "GENERIC310_SST" |
| char idata | svn_rev_code [] = "$Rev: 1096 $" |
| unsigned char idata | _n_sub_addr = 1 |
| SYS_INFO | sys_info |
| unsigned char | ADT7486A_addrArray [] = {0x48, 0x4a} |
| struct { | |
| unsigned char status | |
| unsigned char error | |
| float internal [2] | |
| char ncount | |
| float temp [8] | |
| float SHTtemp | |
| float SHThumid | |
| unsigned int rSHTtemp | |
| unsigned int rSHThumid | |
| unsigned char FCSorig | |
| unsigned char FCSdevi | |
| float ext01off | |
| float ext02off | |
| float ext11off | |
| float ext12off | |
| } | user_data |
| MSCB_INFO_VAR code | vars [] |
| MSCB_INFO_VAR * | variables = vars |
| char | flag = 0 |
| sbit | LED_GREEN = LED_1 |
| sbit | LED_RED = LED_0 |
| sbit | SST = MSCB_SST1 |
| sbit | P1_0 = P1 ^ 0 |
| sbit | P1_1 = P1 ^ 1 |
| sbit | P1_2 = P1 ^ 2 |
| sbit | RH_VCC = P1 ^ 2 |
| sbit | P1_3 = P1 ^ 3 |
| sbit | P1_4 = P1 ^ 4 |
| sbit | RH_GND = P1 ^ 4 |
| sbit | P1_5 = P1 ^ 5 |
| sbit | P1_6 = P1 ^ 6 |
| sbit | P1_7 = P1 ^ 7 |
| sbit | P2_0 = P2 ^ 0 |
| sbit | P2_1 = P2 ^ 1 |
| sbit | P2_2 = P2 ^ 2 |
| sbit | P2_3 = P2 ^ 3 |
| sbit | P2_4 = P2 ^ 4 |
| sbit | P2_5 = P2 ^ 5 |
| sbit | P0_1 = P0 ^ 1 |
| sbit | P0_2 = P0 ^ 2 |
| sbit | P1_OEn = P0 ^ 7 |
| sbit | P2_OEn = P3 ^ 4 |
| #define P1_DATA P1 |
| #define SST_LINE 1 |
| float avge | ( | float | temperature, | |
| char | chan, | |||
| int | idx | |||
| ) |
00295 { 00296 int l, divider; 00297 float sumtemp; 00298 00299 atemp[chan][idx++] = temperature; 00300 sumtemp =0; 00301 for (divider=0,l=0;l<user_data.ncount;l++) { 00302 if (atemp[chan][l] != -500.f) { 00303 sumtemp += atemp[chan][l]; 00304 divider++; 00305 } 00306 } 00307 return (sumtemp / divider); 00308 }
| unsigned char user_func | ( | unsigned char * | data_in, | |
| unsigned char * | data_out | |||
| ) |
| void user_init | ( | unsigned char | init | ) |
00150 { 00151 idata char i, j; 00152 char xdata add; 00153 // float temperature; 00154 00155 if (init) { 00156 user_data.status = 0; 00157 user_data.error = 0x0; // 33250A 00158 user_data.SHTtemp = 0; 00159 user_data.SHThumid = 0; 00160 user_data.rSHTtemp = 0; 00161 user_data.rSHThumid = 0; 00162 user_data.FCSorig = 0; 00163 user_data.FCSdevi = 0; 00164 user_data.ext01off =0; 00165 user_data.ext02off =0; 00166 user_data.ext11off =0; 00167 user_data.ext12off =0; 00168 user_data.ncount = 10; 00169 00170 // sys_info.node_addr = 0x100; 00171 } 00172 00173 /* Format the SVN and store this code SVN revision into the system */ 00174 for (i=0;i<4;i++) { 00175 if (svn_rev_code[6+i] < 48) { 00176 svn_rev_code[6+i] = '0'; 00177 } 00178 } 00179 sys_info.svn_revision = (svn_rev_code[6]-'0')*1000+ 00180 (svn_rev_code[7]-'0')*100+ 00181 (svn_rev_code[8]-'0')*10+ 00182 (svn_rev_code[9]-'0'); 00183 add = cur_sub_addr(); 00184 00185 // 0:analog 1:digital 00186 P0MDIN = 0xFF; // P0 all digital pins 00187 P1MDIN = 0xFF; // P1 all digital pins 00188 P2MDIN = 0x3F; // P2 all digital pins ( Ain: .6.7 for SST) 00189 P3MDIN = 0xFF; // P3 all digital pins 00190 00191 // 0: open-drain, 1: push-pull 00192 P0MDOUT = 0x90; // P0 .7/P1_OEn .4/Tx 00193 // P1MDOUT = 0xFF; // P1 Push-Pull 00194 P2MDOUT = 0x3F; // P2 Push-Pull (OC:.6.7 for SST_IO, SST_REF) 00195 P3MDOUT = 0x18; // P3.3 (SST_DRV) P3 .4 (P2_OEn) 00196 00197 // Reference Voltage on P0.0 Enable 00198 REF0CN = 0x00; // Int Bias off, Int Temp off, VREF input on 00199 00200 // Buffer Output Enable 00201 P1_OEn = 0; 00202 P2_OEn = 0; 00203 00204 // Comparator 1 Settings as P2.6, P2.7 are using in this case 00205 CPT1CN = 0x80; //Enable Comparator1 (functional, the one above is only for CrossBar) 00206 00207 CPT1MX = 0x33; //Comparator1 MUX selection 00208 //Negative input is set to P2 ^ 7, and Positive input is set to P2 ^ 6 00209 // (P2 ^ 6 is the SST1_IO, so we want to compare SST1 with the threshold voltage 00210 //of !~0.8V on SST_REF (P2 ^ 7) 00211 CPT1MD = 0x02; //Comparator1 Mode Selection 00212 //Use default, adequate TYP (CP1 Response Time, no edge triggered interrupt) 00213 00214 // Set SST_REF & SST_IO P2 ^ 6/7 to Open-Drain and Analog Input 00215 // so that it accepts the ~650mV set by voltage divider. 00216 P2MDOUT &= 0x3F; 00217 P2MDIN &= 0x3F; 00218 00219 #ifdef _ADT7486A_ 00220 /* set-up / initialize circuit components (order is important) */ 00221 //NW modified SST to support more than one line 00222 ADT7486A_Init(SST_LINE); //Temperature measurements related initialization 00223 /* 00224 delay_ms(400); 00225 ADT7486A_Cmd(ADT7486A_addrArray[0], SetExt1Offset 00226 , (user_data.ext01off>>8), user_data.ext01off 00227 , SST_LINE, &temperature); 00228 delay_ms(200); 00229 ADT7486A_Cmd(ADT7486A_addrArray[0], SetExt2Offset 00230 , (user_data.ext02off>>8), user_data.ext02off 00231 , SST_LINE, &temperature); 00232 delay_ms(200); 00233 ADT7486A_Cmd(ADT7486A_addrArray[1], SetExt1Offset 00234 , (user_data.ext11off>>8), user_data.ext11off 00235 , SST_LINE, &temperature); 00236 delay_ms(200); 00237 ADT7486A_Cmd(ADT7486A_addrArray[1], SetExt2Offset 00238 , (user_data.ext12off>>8), user_data.ext12off 00239 , SST_LINE, &temperature); 00240 */ 00241 00242 if (user_data.ncount > 30) user_data.ncount = 30; 00243 for (j=0;j<4;j++) 00244 for (i=0;i<30;i++) atemp[j][i] = -500; 00245 #endif 00246 00247 // 00248 //--------------------------------------------------------------- 00249 //Humidity sensor initialization 00250 #ifdef _HUMSEN_ 00251 P1MDOUT |= 0x15; // P1.0/CLK(PP) P1.2/VCC(PP), P1.4/GND(PP), P1.6:DATA 10K PullUp (OD) 00252 RH_VCC = 1; 00253 RH_GND = 0; 00254 // Initializing the SHTxx communication 00255 HumiSensor_Init(humsense); 00256 // temporary humidity sensor 00257 user_data.SHTtemp = 0; 00258 user_data.SHThumid = 0; 00259 #endif 00260 00261 memset (&user_data.internal[0], 0, sizeof(user_data.internal)); 00262 memset (&user_data.temp[0], 0, sizeof(user_data.temp)); 00263 LED_RED = 0; 00264 }
| void user_loop | ( | void | ) |
00312 { 00313 char i; 00314 float xdata humidity, temperature, avgetemp; 00315 unsigned char status; 00316 00317 user_data.status += 1; 00318 00319 #ifdef _ADT7486A_ 00320 //----------------------------------------------------------------------------- 00321 // 00322 for (i=0;i<2;i++) { 00323 if(!ADT7486A_Cmd(ADT7486A_addrArray[i], GetIntTemp, SST_LINE, &temperature)){ 00324 DISABLE_INTERRUPTS; 00325 user_data.internal[i] = temperature; 00326 ENABLE_INTERRUPTS; 00327 } 00328 } 00329 00330 if(!ADT7486A_Cmd(ADT7486A_addrArray[0], GetExt1Temp, SST_LINE, &temperature)){ 00331 i1 %= user_data.ncount; 00332 avgetemp = avge(temperature, 0, i1); 00333 i1++; 00334 DISABLE_INTERRUPTS; 00335 user_data.temp[0] = temperature + user_data.ext01off; 00336 user_data.temp[0+4] = avgetemp; 00337 ENABLE_INTERRUPTS; 00338 } 00339 if(!ADT7486A_Cmd(ADT7486A_addrArray[0], GetExt2Temp, SST_LINE, &temperature)){ 00340 i2 %= user_data.ncount; avgetemp = avge(temperature, 1, i2); i2++; 00341 DISABLE_INTERRUPTS; 00342 user_data.temp[1] = temperature + user_data.ext02off; 00343 user_data.temp[1+4] = avgetemp; 00344 ENABLE_INTERRUPTS; 00345 } 00346 if(!ADT7486A_Cmd(ADT7486A_addrArray[1], GetExt1Temp, SST_LINE, &temperature)){ 00347 i3 %= user_data.ncount; avgetemp = avge(temperature, 2, i3); i3++; 00348 DISABLE_INTERRUPTS; 00349 user_data.temp[2] = temperature + user_data.ext11off; 00350 user_data.temp[2+4] = avgetemp; 00351 ENABLE_INTERRUPTS; 00352 } 00353 if(!ADT7486A_Cmd(ADT7486A_addrArray[1], GetExt2Temp, SST_LINE, &temperature)){ 00354 i4 %= user_data.ncount; avgetemp = avge(temperature, 3, i4); i4++; 00355 DISABLE_INTERRUPTS; 00356 user_data.temp[3] = temperature + user_data.ext12off; 00357 user_data.temp[3+4] = avgetemp; 00358 ENABLE_INTERRUPTS; 00359 } 00360 #endif 00361 00362 #ifdef _HUMSEN_ 00363 //----------------------------------------------------------------------------- 00364 // 00365 // Measuring the humidity and temperature 00366 if ((uptime() - currentTime) > 1) 00367 { 00368 status = HumidSensor_Cmd (&rSHThumi1 00369 ,&rSHTtemp1 00370 ,&humidity 00371 ,&htemperature 00372 ,&FCSorig1 00373 ,&FCSdevi1 00374 ,humsense); 00375 if (status == DONE){ 00376 DISABLE_INTERRUPTS; 00377 user_data.SHThumid = humidity; 00378 user_data.SHTtemp = htemperature; 00379 user_data.FCSorig = FCSorig1; 00380 user_data.FCSdevi = FCSdevi1; 00381 ENABLE_INTERRUPTS; 00382 } 00383 currentTime = uptime(); 00384 } 00385 #endif 00386 delay_ms(200); 00387 led_blink(1, 1, 100); 00388 }
| unsigned char user_read | ( | unsigned char | index | ) |
| void user_write | ( | unsigned char | index | ) |
00387 { 00388 rCSR = user_data.status; 00389 if (index == IDXCTL) { 00390 rCTL = user_data.control; 00391 } // IDXCTL 00392 00393 // 00394 //-- EE Page function 00395 if (index == IDXEEP_CTL) EEP_CTR_Flag = 1; 00396 }
| unsigned char idata _n_sub_addr = 1 |
| unsigned long _systime |
| unsigned char ADT7486A_addrArray[] = {0x48, 0x4a} |
| unsigned char error |
| float ext01off |
| float ext02off |
| float ext11off |
| float ext12off |
| unsigned char FCSdevi |
| unsigned char FCSorig |
| char flag = 0 |
| float internal[2] |
| sbit LED_GREEN = LED_1 |
| sbit LED_RED = LED_0 |
| char ncount |
| char code node_name[] = "GENERIC310_SST" |
| unsigned int rSHThumid |
| unsigned int rSHTtemp |
| float SHThumid |
| float SHTtemp |
| sbit SST = MSCB_SST1 |
| unsigned char status |
| char idata svn_rev_code[] = "$Rev: 1096 $" |
| float temp[8] |
| struct { ... } user_data |
| MSCB_INFO_VAR code vars[] |
1.4.7