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

#include <stdio.h>
#include <math.h>
#include <string.h>
#include "mscbemb.h"
#include "LPB.h"
#include "Devices/adc_internal.h"
#include "Protocols/LPB_SPI_handler.h"

Functions

void publishCtlCsr (void)
void publishErr (bit errbit)
void publishAll ()
void PublishVariable (float xdata *pvarDest, float varSrce, bit errbit)
float read_voltage (unsigned char channel, unsigned int *rvalue, unsigned char gain)
void delay_Operation (void)
void switchonoff (unsigned char command)
void user_init (unsigned char init)
void user_write (unsigned char index) reentrant
unsigned char user_read (unsigned char index)
unsigned char user_func (unsigned char *data_in, unsigned char *data_out)
void user_loop (void)

Variables

char code node_name [] = "LPB"
char idata svn_rev_code [] = "$Rev: 1189 $"
unsigned char idata _n_sub_addr = 1
unsigned char bdata bChange
sbit bCPupdoitNOW = bChange ^ 0
sbit bDacdoitNOW = bChange ^ 1
sbit LTC2620_Flag = bChange ^ 3
sbit EEP_CTR_Flag = bChange ^ 4
sbit DELAY_Flag = bChange ^ 5
sbit SPI_SCK = MSCB_SPI_SCK
sbit SPI_MOSI = MSCB_SPI_MOSI
sbit SPI_MISO = MSCB_SPI_MISO
sbit LPB_CSn = P0 ^ 4
sbit CPLDMode = P2 ^ 6
unsigned char channel
unsigned long xdata humidTime = 0
unsigned long xdata currentTime = 0
unsigned long xdata currentTime2 = 0
unsigned char lbyte
unsigned char hbyte
unsigned char xdata status
unsigned char xdata humicount
float xdata humidity
float xdata htemperature
unsigned int xdata rSHTtemp1
unsigned int xdata rSHThumi1
unsigned char xdata FCSorig1
unsigned char xdata FCSdevi1
float *xdata eep_address
unsigned char tcounter
unsigned char xdata eeprom_flag = CLEAR
unsigned char xdata eeprom_wstatus
unsigned char xdata eeprom_rstatus
unsigned int xdata eeptemp_addr
unsigned char xdata * eeptemp_source
unsigned char xdata eep_request
MSCB_INFO_VAR code vars []
MSCB_INFO_VARvariables = vars
SYS_INFO sys_info

Function Documentation

void delay_Operation ( void   ) 

00225 {
00226     LPB_CSn = 1;
00227     LPBSPI_Init();
00228     // Cxxxxxddd   C=1=W, C=0=R
00229     LPBSPI_WriteByte(0x80 | ((user_data.delay >> 8) & 0x3)); // Write MSB first
00230     LPBSPI_WriteByte(user_data.delay & 0xFF);
00231     LPB_CSn = 0;  // Register loading
00232     delay_us(100);
00233     LPB_CSn = 1;
00234     LPBSPI_Init();
00235     // Cxxxxxddd   C=1=W, C=0=R
00236     hbyte = LPBSPI_ReadByteRising(); // Read MSB first
00237     lbyte = LPBSPI_ReadByteRising();
00238     LPB_CSn = 0;
00239     delay_us(100);
00240     DISABLE_INTERRUPTS;
00241     user_data.delay  = (hbyte << 8);
00242     user_data.delay |= lbyte; 
00243     ENABLE_INTERRUPTS;
00244 }

void publishAll (  ) 

00180                   {
00181   user_data.control = rCTL;
00182   user_data.status  = rCSR;
00183   user_data.error   = rESR;
00184   ENABLE_INTERRUPTS;
00185 }

void publishCtlCsr ( void   ) 

00162                          {
00163   DISABLE_INTERRUPTS;
00164   user_data.control = rCTL;
00165   user_data.status  = rCSR;
00166   ENABLE_INTERRUPTS;
00167 }

void publishErr ( bit  errbit  ) 

00171                             {
00172     DISABLE_INTERRUPTS;
00173     errbit = ON;
00174     user_data.error   = rESR;
00175     ENABLE_INTERRUPTS;
00176 }

