#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_VAR * | variables = vars |
| SYS_INFO | sys_info |
| 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 | ( | ) |
| 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 | |||
| ) |
| 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 }
| 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 }
| unsigned char idata _n_sub_addr = 1 |
| unsigned char bdata bChange |
| sbit bCPupdoitNOW = bChange ^ 0 |
| sbit bDacdoitNOW = bChange ^ 1 |
| unsigned char channel |
| 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 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 $" |
| unsigned char tcounter |
| MSCB_INFO_VAR code vars[] |
1.4.7