]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
eb_pwr: New version of power management.
authorMichal Vokac <vokac.m@gmail.com>
Thu, 13 Oct 2011 14:19:00 +0000 (15:19 +0100)
committerMichal Vokac <vokac.m@gmail.com>
Fri, 14 Oct 2011 10:33:37 +0000 (12:33 +0200)
- time measurement using global variable with time
Now time is measured in the same manner as in the other modules (ie. eb_vidle atc).
The code is more clear ant later improvements are easier.

- I have moved all the definitions to header files, add def.h file.
This improves clarity and readability.

- Now 5V and 3.3V power supply is switched off only when battery is in critical state.
Prevents cyclic on/off switching of all the boards in the robot.

Still this algorithm needs improvements, but now CAN communication is more reliable.

src/common/can_msg_def.h
src/eb_pwr/Makefile.omk
src/eb_pwr/def.h [new file with mode: 0644]
src/eb_pwr/main.c
src/eb_pwr/pwrstep.c
src/eb_pwr/pwrstep.h

index f6d41bf7e96c6009c261e17b7a537143dd06a4e6..59cb0a3a72665e19f6db873ba0f595d98989cf55 100644 (file)
@@ -1,3 +1,5 @@
+#ifndef CANMSGDEFH
+#define CANMSGDEFH
 
 //flags sent in CAN_LIFT_STATUS message  
 #define CAN_LIFT_INITIALIZING   1
 #define CAN_BUMPER_LEFT_ACROSS          16
 #define CAN_BUMPER_RIGHT_ACROSS         32
 
+/* power */
+#define CAN_PWR_ALERT_33        0x01
+#define CAN_PWR_ALERT_50        0x02
+#define CAN_PWR_ALERT_80        0x04
+#define CAN_PWR_BATT_FULL       0x08
+#define CAN_PWR_BATT_MEAN       0x10
+#define CAN_PWR_BATT_LOW        0x20
+#define CAN_PWR_BATT_CRITICAL   0x40
+
+#endif
index e5e2fad20010c01ab50280844c1242023f820443..b197d51455a1789d260040c6d171fccfa48c8ba3 100644 (file)
@@ -6,4 +6,4 @@ eb_pwr_SOURCES = pwrstep.c uart.c main.c
 
 eb_pwr_LIBS = can
 
-#link_VARIANTS = flash
+link_VARIANTS = flash
diff --git a/src/eb_pwr/def.h b/src/eb_pwr/def.h
new file mode 100644 (file)
index 0000000..fc24dc0
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef DEFH
+#define DEFH
+
+#define CAN_SPEED       1000000
+
+#define CAN_ISR         0
+#define ADC_ISR         1
+#define TIME_ISR        2
+
+#define TIMER_IRQ_PRIORITY      5
+
+#define CAN_REPORT_TIME 500
+#define CAN_ALERT_TIME  200
+#define CAN_TIMEOUT_TIME 20
+
+#define BAT_CNT         10
+#define BAT_STAT_MEAN           120000
+#define BAT_STAT_LOW            110000
+#define BAT_STAT_CRITICAL       105000
+
+#define V33_MIN         30000
+#define V33_MAX         40000
+#define V50_MIN         45000
+#define V50_MAX         55000
+#define V80_MIN         75000
+#define V80_MAX         100000
+
+extern volatile uint32_t timer_msec;
+extern volatile uint32_t timer_usec;  /* incremented by 10us @100kHz */
+
+#endif
\ No newline at end of file
index 834caddf5ddc10119fd7c7bdecfb7a981cdfb85b..6a95901880a317f4014d31a63d97a402845a2fa6 100644 (file)
@@ -4,7 +4,7 @@
 //
 // Description
 // -----------
-// This software controls the eurobot powerboard 
+// This software controls the eurobot powerboard
 // Author : Jiri Kubias DCE CVUT
 //
 //
 #include <system_def.h>
 #include <periph/can.h>
 #include <can_ids.h>
-
+#include <can_msg_def.h>
 
 #include "pwrstep.h"
 #include "uart.h"
+#include "def.h"
 