void PublishVariable ( float xdata *  pvarDest,
float  varSrce,
bit  errbit 
)

00189                                                                         {
00190   DISABLE_INTERRUPTS;
00191   *pvarDest = varSrce;
00192   if (errbit) user_data.error = rESR;
00193   ENABLE_INTERRUPTS;
00194 }

float read_voltage ( unsigned char  channel,
unsigned int *  rvalue,
unsigned char  gain 
)

00199 {
00200   unsigned int  xdata i;
00201   float         xdata voltage;
00202   unsigned int  xdata rawbin;
00203   unsigned long xdata rawsum = 0;
00204 
00205   // Averaging on 10 measurements for now.
00206   for (i=0 ; i<10 ; i++) {
00207     rawbin = adc_read(channel, gain);
00208     rawsum += rawbin;
00209     yield();
00210   }
00211 
00212   /* convert to V */
00213   *rvalue =  rawsum/10;
00214   voltage = (float)  *rvalue;                  // averaging
00215   voltage = (float)  voltage / 1024.0 * VREF;  // conversion
00216   if ( channel != TCHANNEL)
00217     voltage = voltage * coeff[channel] + offset[channel];
00218 
00219   return voltage;
00220 }

void switchonoff ( unsigned char  command  ) 

00249 {
00250   char xdata i;
00251 
00252   if(command==ON)
00253   {
00254     SFRPAGE  = CONFIG_PAGE;
00255     VCC_EN = ON;
00256     VREG_5 = VREG_3 = ON;  // VREG_1 
00257     P0MDOUT |= 0xCC;   // DACs_CS + DELAY_x PP
00258 
00259     // Activate 16 dac settings
00260     // user_data contains correct values, force update 
00261     // by setting mirror to 0xff 
00262     for(i=0;i<16;i++) ltc2620mirror[i] = 0x001;
00263 
00264     // Needs power for DAC update, by now it should be ON
00265     // Force DAC updates
00266     LTC2620_Flag = ON;
00267 
00268   } else if(command==OFF) {
00269     // Switch all the ports to open drain except for...
00270     SFRPAGE  = CONFIG_PAGE;
00271     VCC_EN = OFF;
00272     VREG_5 = VREG_3  = OFF; // VREG_1
00273 
00274 // P3.7:A7       .6:A6        .5:A5       .4:A4      | .3:A3      .2:A2       .1:A1      .0:A0 
00275 // P2.7:+1.8En   .6:+3.3En    .5:+5En     .4:SPIMOSI | .3:SPISCK  .2:RAMHLDn  .1:SPIMISO .0:RAMWP
00276 // P1.7:NC       .6:+6ddFlag  .5:R/HClock .4:R/HData | .3:+6ddEN  .2:RAMCS    .1:NC      .0:SST_DRV 
00277 // P0.7:DEL_CLK  .6:DEL_DATA  .5:485TXEN  .4:NC      | .3:DELCS1  .2:DELCS2   .1:Rx      .0:Tx 
00278     P0MDOUT &= ~0xCC;   // // DACs_CS + DELAY_x OD
00279 
00280   }
00281 }

unsigned char user_func ( unsigned char *  data_in,
unsigned char *  data_out 
)

00512 {
00513   /* echo input data */
00514   data_out[0] = data_in[0];
00515   data_out[1] = data_in[1];
00516   return 2;
00517 }

void user_init ( unsigned char  init  ) 

