diff --git a/software/AVR8/Makefile b/software/AVR8/Makefile index 09b4c36..4d8b1fa 100644 --- a/software/AVR8/Makefile +++ b/software/AVR8/Makefile @@ -4,8 +4,8 @@ ISPPORT ?= /dev/kaboard VERSION = 0.1 -HEADERS = sss7.h uart.h -SRC = main.c sss7.c uart.c +HEADERS = sss7.h uart.h timer.h +SRC = main.c sss7.c uart.c timer.c TARGET = sss7 OBJDIR = bin diff --git a/software/AVR8/sss7.c b/software/AVR8/sss7.c index 5f36dac..023e225 100644 --- a/software/AVR8/sss7.c +++ b/software/AVR8/sss7.c @@ -18,6 +18,8 @@ volatile uint8_t sss7_tx_failed; uint8_t sss7_tx_last_byte; uint8_t sss7_tx_last_ack; +volatile uint8_t sss7_timeout_counter; + void sss7_init(void) { sss7_state = SSS7_IDLE; @@ -29,9 +31,6 @@ void sss7_init(void) { sss7_tx_pos = 0; sss7_tx_crc = 0; sss7_tx_failed = 0; - - DDRB |= (1 << PB2)| (1 << PB3); - PORTB |= (1 << PB2) | (1 << PB3); } @@ -50,7 +49,7 @@ static inline uint8_t sss7_payload_crc(uint8_t buffer[SSS7_PAYLOAD_SIZE]) { } } } - + return crc; } @@ -77,6 +76,7 @@ void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) { // Commit to send state sss7_state = SSS7_TX_HEADER; sss7_tx_failed = 0; + sss7_timeout_counter = 0; sss7_send_byte(SSS7_HEADER[0]); } @@ -84,12 +84,12 @@ void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) { void sss7_process_rx(void) { uint8_t byte = uart_get_byte(); uint8_t crc = 0; + sss7_timeout_counter = 0; switch(sss7_state) { case SSS7_IDLE: if(byte == SSS7_HEADER[0]) { sss7_state = SSS7_RX_HEADER; - PORTB |= (1 << PB3); } else { sss7_state = SSS7_IDLE; @@ -119,7 +119,6 @@ void sss7_process_rx(void) { if(byte == crc) { sss7_rx_active_buffer = (sss7_rx_active_buffer + 1) % SSS7_RX_BUFFER_COUNT; } - PORTB &= ~(1 << PB3); sss7_state = SSS7_IDLE; break; @@ -172,6 +171,23 @@ void sss7_process_tx(void) { } } +void sss7_process_ticks(uint16_t ticks) { + if(sss7_state != SSS7_IDLE) { + sss7_timeout_counter = sss7_timeout_counter + ticks; + + if(sss7_timeout_counter > sss7_timeout) { + switch(sss7_state) { + case SSS7_TX_HEADER: + case SSS7_TX_PAYLOAD: + case SSS7_TX_CRC: + sss7_tx_failed = 1; + default: + sss7_state = SSS7_IDLE; + } + } + } +} + void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]) { if(sss7_has_received()) { diff --git a/software/AVR8/sss7.h b/software/AVR8/sss7.h index fbcf317..15770e5 100644 --- a/software/AVR8/sss7.h +++ b/software/AVR8/sss7.h @@ -15,10 +15,13 @@ enum sss7State { }; const static uint8_t SSS7_HEADER[] = {0xAA, 0xFE}; +const static uint16_t sss7_timeout = 50; +const static uint16_t sss7_timeout_increment = 1; #define SSS7_PAYLOAD_SIZE 16 #define SSS7_RX_BUFFER_COUNT 2 + extern volatile enum sss7State sss7_state; extern volatile uint8_t sss7_tx_failed; extern uint8_t sss7_rx_active_buffer; @@ -26,6 +29,7 @@ extern uint8_t sss7_rx_oldest_buffer; void sss7_process_rx(void); void sss7_process_tx(void); +void sss7_process_ticks(uint16_t ticks); void sss7_init(void); diff --git a/software/AVR8/timer.c b/software/AVR8/timer.c new file mode 100644 index 0000000..e246382 --- /dev/null +++ b/software/AVR8/timer.c @@ -0,0 +1,28 @@ +#include "timer.h" + +#include +#include + +#include "sss7.h" + +/* +* Timer setting: +* MCU running at 16MHz: +* Prescaler is 64 which results in 250000 ticks per second +* Preloading the counter with 6 leads to 1000 overflow interrupts per second +* or one overflow every millisecond. +*/ + +void timer_init(void) { + TCNT0 = 6; //Preload for 250 ticks to overflow + TIMSK |= (1 << TOIE0); + TCCR0 = (1 << CS00) | (1 << CS01); // Prescaler 64 +} + + + +ISR(TIMER0_OVF_vect) { + TCNT0 = 6; //Preload for 250 ticks to overflow + + sss7_process_ticks(sss7_timeout_increment); +} diff --git a/software/AVR8/timer.h b/software/AVR8/timer.h new file mode 100644 index 0000000..5212cee --- /dev/null +++ b/software/AVR8/timer.h @@ -0,0 +1,7 @@ +#ifndef _TIMER_H_ +#define _TIMER_H_ + +void timer_init(void); + + +#endif