/home/daqweb/fgddaq/c8051/Generic_SST_SHT.c File Reference

#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_VARvariables = 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 Documentation

#define P1_DATA   P1

#define SST_LINE   1


Function Documentation

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 
)

00287 {
00288    /* echo input data */
00289    data_out[0] = data_in[0];
00290    data_out[1] = data_in[1];
00291    return 2;
00292 }

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  ) 

00278 {
00279   if(index);
00280 
00281    return 0;
00282 }

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 }


Variable Documentation

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"

sbit P0_1 = P0 ^ 1

sbit P0_2 = P0 ^ 2

sbit P1_0 = P1 ^ 0

sbit P1_1 = P1 ^ 1

sbit P1_2 = P1 ^ 2

sbit P1_3 = P1 ^ 3

sbit P1_4 = P1 ^ 4

sbit P1_5 = P1 ^ 5

sbit P1_6 = P1 ^ 6

sbit P1_7 = P1 ^ 7

sbit P1_OEn = P0 ^ 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 P2_OEn = P3 ^ 4

sbit RH_GND = P1 ^ 4

sbit RH_VCC = P1 ^ 2

unsigned int rSHThumid

unsigned int rSHTtemp

float SHThumid

float SHTtemp

sbit SST = MSCB_SST1

unsigned char status

char idata svn_rev_code[] = "$Rev: 1096 $"

SYS_INFO sys_info

float temp[8]

struct { ... } user_data

MSCB_INFO_VAR* variables = vars

MSCB_INFO_VAR code vars[]


Generated on 10 Jun 2013 for FGDC8051 by  doxygen 1.4.7