00288 {
00289 //  float xdata temperature;
00290   unsigned char xdata i, pca_add=0;
00291   unsigned int xdata crate_add=0, board_address=0;
00292   if(init) {
00293 //     crate_add = cur_sub_addr();
00294   }
00295 
00296   /* Format the SVN and store this code SVN revision into the system */
00297   for (i=0;i<4;i++) {
00298     if (svn_rev_code[6+i] < 48) {
00299       svn_rev_code[6+i] = '0';
00300     }
00301   }
00302   sys_info.svn_revision = (svn_rev_code[6]-'0')*1000+
00303     (svn_rev_code[7]-'0')*100+
00304     (svn_rev_code[8]-'0')*10+
00305     (svn_rev_code[9]-'0');
00306 
00307   // Set group for LPB
00308   sys_info.group_addr  = 500;
00309 
00310   // Clear all user_data
00311   memset((char *) &user_data, 0x00, sizeof(user_data));
00312 
00313   // Clear registers and command flags
00314   rCTL = rCSR = 0;
00315   LTC2620_Flag = EEP_CTR_Flag = 0;
00316 
00317   //
00318   // Initial setting for communication and overall ports (if needed).
00319   //-----------------------------------------------------------------------------
00320   SFRPAGE  = CONFIG_PAGE;
00321   // P0MDOUT already contains Tx in push-pull
00322   P0MDOUT |= 0x20;   // add RS485_ENABLE in push-pull
00323   // Disable UART1
00324   XBR2 &= ~0x04;
00325 
00326   //---------------------------------------------------------------
00327   //
00328   // Main switch PP
00329   SFRPAGE  = CONFIG_PAGE;
00330   VREG_5 = VREG_3 = OFF;  // VREG_1
00331   VCC_EN = OFF;
00332   P1MDOUT |= 0x08;       // VCC_EN PP
00333   P1MDOUT &= ~0x40;      // VCC_Flag OD
00334   P2MDOUT |= 0xE0;       // +1.8, +3.3, +5 Enable PP
00335   switchonoff(OFF);
00336 
00337   //
00338   // uC Miscellaneous ADCs (V/I Monitoring)
00339   //-----------------------------------------------------------------------------
00340   adc_internal_init();
00341 
00342   // Address decoding
00343 //  P3MDOUT  = 0x00; // Crate address in OD
00344 //  P3 = 0xFF;
00345 
00346   //
00347   // SST Temperatures
00348   //-----------------------------------------------------------------------------
00349 #ifdef _ADT7486A_
00350   SFRPAGE  = CONFIG_PAGE;
00351   P1MDOUT |= 0x01;        // SST_DRV PP
00352   SFRPAGE  = CPT1_PAGE;
00353   CPT1CN  |= 0x80;        // Enable the Comparator 1
00354   CPT1MD   = 0x03;        //Comparator1 Mode Selection
00355   //Use default, adequate TYP (CP1 Response Time, no edge triggered interrupt)
00356 
00357   ADT7486A_Init(SST_LINE1);
00358 #endif
00359 
00360 //---------------------------------------------------------------
00361 //
00362 // SPI bus
00363   SFRPAGE  = CONFIG_PAGE;
00364   SPI_MISO = 1;            // Enable READ on MISO
00365   P2MDOUT |= 0x18;        // SPI_MOSI, SPI_SCK  PP
00366   SPI_SCK  = 0;
00367   SPI_MOSI = 0;
00368 
00369 //---------------------------------------------------------------
00370 //
00371 // EEPROM access
00372 #ifdef _ExtEEPROM_
00373   SFRPAGE  = CONFIG_PAGE;
00374   P2MDOUT |= 0x01;        // RAM_WPn PP
00375   P2MDOUT |= 0x04;        // RAM_HOLD PP
00376   RAM_HLDn = 1;           // 
00377   P1MDOUT |= 0x04;        // RAM_CSn PP
00378 
00379   ExtEEPROM_Init();
00380 
00381   // Read only the serial number from the protected page
00382   ExtEEPROM_Read(SERIALN_ADD,(unsigned char xdata *)&eepage.SerialN, SERIALN_LENGTH);
00383   user_data.SerialN = eepage.SerialN;
00384 
00385   memset((char *) &eepage, 0x00, PAGE_SIZE);
00386 
00387   // Read all other settings from page 0(non-protected)
00388   ExtEEPROM_Read(PageAddr[0], (unsigned char xdata *)&eepage, PAGE_SIZE);
00389 
00390   // Publish user_data new settings
00391   DISABLE_INTERRUPTS;
00392   for(i=0;i<16;i++)  user_data.rdac[i] = eepage.rdac[i];
00393   user_data.delay = eepage.delay;
00394   ENABLE_INTERRUPTS;
00395 
00396 #endif
00397 
00398 //---------------------------------------------------------------
00399 //
00400 //Humidity sensor initialization
00401 #ifdef _HUMSEN_
00402   SFRPAGE  = CONFIG_PAGE;
00403   P1MDOUT |= 0x20;        // R/HClock PP, R/HData (OD)
00404   // Initializing the SHTxx communication
00405   HumiSensor_Init(humsense);
00406   //temporary humidity sensor
00407   user_data.SHTtemp = 0;
00408   user_data.SHThumid = 0;
00409   user_data.rSHTemp = 0;
00410   user_data.rSHhumid = 0;
00411 #endif
00412 
00413 //---------------------------------------------------------------
00414 //
00415 // Configure and read the address
00416 // C C C C C C 1 0 1 is the MSCB Addr[8..0], 9 bits
00417 // Modifying what the board reads from the Pins
00418   SFRPAGE  = CONFIG_PAGE;
00419   P3MDOUT |= 0xFF; // PushPull for the address
00420   pca_add= P3;
00421   board_address= (((~pca_add)<<1) & 0x01F8)| 0x0005;
00422   sys_info.node_addr   = board_address;
00423 
00424 #ifdef _ADT7486A_
00425 //---------------------------------------------------------------
00426 //
00427 // SST Temperatures, setting temperature offsets
00428 /*
00429   ADT7486A_Cmd( ADT7486A_ADDR0, SetExt1Offset
00430              , ((int)eepage.sstOffset[0]>>8)
00431              ,  (int)eepage.sstOffset[0]
00432              , SST_LINE1
00433              , &temperature); //NW
00434 
00435   ADT7486A_Cmd( ADT7486A_ADDR0, SetExt2Offset
00436              , ((int)eepage.sstOffset[0]>>8)
00437              ,  (int)eepage.sstOffset[0]
00438              , SST_LINE1
00439              , &temperature); //NW
00440 */
00441 #endif
00442 
00443 //---------------------------------------------------------------
00444 //
00445 // Dacs LTC2620 with mirror 
00446   for(i=0;i<16;i++) {
00447     user_data.rdac[i] = eepage.rdac[i];
00448     ltc2620mirror[i] = eepage.rdac[i];
00449   }
00450 
00451 
00452 #ifdef _LTC2620_
00453 //---------------------------------------------------------------
00454 //
00455 // LED DAC (2 Dacs chip=1 & chip=2)
00456   LTC2620_Init(1);
00457   LTC2620_Init(2);
00458 #endif
00459 
00460 
00461 //---------------------------------------------------------------
00462 //
00463 // Delay setting
00464   SFRPAGE  = CONFIG_PAGE;
00465 // Setup CMB SPI ports   
00466 // 48        32       DELAY_CLOCK  P0.7
00467 // 49        17       DELAY_DATIN  P0.6
00468 // 51        9        DELAY_CS     P0.4
00469 
00470   P0MDOUT |= 0x80;  // LPB_SPI_SCK  (P0.7) PP
00471   P0MDOUT |= 0x40;  // LPB_SPI_MOSI (P0.6) PP
00472   P2MDOUT &= ~0x80; // LPB_SPI_MISO (P2.7) OD
00473   P0MDOUT |= 0x10;  // LPB_CS       (P0.4) PP
00474 
00475   P2MDOUT |= 0x40;  // CPLDMode     (P2.6) PP
00476   CPLDMode = 1;     // Default no test
00477 } // End of Init()

