Statistics
| Branch: | Tag: | Revision:

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