diff options
author | David Lamparter <equinox@diac24.net> | 2012-09-22 23:02:15 +0200 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2012-09-22 23:02:15 +0200 |
commit | 6966eb287f160c68c597105e60b191806a63b9ba (patch) | |
tree | 1f91368d1dd2dc5009322a7a7910e5da49d08773 | |
parent | 415ca2037b3cefc64ee59279950fe85fa679e3cd (diff) |
can: handle interrupt asynchronously
-rw-r--r-- | can.c | 22 | ||||
-rw-r--r-- | door.c | 4 | ||||
-rw-r--r-- | lightctrl.c | 11 |
3 files changed, 18 insertions, 19 deletions
@@ -24,13 +24,6 @@ #ifndef R0KET #define spi_ss(x) PORTB = ((x) << B_SS) | 0x3; -static volatile bool canint = false; - -ISR(INT0_vect) -{ - canint = true; -} - static uint8_t spi_wrrd(uint8_t out) { SPDR = out; @@ -152,6 +145,9 @@ union { } can_rx_addr; uint8_t can_rx_dlc, can_rx_data[8]; +#define can_rx_avail() (can_rx_addr.u) +#define can_rx_pop() do { can_rx_addr.u = 0; } while (0) + static void can_rxh(uint8_t buffer) { uint8_t c, byte; @@ -162,6 +158,14 @@ static void can_rxh(uint8_t buffer) uart_puts("can: RX0IF\n"); spi_ss(0); spi_wrrd(0x90 + 0x04 * buffer); + + if (can_rx_addr.u) { + spi_wrrd(0xff); + spi_ss(1); + uart_puts("-- CAN RX overrun\n"); + return; + }; + c = 0; #define rdaddr() byte = spi_wrrd(0xff); uart_puthex(byte); can_rx_addr.b[c++] = byte rdaddr(); @@ -180,7 +184,7 @@ static void can_rxh(uint8_t buffer) spi_ss(1); } -static void can_int(void) +ISR(INT0_vect) { uint8_t canintf, eflg, canstat; @@ -230,6 +234,8 @@ static void can_int(void) static void can_preinit(void) { + can_rx_addr.u = 0; + spi_ss(1); #ifndef R0KET DDRB |= (1 << B_SCK) | (1 << B_MOSI) | (1 << B_SS); @@ -107,10 +107,6 @@ int main(void) TCCR1B = (1 << WGM12) | (1 << CS11); while (1) { - if (canint) { - canint = false; - can_int(); - } _delay_ms(1); } } diff --git a/lightctrl.c b/lightctrl.c index 2a82ad3..e901714 100644 --- a/lightctrl.c +++ b/lightctrl.c @@ -223,15 +223,12 @@ int main(void) while (1) { wdt_reset(); - if (canint) { - canint = false; - can_int(); - if (can_rx_addr.b[0]) { - can_rx_exec(); - can_rx_addr.u = 0; - } + if (can_rx_avail()) { + can_rx_exec(); + can_rx_pop(); } + _delay_ms(5); do_tick(); |