From 27321e05de35b494c2b282652e1c40a18435b68b Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Fri, 4 Jun 2021 19:09:07 +0200 Subject: implement uart --- src/main.c | 40 ++++++++++++++++++++++++++++++++- src/uart.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/uart.h | 36 ++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 src/uart.c create mode 100644 src/uart.h (limited to 'src') diff --git a/src/main.c b/src/main.c index c0f35d7..a73e7ef 100644 --- a/src/main.c +++ b/src/main.c @@ -2,24 +2,62 @@ #include #include +#include "uart.h" + +uint8_t t0_ovf_cnt = 0; + +uint8_t pb0_thresh = 128; + ISR(TIMER0_OVF_vect) { cli(); + /*TCNT0 = (1<<7);*/ /* Hack-increase Interrupt trigger freq */ + + t0_ovf_cnt ++; + + if ( t0_ovf_cnt >= pb0_thresh ) + PORTB &= ~(1< + * License: All rights reserved. + */ + +#include "uart.h" + +struct ringbuff_s { + uint8_t buffer[256]; + uint8_t read; + uint8_t write; +} rxc_buf, txc_buf ; + +ISR(USART_RXC_vect) { + cli(); + + /* Discard if buffer full */ + if( rxc_buf.read - 1 == rxc_buf.write ) + goto end; + + rxc_buf.buffer[rxc_buf.write] = UDR; + rxc_buf.write++; + +end: + sei(); +} + +ISR(USART_UDRE_vect) { + cli(); + + /* Prevent interrupt loops */ + if( txc_buf.read == txc_buf.write ) { + UCSRB &= ~(1<>8); + UBRRL = (uint8_t)(UBRR); + + UCSRB |= (1< + * License: All rights reserved. + */ + +/* + * Interrupt controlled UART + */ + +#ifndef _UART_H_ +#define _UART_H_ + +#include +#include +#include +#include + +#ifndef BAUD +#warning BAUD "BAUD not defined. Dafaulting to 9600" +#define BAUD 9600 +#endif + +#ifndef F_CPU +#error "F_CPU not defined" +#endif + +#define UBRR F_CPU/16/BAUD-1 + +void uart_init(); + +uint8_t uart_putchar(char _c); + +uint8_t uart_getchar(char *_c); + +#endif -- cgit v1.2.3