X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fmotor_ctrl%2Fuart.c;fp=avr%2Fmotor_ctrl%2Fuart.c;h=24de2f2571c6594a5aa50715f51787f1c708da9c;hp=0000000000000000000000000000000000000000;hb=73f9b5e5a082dd91b6d96fdddbe953afe4362b9d;hpb=b039f1fc2f0d99f315139b441b49cc5386da1459 diff --git a/avr/motor_ctrl/uart.c b/avr/motor_ctrl/uart.c new file mode 100644 index 0000000..24de2f2 --- /dev/null +++ b/avr/motor_ctrl/uart.c @@ -0,0 +1,97 @@ +#include +#include "uart.h" +#include + +#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1) + +static volatile char read[RINGBUFFER_LEN]; +static volatile char *in_read_ptr; +static volatile char *out_read_ptr; + +ISR(USART_RXC_vect) { + // update read from uart + if (UCSRA & (1<> 8); + UBRRL = (uint8_t)UART_UBRR_CALC(rate, F_CPU); + + in_read_ptr = out_read_ptr = read; +} + + +void uart_putc(char *c) { + while (!(UCSRA & (1<out_write_ptr != buffer->in_write_ptr) { + if (UCSRA & (1<out_write_ptr; + if (buffer->out_write_ptr < buffer->write + RINGBUFFER_LEN - 1) buffer->out_write_ptr++; + else buffer->out_write_ptr = buffer->write; + } + } + + // update read from uart + if (in_read_ptr != out_read_ptr) { + *buffer->in_read_ptr = *out_read_ptr; + + // update newline chars + if (buffer->block_read == *buffer->in_read_ptr) buffer->newlines++; + + if (buffer->in_read_ptr < buffer->read + RINGBUFFER_LEN - 1) buffer->in_read_ptr++; + else buffer->in_read_ptr = buffer->read; + + // move pointer + if (out_read_ptr < read + RINGBUFFER_LEN - 1) out_read_ptr++; + else out_read_ptr = read; + } +} +