--- /dev/null
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+ @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
--- /dev/null
+# -*- makefile -*-
+
+bin_PROGRAMS = eb_pwr
+
+eb_pwr_SOURCES = pwrstep.c uart.c main.c
+
+eb_pwr_LIBS = can
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////
+//
+// Eurobot POWER BOAD (with LPC2129)
+//
+// Description
+// -----------
+// This software controls the eurobot powerboard
+// Author : Jiri Kubias DCE CVUT
+//
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <lpc21xx.h> /* LPC21xx definitions */
+#include <string.h>
+#include <deb_led.h>
+#include <system_def.h>
+#include <periph/can.h>
+#include <can_ids.h>
+
+
+#include "pwrstep.h"
+#include "uart.h"
+
+#define CAN_SPEED 1000000
+#define CAN_ISR 0
+#define ADC_ISR 1
+#define TIME_ISR 2
+
+
+#define CAN_TRY 20
+
+#define ALERT_LOW 1
+#define ALERT_MAIN 2
+#define ALERT_BYE 3
+#define ALERT_33V 4
+#define ALERT_50V 5
+#define ALERT_80V 6
+
+#define BAT_CNT 10
+#define BAT_STAT_LOW 120000
+#define BAT_STAT_MAIN 110000
+#define BAT_STAT_BYE 105000
+
+#define V33_MIN 30000
+#define V50_MIN 45000
+#define V80_MIN 75000
+
+#define CAN_TIMEOUT 10
+
+//extern unsigned int adc_val[4];
+
+//#define TEST
+
+can_msg_t msg;// = {.flags = 0, .dlc = 1};
+
+unsigned int time_blink = 0;
+unsigned int time_send_can = 0;
+unsigned int time_alert = 0;
+
+unsigned int time_timeout = 0;
+
+unsigned int can_send_cnt = 0;
+
+
+void led_blik()
+{
+ if (time_blink == 0) time_blink = time_ms + 500;
+
+ if (time_ms > time_blink)
+ {
+ deb_led_change(LEDG);
+ time_blink = time_ms + 500;
+ }
+
+}
+
+void send_alert(unsigned char type )
+{
+
+
+ msg.id = CAN_PWR_ALERT;
+ msg.flags = 0;
+ msg.dlc = 1;
+ msg.data[0] = type;
+
+ while (can_tx_msg(&msg));
+
+}
+
+unsigned int cnt_12V;
+unsigned int cnt_10V;
+
+
+
+void power_alert()
+{
+ if (time_alert == 0) time_alert = time_ms + 200;
+
+ if (time_ms > time_alert)
+ {
+
+ 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);
+ }
+ }
+ time_alert = time_ms + 500;
+ }
+}
+
+void send_can()
+{
+ if (time_send_can == 0) time_send_can = time_ms + 200;
+
+ if (time_ms > time_send_can)
+ {
+ deb_led_on(LEDB);
+
+ msg.id = CAN_PWR_ADC1;
+ msg.flags = 0;
+ msg.dlc = 8;
+ msg.data[0] = (((adc_val[0]) >> 24) & 0xFF);
+ msg.data[1] = (((adc_val[0]) >> 16) & 0xFF);
+ msg.data[2] = (((adc_val[0]) >> 8) & 0xFF);
+ msg.data[3] = (((adc_val[0]) >> 0) & 0xFF);
+ msg.data[4] = (((adc_val[1]) >> 24) & 0xFF);
+ msg.data[5] = (((adc_val[1]) >> 16) & 0xFF);
+ msg.data[6] = (((adc_val[1]) >> 8) & 0xFF);
+ msg.data[7] = (((adc_val[1]) >> 0) & 0xFF);
+
+ time_timeout = time_ms + CAN_TIMEOUT;
+ //while(can_tx_msg(&msg) & (time_timeout > time_ms))
+
+ while (can_tx_msg(&msg));
+
+
+ msg.id = CAN_PWR_ADC2;
+ msg.flags = 0;
+ msg.dlc = 8;
+ msg.data[0] = (((adc_val[2]) >> 24) & 0xFF);
+ msg.data[1] = (((adc_val[2]) >> 16) & 0xFF);
+ msg.data[2] = (((adc_val[2]) >> 8) & 0xFF);
+ msg.data[3] = (((adc_val[2]) >> 0) & 0xFF);
+ msg.data[4] = (((adc_val[3]) >> 24) & 0xFF);
+ msg.data[5] = (((adc_val[3]) >> 16) & 0xFF);
+ msg.data[6] = (((adc_val[3]) >> 8) & 0xFF);
+ msg.data[7] = (((adc_val[3]) >> 0) & 0xFF);
+
+ time_timeout = time_ms + CAN_TIMEOUT;
+ //while(can_tx_msg(&msg) & (time_timeout > time_ms))
+
+ while (can_tx_msg(&msg));
+ deb_led_off(LEDB);
+ time_send_can = time_ms + 500;
+ }
+
+}
+
+
+
+
+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);
+ }
+}
+
+
+
+void init_perip(void) // inicializace periferii mikroprocesoru
+{
+
+ 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);
+}
+
+
+unsigned int time_delay = 0;
+
+
+int main (void) {
+
+
+ init_perip(); // sys init MCU
+
+ time_delay = time_ms + 1000;
+
+ while(time_ms < time_delay);
+
+ while(1)
+ {
+ led_blik();
+ send_can(); //FIXME
+ power_alert();
+
+ }
+}
+
+
+
--- /dev/null
+#include <lpc21xx.h> // LPC21XX Peripheral Registers\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
+#define TIME1MS ((CPU_APB_HZ) / 1000)\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
+{\r
+ if (mode != PWR_ON)\r
+ {\r
+ IO1SET |= PWR33; \r
+ }\r
+ else\r
+ {\r
+ IO1CLR |= PWR33; \r
+ }\r
+}\r
+\r
+\r
+void pwr_50(char mode) // switch on/off 5V power line\r
+{\r
+ if (mode != PWR_ON)\r
+ {\r
+ IO1SET |= PWR50; \r
+ }\r
+ else\r
+ {\r
+ IO1CLR |= PWR50; \r
+ }\r
+}\r
+\r
+\r
+void pwr_80(char mode) // switch on/off 8V power line\r
+{\r
+ if (mode != PWR_ON)\r
+ {\r
+ IO1SET |= PWR80; \r
+ }\r
+ else\r
+ {\r
+ IO1CLR |= PWR80; \r
+ }\r
+}\r
+\r
+\r
+ volatile char test =0xF;\r
+\r
+void adc_isr(void) __attribute__ ((interrupt));\r
+\r
+void adc_isr(void) \r
+{\r
+ unsigned char chan =0; \r
+ unsigned int val =0;\r
+\r
+\r
+ chan = (char) ((ADDR>>24) & 0x07);\r
+ val = ((ADDR >> 6) & 0x3FF); \r
+\r
+ \r
+\r
+\r
+ adc_val[chan] = (((val * ADC_CON_CONST + ADC_OFFSET) + adc_val[chan]) >> 1) ;\r
+\r
+ ADCR &= ~(ADC_CR_START_OFF);\r
+\r
+\r
+ switch(chan)\r
+ {\r
+ case 0:\r
+ ADCR = ((ADC_CR_ADC1) | (ADC_CR_CLKS_11) | (ADC_CR_PDN_ON) | (ADC_CR_START_NOW) | (20*ADC_CR_CLK_DIV_1));\r
+ break;\r
+\r
+ 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
+ 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
+ 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
+ }\r
+ \r
+ VICVectAddr = 0;\r
+\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
+\r
+ ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x32;\r
+ ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (unsigned) adc_isr;\r
+ VICIntEnable = 0x40000;\r
+\r
+\r
+\r
+\r
+\r
+ 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
+{\r
+ IO1DIR |= (PWR33 | PWR50 | PWR80);\r
+ pwr_33(PWR_OFF);\r
+ pwr_50(PWR_OFF);\r
+ pwr_80(PWR_OFF);\r
+\r
+ //init_adc();\r
+\r
+}\r
+\r
+\r
+\r
+\r
+void tc1 (void) __attribute__ ((interrupt));\r
+\r
+void tc1 (void) {\r
+ \r
+ time_ms +=1;\r
+ \r
+ \r
+\r
+ if (T1IR != 4)\r
+ { \r
+ __deb_led_on(LEDR); \r
+ } \r
+\r
+ T1IR = 4; // Vynulovani priznaku preruseni\r
+ VICVectAddr = 0; // Potvrzeni o obsluze preruseni\r
+}\r
+\r
+\r
+/* Setup the Timer Counter 1 Interrupt */\r
+void init_time (unsigned rx_isr_vect)\r
+{\r
+\r
+ \r
+\r
+\r
+\r
+ T1PR = 0;\r
+ T1MR2 = TIME1MS;\r
+ T1MCR = (3<<6); // interrupt on MR1\r
+\r
+ T1TCR = 1; // Starts Timer 1 \r
+\r
+ ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (unsigned long)tc1; // Nastaveni adresy vektotu preruseni\r
+ ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x20 | 0x5; // vyber casovece pro preruseni\r
+ VICIntEnable = (1<<5); // Povoli obsluhu preruseni\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
--- /dev/null
+#ifndef PWRSTEP_H\r
+#define PWRSTEP_H\r
+\r
+#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
+\r
+\r
+ volatile unsigned int adc_val[4];\r
+\r
+/** pwr_33 Switch on/off 3,3V power line\r
+ * @param mode - PWR_ON/PWR_OFF \r
+ */\r
+void pwr_33(char mode);\r
+\r
+/** pwr_50 Switch on/off 5,0V power line\r
+ * @param mode - PWR_ON/PWR_OFF \r
+ */\r
+void pwr_50(char mode);\r
+\r
+/** pwr_80 Switch on/off 8,0V power line\r
+ * @param mode - PWR_ON/PWR_OFF \r
+ */\r
+void pwr_80(char mode);\r
+\r
+/** init_pwr inicializes power lines - default: all lines is off\r
+ */\r
+void init_pwr(void);\r
+\r
+\r
+/** inicializes ADC lines and starts converion (use ISR)\r
+ * @param rx_isr_vect ISR vector\r
+ */\r
+void init_adc(unsigned rx_isr_vect);\r
+\r
+/** gobal time\r
+ * @note incremented twenty 20ms, overrun every 1194hours\r
+ */\r
+volatile unsigned int time_ms;\r
+\r
+/** inicializes time counter (use ISR)\r
+ * @param rx_isr_vect ISR vector\r
+ */\r
+void init_time (unsigned rx_isr_vect);\r
+#endif\r
--- /dev/null
+\r
+ #include <lpc21xx.h> \r
+ #include "uart.h"\r
+ #include <system_def.h>
+\r
+\r
+\r
+\r
+ #define UART_DLAB 0x80\r
+\r
+\r
+void init_uart0(int baudrate, char bits, char stopbit, char parit_en, char parit_mode ) \r
+{ \r
+\r
+ int pom , vala, valb;\r
+\r
+ PINSEL0 |= ( PINSEL_1<< 0) | ( PINSEL_1 << 2); \r
+\r
+ U0LCR =UART_DLAB | bits | stopbit | parit_en | parit_mode; // nastaven� datov�ho slova na 8 bit� a jeden stop bit bez parity, nastaven� DLAB na log "1"\r
+ \r
+ \r
+ pom = (CPU_APB_HZ)/(16 * baudrate);\r
+ \r
+ vala = (CPU_APB_HZ)/(16 * pom);\r
+ valb = (CPU_APB_HZ)/(16 * (pom + 1));\r
+\r
+ vala = baudrate - vala;\r
+ valb = baudrate - valb;\r
+\r
+ if (vala < 0) vala *= -1;\r
+ if (valb < 0) valb *= -1;\r
+ \r
+ if (vala > valb) pom += 1;\r
+\r
+ U0DLL = (char) (pom & 0xFF);\r
+ U0DLM = (char) ((pom >> 8) & 0xFF); // nastaven� p�edd�li�ky na 57600Bd\r
+ \r
+ U0LCR &= ~UART_DLAB; // vynulov�n� DLAB \r
+\r
+ }\r
+\r
+\r
+unsigned char uart1GetCh(void) // Nuceny prijem z uart1\r
+{\r
+ while (!(U1LSR & 1)); // cekani na prichozi byte\r
+ return (unsigned char)U1RBR; // navraceni prijateho byte\r
+}\r
+\r
+unsigned char uart0GetCh(void) // Nuceny prijem z uart1\r
+{\r
+ while (!(U0LSR & 1)); // cekani na prichozi byte\r
+ return (unsigned char)U0RBR; // navraceni prijateho byte\r
+}\r
+\r
+void uart1SendCh(char ch) // vyslani znaku na uart1\r
+{\r
+ while (!(U1LSR & 0x20)); // ceka na odeslani predchozich dat\r
+ U1THR=ch; // odeslani Byte\r
+ \r
+}\r
+\r
+void uart0SendCh(char ch) // vyslani znaku na uart0\r
+{\r
+ while (!(U0LSR & 0x20)); // ceka na odeslani predchozich dat\r
+ U0THR=ch; // odeslani Byte\r
+}\r
+\r
+\r
+void init_uart1(int baudrate, char bits, char stopbit, char parit_en, char parit_mode ) \r
+{ \r
+\r
+ int pom , vala, valb;\r
+\r
+ PINSEL0 |= ( PINSEL_1<< 16) | ( PINSEL_1 << 18); \r
+\r
+ U1LCR =UART_DLAB | bits | stopbit | parit_en | parit_mode; // nastaven� datov�ho slova na 8 bit� a jeden stop bit bez parity, nastaven� DLAB na log "1"\r
+ \r
+ \r
+ pom = (CPU_APB_HZ)/(16 * baudrate);\r
+ \r
+ vala = (CPU_APB_HZ)/(16 * pom);\r
+ valb = (CPU_APB_HZ)/(16 * (pom + 1));\r
+\r
+ vala = baudrate - vala;\r
+ valb = baudrate - valb;\r
+\r
+ if (vala < 0) vala *= -1;\r
+ if (valb < 0) valb *= -1;\r
+ \r
+ if (vala > valb) pom += 1;\r
+\r
+ U1DLL = (char) (pom & 0xFF);\r
+ U1DLM = (char) ((pom >> 8) & 0xFF); // nastaven� p�edd�li�ky na 57600Bd\r
+ \r
+ U1LCR &= ~UART_DLAB; // vynulov�n� DLAB \r
+\r
+ }\r
+\r
+\r
+\r
--- /dev/null
+#define UART_BITS_5 0x0\r
+#define UART_BITS_6 0x1\r
+#define UART_BITS_7 0x2\r
+#define UART_BITS_8 0x3\r
+\r
+#define UART_STOP_BIT_1 (0x0 << 2)\r
+#define UART_STOP_BIT_2 (0x1 << 2)\r
+\r
+#define UART_PARIT_ENA (0x1 << 3)\r
+#define UART_PARIT_OFF (0x0 << 3)\r
+#define UART_PARIT_ODD (0x0 << 4)\r
+#define UART_PARIT_EVEN (0x1 << 4)\r
+#define UART_PARIT_FORCE_1 (0x2 << 4)\r
+#define UART_PARIT_FORCE_0 (0x3 << 4)\r
+\r
+\r
+\r
+\r
+void init_uart1(int baudrate, char bits, char stopbit, char parit_en, char parit_mode );\r
+void init_uart0(int baudrate, char bits, char stopbit, char parit_en, char parit_mode );\r
+unsigned char uart1GetCh(void);\r
+unsigned char uart0GetCh(void);\r
+void uart1SendCh(char ch);\r
+void uart0SendCh(char ch);\r