From 4a914e8c559cd48173bed088e2122d1d35c8de9b Mon Sep 17 00:00:00 2001 From: Michael Buesch Date: Sun, 12 Oct 2008 16:46:48 +0200 Subject: Add code to the pressure control. Signed-off-by: Michael Buesch --- pressure_control/firmware/main.c | 73 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'pressure_control/firmware/main.c') diff --git a/pressure_control/firmware/main.c b/pressure_control/firmware/main.c index 949e5cb..02272ef 100644 --- a/pressure_control/firmware/main.c +++ b/pressure_control/firmware/main.c @@ -18,15 +18,86 @@ */ #include "util.h" +#include "calibration.h" +#include "sensor.h" +#include "valves.h" +static inline void usart_tx(uint8_t data) +{ + while (!(UCSRA & (1 << UDRE))) + ; + UDR = data; +} + +static void __print(const prog_char *msg) +{ + uint8_t c; + + for ( ; ; msg++) { + c = pgm_read_byte(msg); + if (c == '\0') + break; + usart_tx(c); + } +} +#define print(msg) __print(PSTR(msg)) + +#define ERXFE 1 /* USART RX frame error */ +#define ERXPE 2 /* USART RX parity error */ +#define ERXOV 3 /* USART RX hardware buffer overflow */ +#define ENODATA 4 /* No data available */ + +static inline int8_t usart_rx(uint8_t *data) +{ + uint8_t status; + + status = UCSRA; + if (!(status & (1 << RXC))) + return -ENODATA; + if (unlikely(status & ((1 << FE) | (1 << PE) | (1 << DOR)))) { + if (status & (1 << FE)) + return -ERXFE; + if (status & (1 << PE)) + return -ERXPE; + if (status & (1 << DOR)) + return -ERXOV; + } + *data = UDR; + + return 0; +} + +#define BAUDRATE 9600 + +static void usart_init(void) +{ + uint8_t dummy; + + /* Set baud rate */ + UBRRL = lo8((CPU_HZ / 16 / BAUDRATE) * 2); + UBRRH = hi8((CPU_HZ / 16 / BAUDRATE) * 2) & ~(1 << URSEL); + UCSRA = (1 << U2X); + /* 8 Data bits, 2 Stop bits, Even parity */ + UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1) | (1 << UPM1) | (1 << USBS); + /* Enable transceiver and RX IRQs */ + UCSRB = (1 << RXEN) | (1 << TXEN);// | (1 << RXCIE); + /* Drain the RX buffer */ + while (usart_rx(&dummy) != -ENODATA) + mb(); +} + int main(void) { cli(); - //TODO + + valves_init(); + usart_init(); + sei(); while (1) { + print("Hallo!\n"); //TODO } } -- cgit v1.2.3