#include <stdio.h>#include <math.h>#include "mscbemb.h"#include "cmb.h"#include "Devices/adc_internal.h"#include "Protocols/CMB_SPI_handler.h"Functions | |
| void | publishCtlCsr (void) |
| void | publishErr (bit errbit) |
| void | publishAll () |
| void | CMB_SPI_WriteByte (unsigned char cmbinst, unsigned char cmbdata) |
| unsigned char | CMB_SPI_ReadByte (unsigned char cmbinst) |
| void | PublishVariable (float xdata *pvarDest, float varSrce, bit errbit) |
| unsigned int | NodeAdd_get (void) |
| void | switchonoff (unsigned char command) |
| float | read_voltage (unsigned char channel, unsigned int *rvalue, unsigned char gain) |
| 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 [] = "cmb" |
| char idata | svn_rev_code [] = "$Rev: 942 $" |
| sbit | CFG_RECOVER = P2 ^ 0 |
| sbit | CMB_CSn = P2 ^ 1 |
| sbit | CLK_SEL = P0 ^ 7 |
| sbit | V4_ENn = P2 ^ 3 |
| sbit | V4_OCn = P2 ^ 4 |
| unsigned char idata | _n_sub_addr = 1 |
| unsigned char xdata | channel |
| unsigned long xdata | tempTime = 0 |
| unsigned long xdata | sstTime = 0 |
| unsigned char xdata | status |
| unsigned char xdata | channel |
| unsigned char xdata | NodeOK = 0 |
| unsigned int xdata | crate_add = 0 |
| unsigned int xdata | pca_add = 0 |
| unsigned char bdata | bChange |
| sbit | bCPupdoitNOW = bChange ^ 0 |
| sbit | EEP_CTR_Flag = bChange ^ 1 |
| sbit | bMeasuredOnce = bChange ^ 2 |
| MSCB_INFO_VAR code | vars [] |
| MSCB_INFO_VAR * | variables = vars |
| SYS_INFO | sys_info |
| unsigned char CMB_SPI_ReadByte | ( | unsigned char | cmbinst | ) |
00146 { 00147 unsigned char cdata; 00148 CMB_CSn = 0; 00149 CMBSPI_WriteByte(cmbinst); 00150 cdata = CMBSPI_ReadByteRising(); 00151 CMB_CSn = 1; 00152 return cdata; 00153 }
| void CMB_SPI_WriteByte | ( | unsigned char | cmbinst, | |
| unsigned char | cmbdata | |||
| ) |
00137 { 00138 CMB_CSn = 0; 00139 CMBSPI_WriteByte(cmbinst); 00140 CMBSPI_WriteByte(cmbdata); 00141 CMB_CSn = 1; 00142 }
| unsigned int NodeAdd_get | ( | void | ) |
00167 { 00168 // 00169 //----------------------------------------------------------------------------- 00170 // Address retrieval 00171 // Configure and read the address 00172 // C C C C C C 1 0 0 is the MSCB Addr[8..0], 9 bits 00173 // Modifying what the board reads from the Pins 00174 SFRPAGE = CONFIG_PAGE; 00175 // Change p3 to digital input 00176 P3MDOUT = 0x00; 00177 P3=0xFF; 00178 // Read crate address 00179 pca_add= P3; 00180 crate_add= ((~pca_add)<<3) & 0x01F8; 00181 return ( (crate_add & 0x01FC) | 0x0004); 00182 }
| void publishAll | ( | ) |
| void publishCtlCsr | ( | void | ) |
00110 { 00111 DISABLE_INTERRUPTS; 00112 user_data.control = rCTL; 00113 user_data.status = rCSR; 00114 ENABLE_INTERRUPTS; 00115 }
| void publishErr | ( | bit | errbit | ) |
00119 { 00120 DISABLE_INTERRUPTS; 00121 errbit = SET; 00122 user_data.error = rESR; 00123 ENABLE_INTERRUPTS; 00124 }
| void PublishVariable | ( | float xdata * | pvarDest, | |
| float | varSrce, | |||
| bit | errbit | |||
| ) |
00157 { 00158 DISABLE_INTERRUPTS; 00159 *pvarDest = varSrce; 00160 if (errbit) user_data.error = rESR; 00161 ENABLE_INTERRUPTS; 00162 }
| float read_voltage | ( | unsigned char | channel, | |
| unsigned int * | rvalue, | |||
| unsigned char | gain | |||
| ) |
00237 { 00238 unsigned int xdata i; 00239 float xdata voltage; 00240 unsigned int xdata rawbin; 00241 unsigned long xdata rawsum = 0; 00242 00243 // Averaging on 10 measurements for now. 00244 for (i=0 ; i<10 ; i++) { 00245 rawbin = adc_read(channel, gain); 00246 rawsum += rawbin; 00247 yield(); 00248 } 00249 00250 /* convert to V */ 00251 *rvalue = rawsum / 10; 00252 voltage = (float) *rvalue; // averaging 00253 voltage = (float) voltage / 1024.0 * VREF; // conversion 00254 if ( channel != TCHANNEL) 00255 voltage = voltage * coeff[channel] + offset[channel]; 00256 00257 return voltage; 00258 }
| void switchonoff | ( | unsigned char | command | ) |
00187 { 00188 if(command==ON) 00189 { 00190 // Turn ON card 00191 SFRPAGE = CONFIG_PAGE; 00192 P2MDOUT &= ~0x08; // V4_ENn(P2.3) OD 00193 V4_ENn = 0; // ON 00194 00195 rESR = 0x0000; // Reset error status at each Power UP 00196 rCSR = user_data.status; 00197 SPup = ON; // Set Status 00198 SsS = OFF; // Clear System Shutdown 00199 SmSd = OFF; // Clear Manual Shutdown 00200 00201 // Publish Status and Error 00202 DISABLE_INTERRUPTS; 00203 user_data.status = rCSR; 00204 user_data.error = rESR; 00205 ENABLE_INTERRUPTS; 00206 00207 // Setup CMB SPI ports 00208 P2MDOUT |= 0x20; // CMB_SPI_SCK (P2.5) PP 00209 P2MDOUT |= 0x40; // CMB_SPI_MOSI (P2.6) PP 00210 P2MDOUT &= ~0x80; // CMB_SPI_MISO (P2.7) OD 00211 P2MDOUT |= 0x02; // CMB_CS (P2.1) PP 00212 P2MDOUT |= 0x01; // CFG_RECOVER (P2.0) PP 00213 CMB_CSn = 1; 00214 00215 CMBSPI_Init(); 00216 00217 delay_ms(1000); 00218 CMB_SPI_WriteByte(CMBSPI_WADDRESS, ~pca_add); 00219 delay_us(100); 00220 user_data.eepage = CMB_SPI_ReadByte(CMBSPI_RADDRESS); 00221 delay_us(100); 00222 CMB_SPI_WriteByte(CMBSPI_WADDRESS, ~pca_add); 00223 delay_us(100); 00224 user_data.spare = CMB_SPI_ReadByte(CMBSPI_RADDRESS); 00225 00226 } else if(command==OFF) { 00227 // Switch all the ports to open drain except for... 00228 SFRPAGE = CONFIG_PAGE; 00229 P2MDOUT = 0; 00230 V4_ENn = 1; 00231 } 00232 }
| unsigned char user_func | ( | unsigned char * | data_in, | |
| unsigned char * | data_out | |||
| ) |
| void user_init | ( | unsigned char | init | ) |
00265 { 00266 char xdata i; 00267 00268 /* Format the SVN and store this code SVN revision into the system */ 00269 for (i=0;i<4;i++) { 00270 if (svn_rev_code[6+i] < 48) { 00271 svn_rev_code[6+i] = '0'; 00272 } 00273 } 00274 sys_info.svn_revision = (svn_rev_code[6]-'0')*1000+ 00275 (svn_rev_code[7]-'0')*100+ 00276 (svn_rev_code[8]-'0')*10+ 00277 (svn_rev_code[9]-'0'); 00278 00279 i = cur_sub_addr(); 00280 00281 if (init){ 00282 user_data.FPGATemp = 0; 00283 user_data.Vrg1Temp = 0; 00284 user_data.Vrg2Temp = 0; 00285 user_data.error = 0; 00286 user_data.SerialN = 0x0; 00287 sys_info.node_addr = cur_sub_addr(); 00288 } 00289 00290 user_data.control = 0; 00291 user_data.status = 0; 00292 user_data.error = 0; 00293 user_data.spare = 0; 00294 user_data.eepage = 0; 00295 00296 // Update local registers 00297 rCTL = user_data.control; 00298 rCSR = user_data.status; 00299 00300 // 00301 // Group setting 00302 sys_info.group_addr = 400; 00303 00304 bMeasuredOnce = 0; 00305 00306 //----------------------------------------------------------------------------- 00307 // Initial setting for communication and overall ports (if needed). 00308 SFRPAGE = CONFIG_PAGE; 00309 P0MDOUT |= 0x20; // add RS485_ENABLE(P0.5) in push-pull 00310 00311 //----------------------------------------------------------------------------- 00312 // uC Miscellaneous ADCs (V/I Monitoring) 00313 SFRPAGE = CONFIG_PAGE; 00314 // P3MDOUT |= 0x1C; //Setting the Regulators control pins to push pull (3 Vreg) 00315 adc_internal_init(); 00316 00317 #ifdef _ADT7486A_ 00318 //----------------------------------------------------------------------------- 00319 // SST Temperatures 00320 SFRPAGE = CONFIG_PAGE; 00321 P1MDOUT |= 0x01; // Setting the SST_DRV(P1.0) (SST) to push pull 00322 SFRPAGE = CPT1_PAGE; 00323 CPT1CN |= 0x80; // Enable the Comparator 1 00324 CPT1MD = 0x03; //Comparator1 Mode Selection 00325 //Use default, adequate TYP (CP1 Response Time, no edge triggered interrupt) 00326 00327 ADT7486A_Init(SST_LINE1); 00328 #endif 00329 00330 #ifdef _ExtEEPROM_ 00331 // 00332 //----------------------------------------------------------------------------- 00333 // EEPROM memory Initialization/Retrieval 00334 SFRPAGE = CONFIG_PAGE; 00335 P1MDOUT |= 0x80; // Setting the RAM_CSn(P1.7) to push pull 00336 P1MDOUT |= 0x06; // Setting the SPI_MOSI(P1.1) and SPI_SCK(P1.2) to push pull 00337 P1MDOUT &= ~0x20; // Setting the RAM_WPn(P1.5) to OD 00338 ExtEEPROM_Init(); 00339 00340 // Read only the serial number from the protected page 00341 ExtEEPROM_Read(SERIALN_ADD,(unsigned char xdata *)&eepage.SerialN, SERIALN_LENGTH); 00342 user_data.SerialN = eepage.SerialN; 00343 // 00344 // Read all other settings from page 0(non-protected) 00345 ExtEEPROM_Read(PageAddr[0], (unsigned char xdata *)&eepage, PAGE_SIZE); 00346 #endif 00347 00348 // Get Node Address from P3 port 00349 sys_info.node_addr = NodeAdd_get(); 00350 00351 //----------------------------------------------------------------------------- 00352 // Clock Selection P0.7 default to External Clock (LVDS) 00353 SFRPAGE = CONFIG_PAGE; 00354 P0MDOUT &= ~0x80; // CLK_SEL (P0.7) OD 00355 CLK_SEL = SXclk = ON; 00356 00357 //----------------------------------------------------------------------------- 00358 // Over Current Error bit 00359 SFRPAGE = CONFIG_PAGE; 00360 P2MDOUT &= ~0x10; // V4_OC(P2.4) OD for read 00361 00362 //----------------------------------------------------------------------------- 00363 // Configure Recovery 00364 P2MDOUT |= 0x01; // CFG_RECOVER(P2.0) PP for write 00365 00366 //----------------------------------------------------------------------------- 00367 // Power up the card for now 00368 switchonoff(OFF); 00369 00370 SmSd = OFF; // Set Manual Shutdown 00371 SPup = OFF; 00372 // Reset Action 00373 CmSd = CLEAR; // rCTL not yet published 00374 Cdeb1 = CLEAR; 00375 00376 // Publish Registers state 00377 DISABLE_INTERRUPTS; 00378 user_data.control = rCTL; 00379 user_data.status = rCSR; 00380 ENABLE_INTERRUPTS; 00381 }
| void user_loop | ( | void | ) |
00415 { 00416 00417 float xdata volt, temperature, *pfData; 00418 float* xdata eep_address; 00419 unsigned int xdata eeptemp_addr; 00420 unsigned char xdata *eeptemp_source; 00421 unsigned char xdata eep_request, fpgaStatus, AsumLock; 00422 static unsigned char xdata eeprom_flag = CLEAR; 00423 unsigned int *xdata rpfData; 00424 unsigned int xdata i, rvolt; 00425 00426 //----------------------------------------------------------------------------- 00427 // Get node Address after 1" of running time 00428 if (!NodeOK && uptime()) { 00429 sys_info.node_addr = NodeAdd_get(); 00430 NodeOK = 1; 00431 } 00432 00433 //----------------------------------------------------------------------------- 00434 // Power Up based on CTL bit 00435 if (CPup) { 00436 switchonoff(ON); 00437 delay_ms(100); 00438 // Force Check on Voltage 00439 bCPupdoitNOW = ON; 00440 // Reset Action 00441 CPup = CLEAR; // rCTL not updated yet, publish state after U/I check 00442 // Reset All error 00443 rESR = 0x0000; 00444 00445 } // Power Up 00446 00447 //----------------------------------------------------------------------------- 00448 // Set Manual Shutdown based on Index 00449 if (CmSd) { 00450 rCSR = user_data.status; 00451 SmSd = ON; // Set Manual Shutdown 00452 switchonoff(OFF); 00453 SPup = OFF; 00454 // Reset Action 00455 CmSd = CLEAR; // rCTL not yet published 00456 // Publish Registers state 00457 publishCtlCsr(); 00458 } // Manual Shutdown 00459 00460 //----------------------------------------------------------------------------- 00461 // Switch RJ45/Internal Clock source 00462 if (CXclk) { 00463 rCSR = user_data.status; 00464 if (SXclk) CLK_SEL = SXclk = 0; 00465 else CLK_SEL = SXclk = 1; 00466 CXclk = 0; // Reset command 00467 publishCtlCsr(); // Publish Clock selection 00468 } // Switch Clock 00469 00470 //----------------------------------------------------------------------------- 00471 // Config Pulse, FPGA code requires 4 consecutive pulses 00472 if (Ccfg) { 00473 for (i=0;i<4;i++) { 00474 CFG_RECOVER = 1; 00475 delay_us(1); 00476 CFG_RECOVER = 0; 00477 delay_us(1); 00478 } 00479 delay_us(10); 00480 Ccfg = 0; 00481 } // Configure_recovery 00482 00483 //----------------------------------------------------------------------------- 00484 // Debug1 Write/Read Address 00485 if (Cdeb1) { 00486 00487 // Write Crate address to the CMB register 00488 CMB_SPI_WriteByte(CMBSPI_WADDRESS, ~pca_add); 00489 00490 delay_us(105); 00491 00492 // Read Crate address from the CMB Register 00493 user_data.spare = CMB_SPI_ReadByte(CMBSPI_RADDRESS); 00494 Cdeb1 = 0; 00495 } // 00496 00497 #ifdef _ExtEEPROM_ 00498 //----------------------------------------------------------------------------- 00499 // Checking the eeprom control flag 00500 if (EEP_CTR_Flag) { 00501 //Checking for the special instruction 00502 if (user_data.eeCtrSet & EEP_CTRL_KEY) { 00503 // Valid index range 00504 if( (int)(user_data.eeCtrSet & 0x000000ff) >= EEP_RW_IDX) { 00505 // Float area from EEP_RW_IDX, count in Float size, No upper limit specified! 00506 eep_address = (float*)&eepage + (user_data.eeCtrSet & 0x000000ff); 00507 //Checking for the write request 00508 if (user_data.eeCtrSet & EEP_CTRL_WRITE){ 00509 *eep_address = user_data.eepValue; 00510 //Checking for the read request 00511 } else if (user_data.eeCtrSet & EEP_CTRL_READ) { 00512 DISABLE_INTERRUPTS; 00513 user_data.eepValue = *eep_address; 00514 ENABLE_INTERRUPTS; 00515 } else { 00516 // Tell the user that inappropriate task has been requested 00517 DISABLE_INTERRUPTS; 00518 user_data.eeCtrSet = EEP_CTRL_INVAL_REQ; 00519 ENABLE_INTERRUPTS; 00520 } 00521 } else { 00522 DISABLE_INTERRUPTS; 00523 user_data.eeCtrSet = EEP_CTRL_OFF_RANGE; 00524 ENABLE_INTERRUPTS; 00525 } 00526 } else { 00527 // Tell the user that invalid key has been provided 00528 DISABLE_INTERRUPTS; 00529 user_data.eeCtrSet = EEP_CTRL_INVAL_KEY; 00530 ENABLE_INTERRUPTS; 00531 } 00532 EEP_CTR_Flag = CLEAR; 00533 } // if eep 00534 00535 //----------------------------------------------------------------------------- 00536 // EEPROM Save procedure based on CTL bit 00537 if (CeeS) { 00538 //Check if we are here for the first time 00539 if (!eeprom_flag) { // first in 00540 rCSR = user_data.status; 00541 00542 //Temporary store the first address of page 00543 eeptemp_addr = PageAddr[(unsigned char)(user_data.eepage & 0x07)]; 00544 //Temporary store the first address of data which has to be written 00545 eeptemp_source = (unsigned char xdata *)&eepage; 00546 } 00547 00548 // EEPROM Write/Clear request 00549 if (CeeClr) eep_request = CLEAR_EEPROM; 00550 else eep_request = WRITE_EEPROM; 00551 00552 status = ExtEEPROM_Write_Clear (eeptemp_addr 00553 , &eeptemp_source 00554 , PAGE_SIZE 00555 , eep_request 00556 , &eeprom_flag); 00557 00558 if (status == DONE) { 00559 SeeS = DONE; 00560 eeprom_flag = CLEAR; 00561 //Set the active page 00562 user_data.eepage |= ((user_data.eepage & 0x07) << 5); 00563 } else { 00564 SeeS = FAILED; 00565 } 00566 00567 CeeS = CLEAR; 00568 // Publish Registers state 00569 publishCtlCsr(); 00570 } 00571 00572 //----------------------------------------------------------------------------- 00573 // EEPROM Restore procedure based on CTL bit 00574 if (CeeR) { 00575 rCSR = user_data.status; 00576 00577 //NW read to eepage(active page) instead of eepage2 00578 status = ExtEEPROM_Read (PageAddr[(unsigned char)(user_data.eepage & 0x07)] 00579 , (unsigned char xdata *)&eepage, PAGE_SIZE); 00580 00581 if (status == DONE) SeeR = DONE; 00582 else SeeR = FAILED; 00583 00584 CeeR = CLEAR; 00585 publishCtlCsr(); // Publish Registers state 00586 } 00587 #endif 00588 00589 //----------------------------------------------------------------------------- 00590 // Internal ADCs reading Voltages and Currents based on time 00591 if (bCPupdoitNOW || ((uptime() - tempTime) > TEMP_TIME)) { 00592 pfData = &(user_data.pDI4Mon); 00593 rpfData = &(user_data.rpDI4Mon); 00594 for (channel=0; channel<INTERNAL_N_CHN ; channel++) { 00595 volt = read_voltage(channel,&rvolt, IGAIN1); 00596 DISABLE_INTERRUPTS; 00597 pfData[channel] = volt; 00598 rpfData[channel]= rvolt; 00599 ENABLE_INTERRUPTS; 00600 } 00601 00602 // 00603 // Read uC temperature 00604 volt = read_voltage(TCHANNEL,&rvolt, IGAIN1); 00605 /* convert to deg. C */ 00606 temperature = 1000 * (volt - 0.776) / 2.86; // Needs calibration 00607 /* strip to 0.1 digits */ 00608 temperature = ((int) (temperature * 10 + 0.5)) / 10.0; 00609 if ((temperature < eepage.luCTlimit) || (temperature > eepage.uuCTlimit)) uCT = ON; // out of range 00610 PublishVariable(&(user_data.uCTemp), temperature, uCT); 00611 00612 // Update time 00613 tempTime = uptime(); 00614 bMeasuredOnce = 1; 00615 } 00616 00617 yield(); 00618 00619 //----------------------------------------------------------------------------- 00620 // SST temperature reading 00621 #ifdef _ADT7486A_ 00622 if (bCPupdoitNOW || ((uptime() - sstTime) > SST_TIME)) { 00623 // Vreg1 Temperature form the SST device location 00624 if(!ADT7486A_Cmd(ADT7486A_address, GetIntTemp, SST_LINE1, &temperature)) { 00625 if ((temperature < eepage.lSSTlimit) || (temperature > eepage.uSSTlimit)) Vreg1ssTT = ON; 00626 PublishVariable(&user_data.Vrg1Temp, temperature, Vreg1ssTT); 00627 } else publishErr(RdssT); 00628 00629 // 00630 // Vreg2 Reading and Monitoring of Temperature from the remote diode of the SST device 00631 if(!ADT7486A_Cmd(ADT7486A_address, GetExt1Temp, SST_LINE1, &temperature)) { 00632 if ((temperature < eepage.lSSTlimit) || (temperature > eepage.uSSTlimit)) Vreg2ssTT = ON; 00633 PublishVariable(&user_data.Vrg2Temp, temperature, Vreg2ssTT); 00634 } else publishErr(RdssT); 00635 00636 // 00637 // FGPA Reading and Monitoring of Temperature from the internal diode of the FPGA 00638 if(!ADT7486A_Cmd(ADT7486A_address, GetExt2Temp, SST_LINE1, &temperature)) { 00639 if ((temperature < eepage.luCTlimit) || (temperature > eepage.uuCTlimit)) FPGAssTT = ON; 00640 PublishVariable(&user_data.FPGATemp, temperature, FPGAssTT); 00641 } else publishErr(RdssT); 00642 00643 // Update time 00644 sstTime = uptime(); 00645 } 00646 #endif 00647 00648 //----------------------------------------------------------------------------- 00649 // Main Current and Voltage Monitoring 00650 if (bMeasuredOnce) { 00651 pfData = &(user_data.pDI4Mon); 00652 for (channel=0; channel<INTERNAL_N_CHN ; channel++) { 00653 if ((pfData[channel] < eepage.lVIlimit[channel]) 00654 || (pfData[channel] > eepage.uVIlimit[channel])) { 00655 rESR |= (1<<channel); // out of range 00656 } 00657 } 00658 } 00659 00660 // Read FPGA Status 00661 fpgaStatus = CMB_SPI_ReadByte(CMBSPI_RSTATUS); 00662 // Set Signal Loss link Status 00663 SLinkOn = (fpgaStatus & 0x01) ? 0 : 1; // Shows as 1 = Link ON 00664 // ASUM lock bits 00665 AsumLock = ((fpgaStatus>>4) == 0) ? 1 : 0; // Set ASUMLostLock error (unlock!) 00666 00667 // Read Over current switch 00668 V4_OC = (V4_OCn == 0) ? 1 : 0; 00669 00670 // Publish U/I monitoring, ASUM lock, Over Current errors 00671 // No action taken on ASUM lock and Over Current YET! See below. 00672 DISABLE_INTERRUPTS; 00673 user_data.error = rESR; 00674 ENABLE_INTERRUPTS; 00675 00676 // Take action based on ERROR 00677 // Currently only the Temperature are considered 00678 if (SPup && (rESR & ( UFTEMPERATURE_MASK | BTEMPERATURE_MASK))) { 00679 switchonoff(OFF); 00680 SPup = OFF; 00681 SsS = ON; 00682 } else if (bCPupdoitNOW) { 00683 bCPupdoitNOW = OFF; // Reset flag coming from PowerUp sequence 00684 SsS = SmSd = OFF; 00685 SPup = ON; 00686 } 00687 00688 // Publish Control, Error and Status. 00689 publishAll(); 00690 }
| 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 char bdata bChange |
| sbit bCPupdoitNOW = bChange ^ 0 |
| sbit bMeasuredOnce = bChange ^ 2 |
| sbit CFG_RECOVER = P2 ^ 0 |
| unsigned char xdata channel |
| unsigned char xdata channel |
| unsigned int xdata crate_add = 0 |
| sbit EEP_CTR_Flag = bChange ^ 1 |
| char code node_name[] = "cmb" |
| unsigned char xdata NodeOK = 0 |
| unsigned int xdata pca_add = 0 |
| unsigned long xdata sstTime = 0 |
| unsigned char xdata status |
| char idata svn_rev_code[] = "$Rev: 942 $" |
| unsigned long xdata tempTime = 0 |
| MSCB_INFO_VAR code vars[] |
1.4.7