Added Timeouts (untested)

This commit is contained in:
Sebastian 2016-11-21 09:42:22 +01:00
parent 5da22fff03
commit ba28f387ef
5 changed files with 63 additions and 8 deletions

View File

@ -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

View File

@ -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()) {

View File

@ -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);

28
software/AVR8/timer.c Normal file
View File

@ -0,0 +1,28 @@
#include "timer.h"
#include <avr/interrupt.h>
#include <avr/io.h>
#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);
}

7
software/AVR8/timer.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _TIMER_H_
#define _TIMER_H_
void timer_init(void);
#endif