#include <stdio.h>#include <stdlib.h>#include <string.h>#include "mscbemb.h"#include "powerswitch.h"#include "Devices/adc_internal.h"Defines | |
| #define | VREF 3.293f |
Functions | |
| void | user_write (unsigned char index) reentrant |
| float | read_voltage (unsigned char channel, float coeff, float offset) |
| void | publishErr () |
| void | PublishVariable (float xdata *pvarDest, float varSrce) |
| 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 | |
| char code | node_name [] = "PWRSWITCH" |
| char idata | svn_rev_code [] = "$Rev: 743 $" |
| unsigned char idata | _n_sub_addr = 1 |
| SYS_INFO | sys_info |
| unsigned char xdata | ADT7486A_addrArray [] = {0x48, 0x49, 0x4A} |
| MSCB_INFO_VAR code | vars [] |
| MSCB_INFO_VAR * | variables = vars |
| sbit | LED_RED = LED_0 |
| sbit | SST = MSCB_SST1 |
| sbit | ON6 = P0 ^ 0 |
| sbit | ON3 = P0 ^ 1 |
| sbit | ON4 = P0 ^ 2 |
| sbit | ON5 = P3 ^ 1 |
| sbit | ON1 = P0 ^ 6 |
| sbit | ON2 = P0 ^ 7 |
| sbit | SHDWN = P3 ^ 3 |
| unsigned char code | adc_index [] = {0xc, 0xd, 0x14, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb} |
| float code | coeff [] = {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 5.00, 5.00, 5.00, 5.00, 5.00, 5.00} |
| float code | offset [] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0} |
| #define VREF 3.293f |
| void publishErr | ( | ) |
| void PublishVariable | ( | float xdata * | pvarDest, | |
| float | varSrce | |||
| ) |
| float read_voltage | ( | unsigned char | channel, | |
| float | coeff, | |||
| float | offset | |||
| ) |
00261 { 00262 unsigned int xdata i, rvalue; 00263 float xdata voltage; 00264 unsigned int xdata rawbin; 00265 unsigned long xdata rawsum = 0; 00266 00267 // Averaging on 10 measurements for now. 00268 for (i=0 ; i<10 ; i++) { 00269 rawbin = adc_read(channel, 1); 00270 rawsum += rawbin; 00271 yield(); 00272 } 00273 00274 /* convert to V */ 00275 rvalue = rawsum/10; 00276 voltage = (float) rvalue; // averaging 00277 voltage = (float) voltage / 1024.0 * VREF; // conversion 00278 if ( channel != TCHANNEL) 00279 voltage = voltage * coeff + offset; 00280 00281 return voltage; 00282 }
| unsigned char user_func | ( | unsigned char * | data_in, | |
| unsigned char * | data_out | |||
| ) |
| void user_init | ( | unsigned char | init | ) |
00156 { 00157 idata char i; 00158 00159 /* Format the SVN and store this code SVN revision into the system */ 00160 for (i=0;i<4;i++) { 00161 if (svn_rev_code[6+i] < 48) { 00162 svn_rev_code[6+i] = '0'; 00163 } 00164 } 00165 sys_info.svn_revision = (svn_rev_code[6]-'0')*1000+ 00166 (svn_rev_code[7]-'0')*100+ 00167 (svn_rev_code[8]-'0')*10+ 00168 (svn_rev_code[9]-'0'); 00169 00170 if (init) { 00171 user_data.error = 0; 00172 user_data.control = 0; 00173 user_data.status = 0; 00174 sys_info.node_addr = cur_sub_addr(); 00175 for (i=0;i<6;i++) 00176 user_data.limit[i] = 50.0; 00177 } 00178 00179 // 0: open-drain, 1: push-pull 00180 P0MDOUT = 0xFF; // P0 .4/Tx Rx? 00181 // 0: Analog, 1: digital 00182 // Configure port as Analog input port 00183 P1MDIN = 0x00; // Analog 00184 P2MDIN = 0xC0; // SST_IO/REF digital, rest analog 00185 P3MDIN = 0x0F; // Set P3.4 to analog, rest digital 00186 P3MDOUT = 0x06; // Fault(od) SST_DRV(pp) ON5(pp) LED2(pp) 00187 00188 // Setting the cross bar 00189 // XBR1 |=0x40; // Enable XBAR 00190 // P0SKIP = 0x0f; //Skipping P0.0 (VREF), P0.1 P0.2, P0.3 (TX_EN) 00191 00192 // Comparator 1 Settings as P2.6, P2.7 are using in this case 00193 CPT1CN = 0x80; //Enable Comparator1 (functional, the one above is only for CrossBar) 00194 CPT1MX = 0x33; //Comparator1 MUX selection 00195 // (P2 ^ 6 is the SST1_IO, so we want to compare SST1 with the threshold voltage 00196 //Use default, adequate TYP (CP1 Response Time, no edge triggered interrupt) 00197 // of !~0.8V on SST_REF (P2 ^ 7) 00198 CPT1MD = 0x02; //Comparator1 Mode Selection 00199 00200 // VREF selection 00201 // REF0CN = 0xA; 00202 00203 // Init internal ADC 00204 adc_internal_init(); 00205 00206 #ifdef _ADT7486A_ 00207 ADT7486A_Init(SST_LINE1); //Temperature measurements related initialization 00208 #endif 00209 00210 // Initialize variables 00211 for (i=0;i<N_POWER_CHANNELS;i++) 00212 user_data.value[i] = 0; 00213 for (i=0;i<6;i++) 00214 user_data.temperature[i] = 0.0; 00215 for (i=0;i<3;i++) 00216 user_data.temperature[i] = 0.0; 00217 00218 user_data.control = 0; 00219 user_data.status = 0; 00220 user_data.error = 0; 00221 }
| void user_loop | ( | void | ) |
00304 { 00305 unsigned i, j, channel; 00306 float xdata value[15], temperature; 00307 00308 #ifdef _ADT7486A_ 00309 // External Temperature reading 00310 RdssT = CLEAR; 00311 for (i=0 , j=0 ; j<3 ; i+=2, j++) { 00312 if (!ADT7486A_Cmd(ADT7486A_addrArray[j], GetExt1Temp, SST_LINE1, &temperature)) { 00313 if (temperature > user_data.limit[j]) rESR |= (1<<(i+2)); 00314 else rESR &= ~(1<<(i+2)); 00315 PublishVariable(&user_data.temperature[i+0], temperature); 00316 } else RdssT = SET; 00317 00318 if (!ADT7486A_Cmd(ADT7486A_addrArray[j], GetExt2Temp, SST_LINE1, &temperature)) { 00319 if (temperature > user_data.limit[j]) rESR |= (1<<(i+2)); 00320 else rESR &= ~(1<<(i+2)); 00321 PublishVariable(&user_data.temperature[i+1], temperature); 00322 } else RdssT = SET; 00323 } 00324 #endif 00325 00326 #ifdef _ADT7486A_ 00327 // Internal Temperature reading 00328 for (i=0;i<3;i++) { 00329 if (!ADT7486A_Cmd(ADT7486A_addrArray[i], GetIntTemp, SST_LINE1, &temperature)) { 00330 PublishVariable(&user_data.localtemp[i], temperature); 00331 } else RdssT = SET; 00332 } 00333 #endif 00334 00335 // Read All ADCs 00336 for (channel=0 ; channel<N_POWER_CHANNELS ; channel++) { 00337 value[channel] = read_voltage(adc_index[channel], coeff[channel], offset[channel]); 00338 } 00339 // Publish data 00340 DISABLE_INTERRUPTS; 00341 for (channel=0 ; channel<=N_POWER_CHANNELS ; channel++) { 00342 user_data.value[channel] = value[channel]; 00343 } 00344 ENABLE_INTERRUPTS; 00345 00346 // Report hardware shutdown 00347 rESR |= !SHDWN; 00348 00349 // Publish globally the SST error 00350 publishErr(); 00351 00352 // Shutdown board if any of the temperature is too high 00353 // NO Condition on FAULTn YET! 00354 if (rESR) { 00355 ON1 = ON2 = ON3 = ON4 = ON5 = ON6 = 1; 00356 DISABLE_INTERRUPTS; 00357 user_data.status = 0; 00358 ENABLE_INTERRUPTS; 00359 } 00360 delay_ms(500); 00361 }
| 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 char code adc_index[] = {0xc, 0xd, 0x14, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb} |
| unsigned char xdata ADT7486A_addrArray[] = {0x48, 0x49, 0x4A} |
| float code coeff[] = {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 5.00, 5.00, 5.00, 5.00, 5.00, 5.00} |
| sbit LED_RED = LED_0 |
| char code node_name[] = "PWRSWITCH" |
| float code offset[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0} |
| sbit SST = MSCB_SST1 |
| char idata svn_rev_code[] = "$Rev: 743 $" |
| MSCB_INFO_VAR code vars[] |
1.4.7