summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoe Rubinstein <nrubinstein@avencall.com>2012-07-13 12:53:53 +0200
committerNoe Rubinstein <nrubinstein@avencall.com>2012-07-13 12:53:53 +0200
commit87e0a6fbac18d3b0ff771d6ca03720441af245be (patch)
treef4f247d950756d607613bf1e88c48c8d72b447f4
parent2c54a42dcbaa414efd2cb30b433e3772d0308910 (diff)
Add monitoring of tensions
-rwxr-xr-xdef.h3
-rwxr-xr-xhardware.h12
-rwxr-xr-xmain.c235
3 files changed, 141 insertions, 109 deletions
diff --git a/def.h b/def.h
index 51c572d..cb007f5 100755
--- a/def.h
+++ b/def.h
@@ -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))
diff --git a/hardware.h b/hardware.h
index 56b8782..33d4855 100755
--- a/hardware.h
+++ b/hardware.h
@@ -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
diff --git a/main.c b/main.c
index 2040036..fe88510 100755
--- a/main.c
+++ b/main.c
@@ -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)
{