-#define CAN_SPEED      1000000
-
-#define CAN_ISR                0
-#define ADC_ISR                1
-#define TIME_ISR       2
-
-
-#define TIME1MS        ((CPU_APB_HZ) / 1000)
-
-
-#define CAN_TRY                20
-
-enum {
-  ALERT_LOW = 1,
-  ALERT_MAIN,
-  ALERT_BYE,
-  ALERT_33V,
-  ALERT_50V,
-  ALERT_80V
-} alert_states;
-
-
-
-#define TIME_COUNT     4
-#define LEDG_TIME      500
-#define CAN_REPORT_TIME 500
-#define CAN_ALERT_TIME         200
-#define CAN_TIMEOUT_TIME 50
-enum {
-  TIM_CAN_REPORT = 0,
-  TIM_CAN_ALERT,
-  TIM_LEDG,
-  TIM_CAN_TIMEOUT
-}time;
-
-
-
-#define BAT_CNT                10
-#define        BAT_STAT_LOW    120000
-#define BAT_STAT_MAIN  110000
-#define BAT_STAT_BYE   105000
+can_msg_t msg;
 
-#define V33_MIN                30000
-#define V50_MIN                45000
-#define V80_MIN                75000
+struct power power_state;
 
-#define CAN_TIMEOUT    10
+volatile uint32_t timer_msec = 0, timer_usec = 0;
 
+void set_irq_handler(uint8_t source, uint8_t irq_vect, void (*handler)())
+{
+        /* set interrupt vector */
+        ((uint32_t*)&VICVectAddr0)[irq_vect] = (uint32_t)handler;
+        ((uint32_t*)&VICVectCntl0)[irq_vect] = 0x20 | source;
+        /* enable interrupt */
+        VICIntEnable = 1<<source;
+}
 
+void timer0_irq() __attribute__((interrupt));
+void timer0_irq()
+{
+        static unsigned cnt1khz = 0;
 
+        /* reset timer irq */
+        T0IR = -1;
 
-//#define TEST
+        /* increment timer_usec */
+        timer_usec += 10;
+        /* increment msec @1kHz */
+        if (++cnt1khz == 100) {
+                cnt1khz = 0;
+                ++timer_msec;
+        }
 
-can_msg_t msg;
+        /* int acknowledge */
+        VICVectAddr = 0;
+}
 
-volatile uint32_t dev_time[TIME_COUNT];
+void init_timer0(uint32_t prescale, uint32_t period)
+{
+        T0TCR = 0x2; /* reset */
+        T0PR = prescale - 1;
+        T0MR0 = period;
+        T0MCR = 0x3; /* match0: reset & irq */
+        T0EMR = 0; /* no ext. match */
+        T0CCR = 0x0; /* no capture */
+        T0TCR = 0x1; /* go! */
+}
 
-unsigned int cnt_12V;
-unsigned int cnt_10V;
+void can_rx(can_msg_t *msg) {
+        can_msg_t rx_msg;
+
+        memcpy(&rx_msg, msg, sizeof(can_msg_t));
+
+        if (rx_msg.id == CAN_PWR) {
+                /* set 3.3V power line */
+                if ((rx_msg.data[0] & (1<<0)) && !(rx_msg.data[0] & (1<<3))) {
+                        pwr_33(PWR_ON, &power_state);
+                        power_state.can_33v_req = PWR_ON;
+                } else if (rx_msg.data[0] & (1<<3)) {
+                        pwr_33(PWR_OFF, &power_state);
+                        power_state.can_33v_req = PWR_OFF;
+                }
+                /* set 5.0V power line */
+                if ((rx_msg.data[0] & (1<<1)) && !(rx_msg.data[0] & (1<<4))) {
+                        pwr_50(PWR_ON, &power_state);
+                        power_state.can_50v_req = PWR_ON;
+                } else if (rx_msg.data[0] & (1<<4)) {
+                        pwr_50(PWR_OFF, &power_state);
+                        power_state.can_50v_req = PWR_OFF;
+                }
+                /* set 8.0V power line */
+                if ((rx_msg.data[0] & (1<<2)) && !(rx_msg.data[0] & (1<<5))) {
+                        pwr_80(PWR_ON, &power_state);
+                        power_state.can_80v_req = PWR_ON;
+                } else if(rx_msg.data[0] & (1<<5)) {
+                        pwr_80(PWR_OFF, &power_state);
+                        power_state.can_80v_req = PWR_OFF;
+                }
+        }
+}
 
