Hi.
Also ich denke gerade am anfang wenn man versucht mit UART zu spielen
könnte das nützlich sein.
Getestet auf einem STK500 mit ATMEGA8515L Chip.
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 |
|
4 | #ifndef F_CPU
|
5 | #define F_CPU 3686400
|
6 | #endif
|
7 | #define UART_BAUD_RATE 9600
|
8 | #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU) /
|
9 | ((UART_BAUD_RATE)*16L)-1)
|
10 |
|
11 | unsigned char get;
|
12 |
|
13 | int uart_putc(unsigned char c)
|
14 | {
|
15 | while (!(UCSRA & (1<<UDRE)));
|
16 | UDR = c;
|
17 | return 0;
|
18 | }
|
19 |
|
20 | int main(void)
|
21 | {
|
22 |
|
23 | UCSRB |= (1<<TXEN); //Transmitter Enabled
|
24 | UCSRC |= (1<<URSEL) | (3<<UCSZ0); //Asynchron 8N1
|
25 |
|
26 | UCSRB |= (1<<RXEN); //Emfpang enabl
|
27 |
|
28 | UBRRH=(uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
|
29 | UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
|
30 |
|
31 | DDRB = 0xFF;
|
32 | PORTB = 0xFF;
|
33 |
|
34 | while(1)
|
35 | {
|
36 |
|
37 | while(!(UCSRA & (1<<RXC)))
|
38 | {
|
39 | PORTB = ~get;
|
40 | }
|
41 | get = UDR;
|
42 | uart_putc(get);
|
43 |
|
44 | }
|
45 | }
|