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

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

#define VREF   3.293f


Function Documentation

void publishErr (  ) 

00139                   {
00140     DISABLE_INTERRUPTS;
00141     user_data.error   = rESR;
00142     ENABLE_INTERRUPTS;
00143 }

void PublishVariable ( float xdata *  pvarDest,
float  varSrce 
)

00147                                                             {
00148   DISABLE_INTERRUPTS;
00149   *pvarDest = varSrce;
00150   ENABLE_INTERRUPTS;
00151 }

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 
)

00251 {
00252   /* echo input data */
00253   data_out[0] = data_in[0];
00254   data_out[1] = data_in[1];
00255   return 2;
00256 }

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  ) 

00243 {
00244   if(index);
00245 
00246   return 0;
00247 }

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 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 ON1 = P0 ^ 6

sbit ON2 = P0 ^ 7

sbit ON3 = P0 ^ 1

sbit ON4 = P0 ^ 2

sbit ON5 = P3 ^ 1

sbit ON6 = P0 ^ 0

sbit SHDWN = P3 ^ 3

sbit SST = MSCB_SST1

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

SYS_INFO sys_info

MSCB_INFO_VAR* variables = vars

MSCB_INFO_VAR code vars[]


Generated on 10 Jun 2013 for FGDC8051 by  doxygen 1.4.7