void user_loop ( void   ) 

00522                      {
00523 
00524   float xdata volt, temperature;
00525   unsigned int xdata rvolt, i;
00526   unsigned char xdata status, ltc2620_idx, ltc2620_chip, ltc2620_chan;
00527   float* xdata pfData;
00528   unsigned long xdata mask;
00529   unsigned int xdata *rpfData;
00530  
00531   //-----------------------------------------------------------------------------
00532   //
00533   // SPI for Delay setting, using the CMB SPI protocol
00534   if (SPup && DELAY_Flag) {
00535     delay_Operation();
00536     DELAY_Flag = CLEAR;
00537   }
00538 
00539   //-----------------------------------------------------------------------------
00540   // Switch CPLD Mode
00541   if (Cmode) {
00542     rCSR = user_data.status;
00543     if (Smode) { CPLDMode = 1; Smode = 0; }  // standard
00544     else       { CPLDMode = 0; Smode = 1; }  // test
00545     Cmode = 0;  // Reset command
00546     publishCtlCsr();  // Publish Ctl/Csr
00547   } // Switch CPLD Mode
00548 
00549   //-----------------------------------------------------------------------------
00550   // Power Up based on CTL bit
00551   if (CPup) {
00552     rCSR = user_data.status;
00553     rESR = 0x0000;   // Reset error status at each Power UP
00554     // Clear Status
00555     SsS = OFF;
00556     DISABLE_INTERRUPTS;
00557     user_data.status  = rCSR;
00558     user_data.error   = rESR;
00559     ENABLE_INTERRUPTS;
00560     // Power up Card
00561     switchonoff(ON);
00562     // Force Check on Voltage during loop
00563     bCPupdoitNOW = ON;
00564     // Mark Pup time for error check delay
00565     currentTime2 = uptime();
00566     // Wait for Check before setting SPup
00567     // Reset Action
00568     CPup = CLEAR;  // rCTL not updated yet, publish state after U/I check
00569   } // Power Up
00570 
00571   //-----------------------------------------------------------------------------
00572   // Set Manual Shutdown based on Index
00573   if (CmSd) {
00574     rCSR = user_data.status;
00575     SmSd = ON;             // Set Manual Shutdown
00576     switchonoff(OFF);
00577     SPup = OFF;            // Clear Qpump and card status
00578     CmSd = CLEAR;          // Reset action
00579     publishCtlCsr();       // Publish Registers state
00580   } // Manual Shutdown
00581 
00582   //-----------------------------------------------------------------------------
00583   //
00584   // LED amplitude DAC
00585 #ifdef _LTC2620_
00586   // Get current status of the Card, don't update DAC in case of no Power, keep flag up
00587   rCSR = user_data.status;    
00588 //-PAA remove flag condition, this will compare the dac to mirror every time, but won't set the DAC
00589 //     if the value is unchanged. Will fix the the dac setting in case of block of dac change is requested.
00590 //  if(SPup && LTC2620_Flag) {
00591   if(SPup) {
00592     for(ltc2620_idx=0; ltc2620_idx < 16; ltc2620_idx++) {
00593       if(bDacdoitNOW || (ltc2620mirror[ltc2620_idx]!= user_data.rdac[ltc2620_idx])) {
00594         ltc2620_chip = (ltc2620_idx > 7) ? 2 : 1;
00595         ltc2620_chan = (ltc2620_chip == 2) ? ltc2620_idx - 8: ltc2620_idx;
00596         LTC2620_Cmd(WriteTo_Update, ltc2620_chip, ltc2620_chan, user_data.rdac[ltc2620_idx]);
00597         ltc2620mirror[ltc2620_idx] = user_data.rdac[ltc2620_idx];
00598       }
00599     }
00600     LTC2620_Flag = bDacdoitNOW = CLEAR;
00601   }
00602 #endif
00603 
00604   //-----------------------------------------------------------------------------
00605   //
00606   // Measuring the temperature & humidity every 2 sec
00607   if ( !bCPupdoitNOW && (uptime() - humidTime) > 2) {
00608 
00609 #ifdef _ADT7486A_
00610   //-----------------------------------------------------------------------------
00611   // Local board temperature reading Internal SST and 2 Ext SST on board
00612     if(!ADT7486A_Cmd(ADT7486A_ADDR0, GetIntTemp, SST_LINE1, &temperature)) {
00613       RdssT = CLEAR;
00614       if ((temperature < eepage.luCTlimit) || (temperature > eepage.uuCTlimit)) pcbssTT = ON;
00615       PublishVariable(&(user_data.IntTemp), temperature, pcbssTT);
00616     } else publishErr(RdssT);
00617 
00618     if(!ADT7486A_Cmd(ADT7486A_ADDR0, GetExt1Temp, SST_LINE1, &temperature)) {
00619       RdssT = CLEAR;
00620       if ((temperature < eepage.lSSTlimit) || (temperature > eepage.uSSTlimit)) pcbssTT = ON;
00621       PublishVariable(&(user_data.Temp58), temperature, pcbssTT);
00622     } else publishErr(RdssT);
00623 
00624     if(!ADT7486A_Cmd(ADT7486A_ADDR0, GetExt2Temp, SST_LINE1, &temperature)) {
00625       RdssT = CLEAR;
00626       if ((temperature < eepage.lSSTlimit) || (temperature > eepage.uSSTlimit)) pcbssTT = ON;
00627       PublishVariable(&(user_data.Temp33), temperature, pcbssTT);
00628     } else publishErr(RdssT);
00629   #endif
00630 
00631 #ifdef _HUMSEN_
00632   //-----------------------------------------------------------------------------
00633   // Local board humidity
00634     if (humicount) {
00635       status = HumidSensor_Cmd (&rSHThumi1
00636                              ,&rSHTtemp1
00637                              ,&humidity
00638                              ,&htemperature
00639                              ,&FCSorig1
00640                              ,&FCSdevi1
00641                              ,humsense);
00642       if (status == DONE) {      
00643         humicount = 5;
00644         DISABLE_INTERRUPTS;
00645         user_data.rSHTemp  = rSHTtemp1;
00646         user_data.rSHhumid = rSHThumi1;
00647         user_data.SHThumid = humidity;
00648         user_data.SHTtemp  = htemperature;
00649         ENABLE_INTERRUPTS;
00650       }
00651       humicount--;
00652     }
00653     humidTime = uptime();
00654 
00655 #endif 
00656 
00657  }  // Timer humidTime
00658 
00659   //-----------------------------------------------------------------------------
00660   //
00661   // read Vdd switch Current Fault
00662   V6Fault = (V6ddFlag == 1) ? 0 : 1;   // +6Vdd Fault flag
00663 
00664   //-----------------------------------------------------------------------------
00665   //
00666   // Periodic check (every second) and After power up
00667   // uCtemperature, Voltage and Current readout
00668   if ( bCPupdoitNOW || ((uptime() - currentTime) > 1)) {
00669     //-----------------------------------------------------------------------------
00670     // uC Temperature reading/monitoring based on time
00671     // Read uC temperature, set error if temp out of range
00672     volt = read_voltage(TCHANNEL, &rvolt, IntGAIN1 );
00673     /* convert to deg. C */
00674     temperature = 1000 * (volt - 0.776) / 2.86;   // Needs calibration
00675     /* strip to 0.1 digits */
00676     temperature = ((int) (temperature * 10 + 0.5)) / 10.0;
00677     if ((temperature < eepage.luCTlimit) || (temperature > eepage.uuCTlimit)) uCT = ON; // out of range
00678     PublishVariable(&(user_data.uCTemp), temperature, uCT);
00679 
00680     //-----------------------------------------------------------------------------
00681     // Internal ADCs monitoring Voltages and Currents based on time
00682     // All U/I set error if value out of range
00683     pfData  = &(user_data.iadc);
00684     rpfData = &(user_data.riadc);
00685     for (channel=0 ; channel<INTERNAL_N_CHN ; channel++) {
00686       volt = read_voltage(channel, &rvolt, IntGAIN1);
00687       DISABLE_INTERRUPTS;
00688       pfData[channel] = volt;
00689       rpfData[channel] = rvolt;
00690       ENABLE_INTERRUPTS;
00691       // mask matches the iadc index and the xVIlimit index.
00692       // BUT it is shifted by one relative to the rESR bit 
00693       // rESR ^ 0 <= channel = 1 and not 0 (D2A)
00694       // Skip check on channel 0 (D2A)
00695       if (channel) {
00696         mask = (1<<(channel-1)); // error mask
00697         if ((volt < eepage.lVIlimit[channel]) || (volt > eepage.uVIlimit[channel]))  rESR |= mask;
00698         else rESR &= ~mask;   // in range
00699       }
00700     }  // U/I loop
00701     // U/I error not yet published ...
00702     // update time for next loop
00703     currentTime = uptime();
00704   }  // Voltage, Current & Temperature Check 
00705 
00706   //-----------------------------------------------------------------------------
00707   // Finally take action based on ERROR register
00708   // But delay action in case of coming from PowerUp as the voltage may still not 
00709   // be stable and can cause premature shutdown.
00710   if ((uptime() - currentTime2) > 1) {
00711     if (SPup && (rESR & (VOLTAGE_MASK | UCTEMPERATURE_MASK | BTEMPERATURE_MASK | MAIN_CURRENT_MASK))) {
00712       SPup = OFF;
00713       switchonoff(OFF);
00714       SsS = ON;
00715     } else if (bCPupdoitNOW) {
00716       bCPupdoitNOW = OFF;   // Reset flag coming from PowerUp sequence
00717       SsS = SmSd = OFF;
00718       SPup = ON;                       // Set status ON 
00719       LTC2620_Flag = bDacdoitNOW = ON; // Allow & force full DAC reload 
00720       DELAY_Flag = ON;                 // Reload delay
00721     }
00722   }
00723 
00724   // Publish Control, Error and Status for all the bdoitNOW actions.
00725   publishAll();
00726 
00727 #ifdef _ExtEEPROM_
00728   //-----------------------------------------------------------------------------
00729   //
00730   // Checking the eeprom control flag
00731   if (EEP_CTR_Flag) {
00732     //Checking for the special instruction
00733     if (user_data.eeCtrSet & EEP_CTRL_KEY) {
00734       // Valid index range
00735       if( (int)(user_data.eeCtrSet & 0x000000ff) >= EEP_RW_IDX) {
00736         // Float area from EEP_RW_IDX, count in Float size, No upper limit specified!
00737         eep_address = (float*)&eepage + (user_data.eeCtrSet & 0x000000ff);
00738         //Checking for the write request
00739         if (user_data.eeCtrSet & EEP_CTRL_WRITE){
00740           *eep_address = user_data.eepValue;  // Copy user_data into eepage structure
00741           //Checking for the read request
00742         } else if (user_data.eeCtrSet & EEP_CTRL_READ) {
00743           DISABLE_INTERRUPTS;
00744           user_data.eepValue = *eep_address;  // Publish eep value in user_data
00745           ENABLE_INTERRUPTS;
00746         } else {
00747           // Tell the user that inappropriate task has been requested
00748           DISABLE_INTERRUPTS;
00749           user_data.eeCtrSet = EEP_CTRL_INVAL_REQ;
00750           ENABLE_INTERRUPTS;
00751         }
00752       } else {
00753         DISABLE_INTERRUPTS;
00754         user_data.eeCtrSet = EEP_CTRL_OFF_RANGE;
00755         ENABLE_INTERRUPTS;
00756       }
00757     } else {
00758       // Tell the user that invalid key has been provided
00759       DISABLE_INTERRUPTS;
00760       user_data.eeCtrSet = EEP_CTRL_INVAL_KEY;
00761       ENABLE_INTERRUPTS;
00762     }
00763     EEP_CTR_Flag = CLEAR;
00764   }  // if eep
00765 
00766   //-----------------------------------------------------------------------------
00767   //
00768   // Writing to the EEPROM
00769   if (CeeS) {
00770     // Check if we are here for the first time
00771     if (!eeprom_flag) {  // first in
00772       rCSR = user_data.status;
00773 
00774       // Update eepage with the current user_data variables
00775       for(i=0;i<16;i++)  eepage.rdac[i] = user_data.rdac[i];
00776       eepage.delay = user_data.delay;
00777 
00778       // Temporary store the first address of page
00779       eeptemp_addr = PageAddr[(unsigned char)(user_data.eepage & 0x07)];
00780       // Temporary store the first address of data which has to be written
00781       eeptemp_source = (unsigned char xdata *) &eepage;
00782     }
00783 
00784     // EEPROM clear request
00785     if (CeeClr)  eep_request = WRITE_EEPROM;   //---PAA--- WAS CLEAR BUT WILL ERASE EEPROM!
00786     else         eep_request = WRITE_EEPROM;
00787 
00788     status = ExtEEPROM_Write_Clear (eeptemp_addr
00789                                          , &eeptemp_source
00790                                          , PAGE_SIZE
00791                                          , eep_request
00792                                          , &eeprom_flag);
00793 
00794     if (status == DONE) {
00795       SeeS = DONE;
00796       eeprom_flag = CLEAR;
00797       CeeS = CLEAR;
00798       // Set the active page
00799       user_data.eepage |= ((user_data.eepage & 0x07) << 5);
00800     } else  SeeS = FAILED;
00801 
00802     publishCtlCsr();      // Publish Registers state
00803   } // eep Save
00804 
00805   //-----------------------------------------------------------------------------
00806   //
00807   // Reading from the EEPROM
00808   if (CeeR) {
00809     rCSR = user_data.status;
00810     // Read the active page
00811     eeptemp_addr = PageAddr[(unsigned char)(user_data.eepage & 0x07)];
00812     eeptemp_source = (unsigned char xdata *) &eepage;
00813     channel = ExtEEPROM_Read (eeptemp_addr, eeptemp_source, PAGE_SIZE);
00814     if (channel == DONE) {
00815       SeeR = DONE;
00816  
00817       // Publish user_data new settings
00818       DISABLE_INTERRUPTS;
00819       for(i=0;i<16;i++)  user_data.rdac[i] = eepage.rdac[i];
00820       user_data.delay = eepage.delay;
00821       ENABLE_INTERRUPTS;
00822 
00823       LTC2620_Flag = bDacdoitNOW = ON;  // Allow & Force a full DAC reload
00824       DELAY_Flag = ON;                  // Reload delay
00825     } else  SeeR = FAILED;
00826 
00827     CeeR = CLEAR;       // Reset action
00828     publishCtlCsr();    // Publish Registers state
00829   }  // eep Restore
00830 #endif   // EEPROM
00831 
00832   // slow down user loop
00833   delay_ms(10);
00834 }