+void init_perip(struct power *pwr)      // inicializace periferii mikroprocesoru
+{
+        can_init_baudrate(CAN_SPEED, CAN_ISR, can_rx);
+        init_uart0((int)9600 ,UART_BITS_8, UART_STOP_BIT_1, UART_PARIT_OFF, 0 );
+        init_adc(ADC_ISR);
+        init_pwr(pwr);
+        init_timer0(1, CPU_APB_HZ/100000);
+        set_irq_handler(4 /*timer0*/, TIMER_IRQ_PRIORITY, timer0_irq);
+
+        pwr_80(PWR_ON, pwr);
+        pwr_50(PWR_ON, pwr);
+}
 
-void led_blik()
+void blink_led()
 {
-       
-       if (dev_time[TIM_LEDG] == 0)
-       {
-               deb_led_change(LEDG);
-               dev_time[TIM_LEDG] = LEDG_TIME;
-       }
+        static uint32_t led_time = 0;
 
+        if(timer_msec >= led_time + 500) {
+                led_time = timer_msec;
+                deb_led_change(LEDG);
+        }
 }
 
-void send_alert(unsigned char type )
+void send_alert(unsigned char alert)
 {
-       
-       
        msg.id = CAN_PWR_ALERT;
        msg.flags = 0;
        msg.dlc = 1;
-       msg.data[0] = type;
-       
-       dev_time[TIM_CAN_TIMEOUT] = CAN_TIMEOUT_TIME;
-       while(can_tx_msg(&msg) && (dev_time[TIM_CAN_TIMEOUT] != 0));
-                       
+       msg.data[0] = alert;
+
+       can_tx_msg(&msg);
 }
 
