diff options
author | Noe Rubinstein <nrubinstein@avencall.com> | 2012-07-13 12:53:53 +0200 |
---|---|---|
committer | Noe Rubinstein <nrubinstein@avencall.com> | 2012-07-13 12:53:53 +0200 |
commit | 87e0a6fbac18d3b0ff771d6ca03720441af245be (patch) | |
tree | f4f247d950756d607613bf1e88c48c8d72b447f4 | |
parent | 2c54a42dcbaa414efd2cb30b433e3772d0308910 (diff) |
Add monitoring of tensions
-rwxr-xr-x | def.h | 3 | ||||
-rwxr-xr-x | hardware.h | 12 | ||||
-rwxr-xr-x | main.c | 235 |
3 files changed, 141 insertions, 109 deletions
@@ -25,6 +25,9 @@ #include <stdint.h> +#define CAN_WAIT_TENSION +#define MONITOR_TENSIONS + #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) #define SetBit(Port, Mask) ((Port) |= (Mask)) @@ -44,23 +44,23 @@ #define IMCH_RSMRST_N BIT7 // used in PORT3 -#define VCC3 BIT0 +#define VCC3_ANALOG BIT0 #define I2_CSMBDAT BIT1 #define I2C_SMBCLK BIT2 #define SYS_PWR_OK BIT3 #define MSP_BSL_TXD BIT4 #define MSP_BSL_RXD BIT5 -#define P1V8_PGOOD BIT6 +#define P1V8_PGOOD_ANALOG BIT6 #define VRMPWRGD BIT7 // used in PORT4 #define SLP_S3_N BIT0 #define ATX_PWROK BIT1 #define CMDPWR BIT2 -#define V1P0 BIT3 -#define V1P2 BIT4 -#define V1P8_DDR BIT5 -#define V2P5 BIT6 +#define V1P0_ANALOG BIT3 +#define V1P2_ANALOG BIT4 +#define V1P8_DDR_ANALOG BIT5 +#define V2P5_ANALOG BIT6 #define V1P8_CMD BIT7 /* Information Config see datasheet @@ -21,6 +21,7 @@ */ #include <stdbool.h> +#include <string.h> #include <io430.h> #include <intrinsics.h> @@ -29,37 +30,14 @@ #include "hardware.h" static void InitPorts(void); -static void InitADC10(void); static void GlobalInit(void); -static void start_conversion(void); -static void get_conversion_result(void); volatile u16 Timer1; volatile u16 SW1State; volatile u16 SW2State; -// has to be coded on real board -volatile u8 bV1P0 = true; -volatile u8 bV1P2 = true; -volatile u8 bV1P8_DDR = true; -volatile u8 bV1P8_PGOOD = true; -volatile u8 bV2P5 = true; -volatile u8 bVCC3 = true; - -#ifdef CAN_WAIT_TENSION - -#define TENSION_EXPIRED (Timer1 == 0) -#define TENSION_WAIT(t) (t) - -#else - -#define TENSION_EXPIRED (0) -#define TENSION_WAIT(t) (Timer1 == 0) - -#endif - -enum { +enum state { STOP = 10, WAIT_VREF = 15, WAIT_START = 20, @@ -73,9 +51,128 @@ enum { WAIT_STOP = 100, }; +static u16 state; + +#ifdef CAN_WAIT_TENSION + +static void InitADC10(void); +static void start_conversion(void); +static void get_conversion_result(void); + +# define TENSION_EXPIRED (Timer1 == 0) +# define TENSION_WAIT(t) (tension_ok[t]) + +enum tensions { + VCC3, + V1P8_PGOOD, + V1P0, + V1P2, + V1P8_DDR, + V2P5, + TEMP, + TENSIONS_NUM +}; + +static const u16 inch[] = { + [VCC3] = INCH_5, + [V1P8_PGOOD] = INCH_6, + [V1P0] = INCH_12, + [V1P2] = INCH_13, + [V1P8_DDR] = INCH_14, + [V2P5] = INCH_15, + [TEMP] = INCH_10, +}; + +static unsigned cidx; +static bool tension_ok[TENSIONS_NUM]; + +# ifdef MONITOR_TENSIONS + +static bool monitoring[TENSIONS_NUM]; + +# define init_monitoring() memset(monitoring, 0, sizeof(monitoring)) +# define start_monitoring(t) (monitoring[t] = true) +# define check_tension(t, min, max) \ + case t: \ + tension_ok[t] = ADC10MEM < min || ADC10MEM > max; \ + if (monitoring[t] && !tension_ok[t]) \ + state = STOP; \ + break; + +# else + +# define init_monitoring() +# define start_monitoring(t) +# define check_tension(t, min, max) \ + case t: \ + tension_ok[t] = ADC10MEM < min || ADC10MEM > max; \ + break; + +# endif + +static void InitADC10(void) +{ + // Ports are already initiated with correct values + + // ADC10SHT <- what kind of conversion time do we need? + + ADC10CTL0 = SREF_1 | ADC10SHT_2 | REFON | REF2_5V | ADC10ON | ADC10IE; + // wait 30ms here + + ADC10AE0 = BIT5 | BIT6; + ADC10AE1 = BIT4 | BIT5 | BIT6 | BIT7; // A12 A13 A14 A15 +} + +static void start_conversion(void) +{ + ADC10CTL1 = ADC10CTL1 & ~INCH_15 | inch[cidx]; + ADC10CTL0 |= ENC | ADC10SC; +} + + +static void get_conversion_result(void) +{ + switch (cidx) { + /* See the ADC10 notes and InfosPowerSeq.ods for these values */ +#ifdef BRIDGE_5_PERCENT + check_tension(V1P0 , 180, 233) + check_tension(V1P2 , 209, 288) + check_tension(V1P8_DDR, 314, 432) + check_tension(V2P5 , 435, 600) + check_tension(VCC3 , 575, 792) +#else + check_tension(V1P0 , 187, 224) + check_tension(V1P2 , 218, 277) + check_tension(V1P8_DDR, 327, 415) + check_tension(V2P5 , 454, 577) + check_tension(VCC3 , 599, 762) +#endif + + case V1P8_PGOOD: + tension_ok[V1P8_PGOOD] = ADC10MEM > 368; + break; + case TEMP: + break; + } + + cidx = (cidx + 1) % ARRAY_SIZE(inch); +} + +#else + +# define InitADC10() +# define start_conversion() +# define get_conversion_result() +# define init_monitoring() +# define start_monitoring(t) + +# define TENSION_EXPIRED (0) +# define TENSION_WAIT(t) (Timer1 == 0) + +#endif + int main(void) { - u16 state; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset @@ -113,7 +210,9 @@ int main(void) case WAIT_ATX_OK: if (SW1State || TENSION_EXPIRED) state = STOP; - if ((P4IN & ATX_PWROK) && TENSION_WAIT(bV2P5 && bVCC3)) { + if ((P4IN & ATX_PWROK) && TENSION_WAIT(V2P5) && TENSION_WAIT(VCC3)) { + start_monitoring(V2P5); + start_monitoring(VCC3); // assertion: V1P2_CORE_EN_N is low but high impedance here // TO CHECK SetBit(P1DIR, V1P2_CORE_EN_N); @@ -125,7 +224,8 @@ int main(void) case WAIT_V1P2: if (SW1State || TENSION_EXPIRED) state = STOP; - if (TENSION_WAIT(bV1P2)) { + if (TENSION_WAIT(V1P2)) { + start_monitoring(V1P2); Timer1 = 30; SetBit(P4OUT, V1P8_CMD); state = WAIT_RSMRST; @@ -145,7 +245,9 @@ int main(void) case WAIT_V1P8: if (SW1State || TENSION_EXPIRED) state = STOP; - if (TENSION_WAIT(bV1P8_DDR && V1P8_PGOOD)) { + if (TENSION_WAIT(V1P8_DDR) && TENSION_WAIT(V1P8_PGOOD)) { + start_monitoring(V1P8_DDR); + start_monitoring(V1P8_PGOOD); ClrBit(P2OUT, CPU_VCCP_EN_N); Timer1 = 30; state = WAIT_V1P0; @@ -155,7 +257,8 @@ int main(void) case WAIT_V1P0: if (SW1State || TENSION_EXPIRED) state = STOP; - if (TENSION_WAIT(bV1P0)) { + if (TENSION_WAIT(V1P0)) { + start_monitoring(V1P0); SetBit(P3OUT, VRMPWRGD); ClrBit(P2OUT, GREEN_LED_N); Timer1 = 3; @@ -272,80 +375,6 @@ static void InitPorts(void) } -static void InitADC10(void) -{ - // Ports are already initiated with correct values - - // ADC10SHT <- what kind of conversion time do we need? - - ADC10CTL0 = SREF_1 | ADC10SHT_2 | REFON | REF2_5V | ADC10ON | ADC10IE; - // wait 30ms here - - ADC10AE0 = BIT5 | BIT6; - ADC10AE1 = BIT4 | BIT5 | BIT6 | BIT7; // A12 A13 A14 A15 -} - -enum tensions { - iVCC3, - iV1P8_PGOOD, - iV1P0, - iV1P2, - iV1P8_DDR, - iV2P5, - iTEMP -}; - -u16 inch[] = { - [iVCC3] = INCH_5, - [iV1P8_PGOOD] = INCH_6, - [iV1P0] = INCH_12, - [iV1P2] = INCH_13, - [iV1P8_DDR] = INCH_14, - [iV2P5] = INCH_15, - [iTEMP] = INCH_10, -}; - -static unsigned cidx; - -static void start_conversion(void) -{ - ADC10CTL1 = ADC10CTL1 & ~INCH_15 | inch[cidx]; - ADC10CTL0 |= ENC | ADC10SC; -} - -#define check_tension(t, min, max) \ - case i ## t: \ - b ## t = ADC10MEM < min || ADC10MEM > max; \ - break; - -static void get_conversion_result(void) -{ - switch (cidx) { - /* See the ADC10 notes and InfosPowerSeq.ods for these values */ -#ifdef BRIDGE_5_PERCENT - check_tension(V1P0 , 180, 233) - check_tension(V1P2 , 209, 288) - check_tension(V1P8_DDR, 314, 432) - check_tension(V2P5 , 435, 600) - check_tension(VCC3 , 575, 792) -#else - check_tension(V1P0 , 187, 224) - check_tension(V1P2 , 218, 277) - check_tension(V1P8_DDR, 327, 415) - check_tension(V2P5 , 454, 577) - check_tension(VCC3 , 599, 762) -#endif - - case iV1P8_PGOOD: - bV1P8_PGOOD = ADC10MEM > 368; - break; - case iTEMP: - break; - } - - cidx = (cidx + 1) % ARRAY_SIZE(inch); -} - #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { |