00001 #include <stdio.h>
00002 #include <avr/io.h>
00003
00004 #include "usrat.h"
00005
00006 static uint8_t rx_buffer[RX_BUFFER_SIZE];
00007 static volatile uint8_t rx_buffer_in;
00008 static volatile uint8_t rx_buffer_out;
00009
00013 void usart_init(uint16_t baudval) {
00014
00015 UBRR0H = (uint8_t)(baudval>>8);
00016 UBRR0L = (uint8_t)baudval;
00017
00018 rx_buffer_in = rx_buffer_out = 0;
00019
00020
00021 UCSR0C = (uint8_t)((00<<UMSEL00) | (0<<USBS0) | (3<<UCSZ00));
00022
00023
00024 UCSR0B = (uint8_t)((1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0));
00025
00026 (void)fdevopen(uart_putchar, uart_getchar);
00027 }
00028
00029 static void cts(uint8_t pause) {
00030 if (pause) PORTD |= _BV(5);
00031 else PORTD &= ~_BV(5);
00032 }
00033
00034
00037 int uart_putchar(char data) {
00038
00039 if (data == '\n') {
00040 (void)uart_putchar('\r');
00041 }
00042
00043 while (!(UCSR0A & (1<<UDRE0))) {};
00044
00045 UDR0 = (uint8_t)data;
00046
00047 return 0;
00048 }
00049
00053 int uart_getchar() {
00054 while (!uart_available());
00055
00056 return (int) uart_getc();
00057 }
00058
00061 uint8_t uart_available() {
00062 return rx_buffer_in != rx_buffer_out;
00063 }
00064
00066 uint8_t uart_getc() {
00067 uint8_t result = rx_buffer[rx_buffer_out];
00068 rx_buffer_out = (rx_buffer_out + 1) % RX_BUFFER_SIZE;
00069 if (!uart_available()) cts(0);
00070
00071 return result;
00072 }
00073
00074 void SIG_USART_RECV( void ) __attribute__ ( ( signal ) );
00075 void SIG_USART_RECV( void ) {
00076 rx_buffer[rx_buffer_in] = (uint8_t)UDR0;
00077 rx_buffer_in = (rx_buffer_in + 1) % RX_BUFFER_SIZE;
00078 cts(1);
00079
00080 }
00081
00082