-void power_alert()
+void power_lines_check(struct power *pwr)
 {
-       if (dev_time[TIM_CAN_ALERT] == 0)
-       {
-               
-               if (adc_val[0] < BAT_STAT_BYE)          // bat < 9,5V
-               {
-                       deb_led_on(LEDR);
-                       send_alert(ALERT_BYE);
-                       pwr_50(PWR_OFF);
-                       //pwr_80(PWR_OFF);      
-                       pwr_33(PWR_OFF);
-                       
-
-               }
-               else if (adc_val[0] < BAT_STAT_MAIN)            // bat < 12V
-               {
-                       deb_led_on(LEDB);
-                       ++cnt_10V;
-                       if (cnt_10V > BAT_CNT)
-                       {
-                               send_alert(ALERT_MAIN);
-                               pwr_50(PWR_OFF);
-                               //pwr_80(PWR_OFF);      
-                       }
-                       
-
-               }       
-               else if (adc_val[0] < BAT_STAT_LOW)             // bat < 12V
-               {
-                       deb_led_on(LEDY);
-                       ++cnt_12V;
-                       if (cnt_12V > BAT_CNT)
-                               send_alert(ALERT_LOW);  
-               }
-               else 
-                       deb_led_off(LEDY);
-               
-               if (cnt_10V < BAT_CNT)
-               {
-                       if (adc_val[3] < V80_MIN)
-                       {
-                               send_alert(ALERT_80V);  
-                       }
-                       
-                       if (adc_val[2] < V50_MIN)
-                       {
-                               send_alert(ALERT_50V);  
-                       }
-                       
-                       if (adc_val[1] < V33_MIN)
-                       {
-                               send_alert(ALERT_33V);  
-                       }
-               }
-               dev_time[TIM_CAN_ALERT] = CAN_ALERT_TIME;
+        static uint32_t power_time = 0;
+        static unsigned char cnt_33V = 0, cnt_50V = 0, cnt_80V = 0;
+
+        //TODO dodelat kontrolu napajecich vetvi tak aby se merilo cca 10x po sobe a pak vyhodnotila situace
+       if (timer_msec >= power_time + CAN_ALERT_TIME) {
+                if ((V80_CH < V80_MIN || V80_CH > V80_MAX) && (pwr->pwr_80v_state == PWR_ON)) {
+                        if (++cnt_80V > 20) {
+                                pwr->alert |= CAN_PWR_ALERT_80;
+                                send_alert(pwr->alert);
+                                //pwr_80(PWR_OFF, pwr);
+                        }
+                }
+
+                if ((V50_CH < V50_MIN || V50_CH > V50_MAX) && (pwr->pwr_50v_state == PWR_ON)) {
+                        if (++cnt_50V > 20) {
+                                pwr->alert |= CAN_PWR_ALERT_50;
+                                send_alert(pwr->alert);
+                                pwr_50(PWR_OFF, pwr);
+                        }
+                }
+
+                if ((V33_CH < V33_MIN || V33_CH > V33_MAX) && (pwr->pwr_33v_state == PWR_ON)) {
+                        if (++cnt_33V > 10) {
+                                pwr->alert |= CAN_PWR_ALERT_33;
+                                send_alert(pwr->alert);
+                                pwr_33(PWR_OFF, pwr);
+                        }
+                }
+
+               power_time = timer_msec;
        }
 }
 
-void send_can()
+void battery_check(struct power *pwr)
+{
+        static uint32_t battery_time = 0;
+        static unsigned char cnt_10V = 0, cnt_11V = 0, cnt_12V = 0;
+
+        //TODO upravit mereni baterie, po zapnuti napajeni cekat cca 5s a merit stav, pokud OK, zapnout dasli vetve ap.
+        if (timer_msec >= battery_time + 200) {
+                        /* check battery empty state - Ubat < 10.5 V */
+                        /* red LED signalization */
+                        if (BATTERY_CH < BAT_STAT_CRITICAL) {
+                                if (++cnt_10V > 20) {
+                                        deb_led_on(LEDR);
+                                        pwr->alert |= CAN_PWR_BATT_CRITICAL;
+                                        send_alert(pwr->alert);
+                                        pwr_50(PWR_OFF, pwr);
+                                        pwr_33(PWR_OFF, pwr);
+                                        /// do not switch off 8V pwr line - this will cause power-down of this board!!
+                                }
+                        }
+                        /* check battery low state - Ubat < 11V */
+                        /* blue LED signalization*/
+                        else if (BATTERY_CH < BAT_STAT_LOW) {
+                                if (++cnt_11V > BAT_CNT) {
+                                        deb_led_on(LEDY);
+                                        pwr->alert |= CAN_PWR_BATT_LOW;
+                                        send_alert(pwr->alert);
+                                }
+                        }
+                        /* check battery alert state - Ubat < 12V */
+                        /* yellow LED signalization*/
+                        else if (BATTERY_CH < BAT_STAT_MEAN) {
+                                if (++cnt_12V > BAT_CNT) {
+                                        deb_led_on(LEDY);
+                                        pwr->alert |= CAN_PWR_BATT_MEAN;
+                                        send_alert(pwr->alert);
+                                }
+                        } else {
+                                /* batery OK */
+                        }
+                battery_time = timer_msec;
+        }
+}
+
+void send_voltage()
 {
-       if (dev_time[TIM_CAN_REPORT] == 0)
-       {
+        static uint32_t send_time = 0;
+        static uint32_t can_timeout = 0;
+
+       if (timer_msec >= send_time + CAN_REPORT_TIME) {
                deb_led_on(LEDB);
 
                msg.id = CAN_PWR_ADC1;
@@ -183,10 +231,10 @@ void send_can()
                msg.data[5] = (((adc_val[1]) >> 16) & 0xFF);
                msg.data[6] = (((adc_val[1]) >> 8) & 0xFF);
                msg.data[7] = (((adc_val[1]) >> 0) & 0xFF);
-                       
-               
-               dev_time[TIM_CAN_TIMEOUT] = CAN_TIMEOUT_TIME;
-               while(can_tx_msg(&msg) && (dev_time[TIM_CAN_TIMEOUT] != 0));
+
+
+               can_timeout = timer_msec;
+               while(can_tx_msg(&msg) && (timer_msec <= can_timeout + CAN_TIMEOUT_TIME));
 
                msg.id = CAN_PWR_ADC2;
                msg.flags = 0;
@@ -199,114 +247,25 @@ void send_can()
                msg.data[5] = (((adc_val[3]) >> 16) & 0xFF);
                msg.data[6] = (((adc_val[3]) >> 8) & 0xFF);
                msg.data[7] = (((adc_val[3]) >> 0) & 0xFF);
-               
-               dev_time[TIM_CAN_TIMEOUT] = CAN_TIMEOUT_TIME;
-               while(can_tx_msg(&msg) && (dev_time[TIM_CAN_TIMEOUT] != 0));
-               
-               deb_led_off(LEDB);
-               dev_time[TIM_CAN_REPORT] = CAN_REPORT_TIME;
-       }
-}
-
-void can_rx(can_msg_t *msg) {
-       can_msg_t rx_msg;
-       
-       memcpy(&rx_msg, msg, sizeof(can_msg_t));
-       
-
-       if (rx_msg.id == CAN_PWR)
-       {
-               if(rx_msg.data[0] & (1<<0)) pwr_33(PWR_ON);
-               if(rx_msg.data[0] & (1<<1)) pwr_50(PWR_ON);
-               if(rx_msg.data[0] & (1<<2)) pwr_80(PWR_ON);
-               
-               if(rx_msg.data[0] & (1<<3)) pwr_33(PWR_OFF);
-               if(rx_msg.data[0] & (1<<4)) pwr_50(PWR_OFF);
-               if(rx_msg.data[0] & (1<<5)) pwr_80(PWR_OFF);
-       }       
-}
-
 
+               can_timeout = timer_msec;
+                while(can_tx_msg(&msg) && (timer_msec <= can_timeout + CAN_TIMEOUT_TIME));
 
-
-
-void tc1 (void) __attribute__ ((interrupt));
-void tc1 (void)   {
-
-       uint32_t i;
-       
-       for (i = 0; i < TIME_COUNT; i++)
-       {
-               if(dev_time[i] != 0)
-                 --dev_time[i];
+               deb_led_off(LEDB);
+               send_time = timer_msec;
        }
-
-       T1IR        = 4;                            // Vynulovani priznaku preruseni
-       VICVectAddr = 0;                            // Potvrzeni o obsluze preruseni
 }
 
-
-/* Setup the Timer Counter 1 Interrupt */
-void init_time (unsigned rx_isr_vect)
+int main (void)
 {
+       init_perip(&power_state);       // sys init MCU
 
-       T1PR = 0;
-       T1MR2 = TIME1MS;
-       T1MCR = (3<<6);                 // interrupt on MR1
-       T1TCR = 1;                                  // Starts Timer 1 
-
-       ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (unsigned long)tc1;          // Nastaveni adresy vektotu preruseni
-       ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x20 | 0x5;                    // vyber casovece pro preruseni
-       VICIntEnable = (1<<5);                  // Povoli obsluhu preruseni
-}
-
-
-
-void init_perip(void)     // inicializace periferii mikroprocesoru
-{
-       int i;
-       for (i = 0; i < TIME_COUNT; i++)
-         dev_time[i] = 0;
-  
-       init_pwr();
-       can_init_baudrate(CAN_SPEED, CAN_ISR, can_rx);
-       init_adc(ADC_ISR);
-       init_time (TIME_ISR);
-       init_uart0((int)9600 ,UART_BITS_8, UART_STOP_BIT_1, UART_PARIT_OFF, 0 );
-
-
-#ifdef TEST
-       pwr_33(PWR_ON);
-       pwr_50(PWR_ON);
-       pwr_80(PWR_ON);
-#else
-       pwr_33(PWR_OFF);
-       pwr_50(PWR_OFF);
-       pwr_80(PWR_OFF);
-#endif
-
-       pwr_33(PWR_ON);
-       pwr_50(PWR_ON);
-       pwr_80(PWR_ON);
-}
-
-
-int main (void)  
-{
-       init_perip();                   // sys init MCU
-
-       dev_time[TIM_LEDG] = 1000;
-       while(dev_time[TIM_LEDG]);
-        
-
-       while(1)
-       {
-               led_blik();
-               send_can();
-               power_alert();
-
-       } 
-}
-
-
+        //TODO wait one secdond here
 
+       while (1) {
+               blink_led();
+               send_voltage();
+                battery_check(&power_state);
+               power_lines_check(&power_state);
+       }
+}
\ No newline at end of file
index 4d3880bcb87c1fc95e099beb42d663a47860a31f..5f7ca748f3f5a56da72ec266ff1ad6af932d5d40 100644 (file)
 #include <lpc21xx.h>                          // LPC21XX Peripheral Registers\r
-#include <types.h> \r
+#include <types.h>\r
 #include <deb_led.h>\r
 #include <system_def.h>\r
 #include "pwrstep.h"\r
 \r
-\r
-#define PWR33  (1<<22) \r
-#define PWR50  (1<<24)\r
-#define PWR80  (1<<23)\r
-\r
-#define ADC0   (1<<27) \r
-#define ADC1   (1<<28) \r
-#define ADC2   (1<<29) \r
-#define ADC3   (1<<30) \r
-\r
-\r
-\r
-#define ADCCH0 22\r
-#define ADCCH1 24\r
-#define ADCCH2 26\r
-#define ADCCH3 28\r
-\r
-//  tohla me byt definovano nekde jinde  FIXME\r
-\r
-\r
-#define ADC_PIN_0   0x1\r
-#define ADC_PIN_1   0x2\r
-#define ADC_PIN_2   0x4\r
-#define ADC_PIN_3   0x8\r
-\r
-#define ADC_CR_ADC0 0x1\r
-#define ADC_CR_ADC1 0x2\r
-#define ADC_CR_ADC2 0x4\r
-#define ADC_CR_ADC3 0x8\r
-\r
-#define ADC_CR_CLK_DIV_1       (1<<8)  // this nuber should be multipied  sampe\r
-                                                               // requested divisor 4  ---- clk_div = 4 * ADC_CR_CLK_DIV_1\r
-#define ADC_CR_BURST           (1<<16)\r
-#define ADC_CR_CLKS_11         (0<<17)\r
-#define ADC_CR_CLKS_10         (1<<17)\r
-#define ADC_CR_CLKS_9          (2<<17)\r
-#define ADC_CR_CLKS_8          (3<<17)\r
-#define ADC_CR_CLKS_7          (4<<17)\r
-#define ADC_CR_CLKS_6          (5<<17)\r
-#define ADC_CR_CLKS_5          (6<<17)\r
-#define ADC_CR_CLKS_4          (7<<17)\r
-\r
-#define ADC_CR_PDN_ON          (1<<21)\r
-\r
-#define ADC_CR_START_OFF       (0<<24)\r
-#define ADC_CR_START_NOW       (1<<24)\r
-#define ADC_CR_START_P016      (2<<24)\r
-#define ADC_CR_START_P022      (3<<24)\r
-#define ADC_CR_START_MAT01     (4<<24)\r
-#define ADC_CR_START_MAT03     (5<<24)\r
-#define ADC_CR_START_MAT10     (6<<24)\r
-#define ADC_CR_START_MAT11     (7<<24)\r
-\r
-#define ADC_CR_EDGE_RISING     (0<<27)\r
-#define ADC_CR_EDGE_FALLING    (1<<27)\r
-\r
-\r
-\r
-\r
-\r
-       \r
-\r
-void pwr_33(char mode) // switch on/off 3,3V power line\r
+void pwr_33(char mode, struct power *pwr)      // switch on/off 3,3V power line\r
 {\r
-       if (mode != PWR_ON)\r
-       {\r
-               IO1SET |= PWR33;        \r
-       }\r
-       else\r
-       {\r
-               IO1CLR |= PWR33;        \r
+       if (mode != PWR_ON) {\r
+               IO1SET |= PWR33;\r
+                pwr->pwr_33v_state = PWR_OFF;\r
+       } else {\r
+                IO1CLR |= PWR33;\r
+                pwr->pwr_33v_state = PWR_ON;\r
        }\r
 }\r
 \r
-\r
-void pwr_50(char mode) // switch on/off 5V power line\r
+void pwr_50(char mode, struct power *pwr)      // switch on/off 5V power line\r
 {\r
-       if (mode != PWR_ON)\r
-       {\r
-               IO1SET |= PWR50;        \r
-       }\r
-       else\r
-       {\r
-               IO1CLR |= PWR50;        \r
+       if (mode != PWR_ON) {\r
+               IO1SET |= PWR50;\r
+                pwr->pwr_50v_state = PWR_OFF;\r
+       } else {\r
+               IO1CLR |= PWR50;\r
+                pwr->pwr_50v_state = PWR_ON;\r
        }\r
 }\r
 \r
-\r
-void pwr_80(char mode) // switch on/off 8V power line\r
+void pwr_80(char mode, struct power *pwr)      // switch on/off 8V power line\r
 {\r
-       if (mode != PWR_ON)\r
-       {\r
-               IO1SET |= PWR80;        \r
-       }\r
-       else\r
-       {\r
-               IO1CLR |= PWR80;        \r
+       if (mode != PWR_ON) {\r
+               IO1SET |= PWR80;\r
+                pwr->pwr_80v_state = PWR_OFF;\r
+       } else {\r
+               IO1CLR |= PWR80;\r
+                pwr->pwr_80v_state = PWR_ON;\r
        }\r
 }\r
 \r
-\r
- volatile char test =0xF;\r
-\r
 void adc_isr(void) __attribute__ ((interrupt));\r
 \r
-void adc_isr(void) \r
+void adc_isr(void)\r
 {\r
-       unsigned char chan =0;                                                                             \r
+       unsigned char chan =0;\r
        unsigned int val =0;\r
 \r
        chan = (char) ((ADDR>>24) & 0x07);\r
-       val = ((ADDR >> 6) & 0x3FF); \r
+       val = ((ADDR >> 6) & 0x3FF);\r
 \r
        adc_val[chan] = (((val * ADC_CON_CONST + ADC_OFFSET) + adc_val[chan]) >> 1) ;\r
 \r
@@ -130,24 +60,22 @@ void adc_isr(void)
                case 1:\r
                        ADCR = ((ADC_CR_ADC2) | (ADC_CR_CLKS_11) | (ADC_CR_PDN_ON) | (ADC_CR_START_NOW) | (20*ADC_CR_CLK_DIV_1));\r
                        break;\r
-                       \r
+\r
                case 2:\r
                        ADCR = ((ADC_CR_ADC3) | (ADC_CR_CLKS_11) | (ADC_CR_PDN_ON) | (ADC_CR_START_NOW) | (20*ADC_CR_CLK_DIV_1));\r
                        break;\r
-                       \r
+\r
                case 3:\r
                        ADCR = ((ADC_CR_ADC0) | (ADC_CR_CLKS_11) | (ADC_CR_PDN_ON) | (ADC_CR_START_NOW) | (20*ADC_CR_CLK_DIV_1));\r
-                       break;                                                                                                                   \r
+                       break;\r
        }\r
-       \r
+\r
         VICVectAddr = 0;\r
 }\r
 \r
-\r
 void init_adc(unsigned rx_isr_vect)\r
 {\r
-       \r
-       PINSEL1 |= ((PINSEL_1 << ADCCH0) | (PINSEL_1 << ADCCH1) | (PINSEL_1 << ADCCH2) | (PINSEL_1 << ADCCH3));         \r
+       PINSEL1 |= ((PINSEL_1 << ADCCH0) | (PINSEL_1 << ADCCH1) | (PINSEL_1 << ADCCH2) | (PINSEL_1 << ADCCH3));\r
 \r
        ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x32;\r
        ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (unsigned) adc_isr;\r
@@ -156,18 +84,10 @@ void init_adc(unsigned rx_isr_vect)
        ADCR = ((ADC_CR_ADC0) | (ADC_CR_CLKS_11) | (ADC_CR_PDN_ON) | (ADC_CR_START_NOW) | (10*ADC_CR_CLK_DIV_1));\r
 }\r
 \r
-\r
-void init_pwr(void)   // init power lines\r
+void init_pwr(struct power *pwr)   // init power lines\r
 {\r
        IO1DIR |= (PWR33 | PWR50 | PWR80);\r
-       pwr_33(PWR_OFF);\r
-       pwr_50(PWR_OFF);\r
-       pwr_80(PWR_OFF);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
+       pwr_33(PWR_OFF, pwr);\r
+       pwr_50(PWR_OFF, pwr);\r
+       pwr_80(PWR_OFF, pwr);\r
+}
\ No newline at end of file
index 411df1590bbe327581feafa9d9f775cb877a6386..b9ddbd8e3801a0c59e3ce1967c59ecfbfeac8076 100644 (file)
@@ -4,32 +4,96 @@
 #define PWR_ON 1\r
 #define PWR_OFF        0\r
 \r
-#define ADC_DIV 10\r
-#define ADC_CON_CONST 322\r
-#define ADC_OFFSET     2000\r
+#define ADC_DIV         10\r
+#define ADC_CON_CONST   322\r
+#define ADC_OFFSET      2000\r
 \r
+#define PWR33   (1<<22)\r
+#define PWR50   (1<<24)\r
+#define PWR80   (1<<23)\r
 \r
-       volatile unsigned int adc_val[4];\r
+#define ADC0    (1<<27)\r
+#define ADC1    (1<<28)\r
+#define ADC2    (1<<29)\r
+#define ADC3    (1<<30)\r
+\r
+#define ADCCH0 22\r
+#define ADCCH1 24\r
+#define ADCCH2 26\r
+#define ADCCH3 28\r
+\r
+#define ADC_PIN_0   0x1\r
+#define ADC_PIN_1   0x2\r
+#define ADC_PIN_2   0x4\r
+#define ADC_PIN_3   0x8\r
+\r
+#define ADC_CR_ADC0 0x1\r
+#define ADC_CR_ADC1 0x2\r
+#define ADC_CR_ADC2 0x4\r
+#define ADC_CR_ADC3 0x8\r
+\r
+#define ADC_CR_CLK_DIV_1        (1<<8)  // this nuber should be multipied  sampe\r
+                                                                // requested divisor 4  ---- clk_div = 4 * ADC_CR_CLK_DIV_1\r
+#define ADC_CR_BURST            (1<<16)\r
+#define ADC_CR_CLKS_11          (0<<17)\r
+#define ADC_CR_CLKS_10          (1<<17)\r
+#define ADC_CR_CLKS_9           (2<<17)\r
+#define ADC_CR_CLKS_8           (3<<17)\r
+#define ADC_CR_CLKS_7           (4<<17)\r
+#define ADC_CR_CLKS_6           (5<<17)\r
+#define ADC_CR_CLKS_5           (6<<17)\r
+#define ADC_CR_CLKS_4           (7<<17)\r
+\r
+#define ADC_CR_PDN_ON           (1<<21)\r
+\r
+#define ADC_CR_START_OFF        (0<<24)\r
+#define ADC_CR_START_NOW        (1<<24)\r
+#define ADC_CR_START_P016       (2<<24)\r
+#define ADC_CR_START_P022       (3<<24)\r
+#define ADC_CR_START_MAT01      (4<<24)\r
+#define ADC_CR_START_MAT03      (5<<24)\r
+#define ADC_CR_START_MAT10      (6<<24)\r
+#define ADC_CR_START_MAT11      (7<<24)\r
+\r
+#define ADC_CR_EDGE_RISING      (0<<27)\r
+#define ADC_CR_EDGE_FALLING     (1<<27)\r
+\r
+#define BATTERY_CH      adc_val[0]\r
+#define V33_CH          adc_val[1]\r
+#define V50_CH          adc_val[2]\r
+#define V80_CH          adc_val[3]\r
+\r
+volatile unsigned int adc_val[4];\r
+\r
+struct power {\r
+        char can_33v_req;\r
+        char can_80v_req;\r
+        char can_50v_req;\r
+        char pwr_33v_state;\r
+        char pwr_50v_state;\r
+        char pwr_80v_state;\r
+        char battery_state;\r
+        char alert;\r
+};\r
 \r
 /**    pwr_33 Switch on/off 3,3V power line\r
- *  @param mode  -  PWR_ON/PWR_OFF \r
+ *  @param mode  -  PWR_ON/PWR_OFF\r
  */\r
-void pwr_33(char mode);\r
+void pwr_33(char mode, struct power *pwr);\r
 \r
 /**    pwr_50 Switch on/off 5,0V power line\r
- *  @param mode  -  PWR_ON/PWR_OFF \r
+ *  @param mode  -  PWR_ON/PWR_OFF\r
  */\r
-void pwr_50(char mode);\r
+void pwr_50(char mode, struct power *pwr);\r
 \r
 /**    pwr_80 Switch on/off 8,0V power line\r
- *  @param mode  -  PWR_ON/PWR_OFF \r
+ *  @param mode  -  PWR_ON/PWR_OFF\r
  */\r
-void pwr_80(char mode);\r
+void pwr_80(char mode, struct power *pwr);\r
 \r
 /**    init_pwr  inicializes power lines - default: all lines is off\r
  */\r
-void init_pwr(void);\r
-\r
+void init_pwr(struct power *pwr);\r
 \r
 /**    inicializes ADC lines and starts converion (use ISR)\r
  *  @param rx_isr_vect  ISR vector\r