root / analog_exp / uart.c @ 168:bfc84ee2839b
History | View | Annotate | Download (1.2 kB)
1 | #include <avr/io.h> |
---|---|
2 | #include <avr/interrupt.h> |
3 | #include "uart.h" |
4 | |
5 | // UART buffers
|
6 | volatile char rxbuf[64]; |
7 | volatile uint8_t rdptr = 0; |
8 | volatile uint8_t wrptr = 0; |
9 | |
10 | /**
|
11 | * Set up the UART |
12 | */ |
13 | void uart_setup(void) { |
14 | DDRD |= (1<<TXD_PIN);
|
15 | UBRR0H = 0;
|
16 | UBRR0L = 25;
|
17 | UCSR0A |= (0<<U2X0);
|
18 | UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0); |
19 | } |
20 | |
21 | void uart_putchar(uint8_t c) {
|
22 | while( ! (UCSR0A & (1<<UDRE0)) ); |
23 | UDR0 = c; |
24 | } |
25 | |
26 | int uart_putchar_f(char c, FILE *stream) { |
27 | if(c == '\n') uart_putchar_f('\r', stream); |
28 | while( ! (UCSR0A & (1<<UDRE0)) ); |
29 | UDR0 = c; |
30 | return 0; |
31 | } |
32 | |
33 | void uart_putdata(uint8_t *data, uint8_t count) {
|
34 | int i;
|
35 | for(i=0; i<count; i++) uart_putchar(data[i]); |
36 | } |
37 | |
38 | uint8_t uart_data_available() { |
39 | return !(rdptr == wrptr);
|
40 | } |
41 | |
42 | int16_t uart_getchar(uint8_t blocking) { |
43 | char c;
|
44 | if(blocking)
|
45 | while(rdptr == wrptr);
|
46 | else
|
47 | if(rdptr == wrptr) return -1; |
48 | c = rxbuf[rdptr]; |
49 | rdptr = (rdptr + 1) & 63; |
50 | return c;
|
51 | } |
52 | |
53 | int uart_getchar_f(FILE *stream) {
|
54 | char c;
|
55 | while(rdptr == wrptr);
|
56 | c = rxbuf[rdptr]; |
57 | rdptr = (rdptr + 1) & 63; |
58 | return c;
|
59 | } |
60 | |
61 | /**
|
62 | * UART Receive ISR |
63 | */ |
64 | ISR(USART_RX_vect) { |
65 | rxbuf[wrptr] = UDR0; |
66 | //uart_putchar(rxbuf[wrptr]);
|
67 | wrptr = (wrptr + 1) & 63; |
68 | if(wrptr == rdptr) rdptr = (rdptr + 1) & 63; |
69 | } |
70 |