unsigned char user_read ( unsigned char  index  ) 

00505 {
00506   if (index);
00507   return 0;
00508 }

void user_write ( unsigned char  index  ) 

00484 {
00485   // LED Amplitude DAC
00486   if((index >= IDXDAC) && (index < IDXDAC+16))
00487     LTC2620_Flag = SET;
00488 
00489   // Control
00490   if(index==IDXCTL)
00491     rCTL = user_data.control;
00492 
00493   // Delay
00494   if (index==IDXDELAY) {
00495     DELAY_Flag = SET;
00496   }  
00497 
00498   // EEPROM command
00499   if (index == IDXEEP_CTL)
00500     EEP_CTR_Flag = SET;
00501 }


Variable Documentation

unsigned char idata _n_sub_addr = 1

unsigned char bdata bChange

sbit bCPupdoitNOW = bChange ^ 0

sbit bDacdoitNOW = bChange ^ 1

unsigned char channel

sbit CPLDMode = P2 ^ 6

unsigned long xdata currentTime = 0

unsigned long xdata currentTime2 = 0

sbit DELAY_Flag = bChange ^ 5

float* xdata eep_address

sbit EEP_CTR_Flag = bChange ^ 4

unsigned char xdata eep_request

unsigned char xdata eeprom_flag = CLEAR

unsigned char xdata eeprom_rstatus

unsigned char xdata eeprom_wstatus

unsigned int xdata eeptemp_addr

unsigned char xdata* eeptemp_source

unsigned char xdata FCSdevi1

unsigned char xdata FCSorig1

unsigned char hbyte

float xdata htemperature

unsigned char xdata humicount

float xdata humidity

unsigned long xdata humidTime = 0

unsigned char lbyte

sbit LPB_CSn = P0 ^ 4

sbit LTC2620_Flag = bChange ^ 3

char code node_name[] = "LPB"

unsigned int xdata rSHThumi1

unsigned int xdata rSHTtemp1

sbit SPI_MISO = MSCB_SPI_MISO

sbit SPI_MOSI = MSCB_SPI_MOSI

sbit SPI_SCK = MSCB_SPI_SCK

unsigned char xdata status

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

SYS_INFO sys_info

unsigned char tcounter

MSCB_INFO_VAR* variables = vars

MSCB_INFO_VAR code vars[]


Generated on 10 Jun 2013 for FGDC8051 by  doxygen 1.4.7