Guten Abend zusammen, ich verzweigel langsam. mit dem folgendem code kann ich super daten bis 4800 baud übertragen.
1 | #define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
2 | #include <stdint.h> |
3 | #include <util/delay.h> |
4 | #include <avr/io.h> |
5 | #include <avr/interrupt.h> |
6 | |
7 | |
8 | #define BAUD 4800UL // Baudrate
|
9 | #define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1) // clever runden
|
10 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
11 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
12 | |
13 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
14 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
15 | #endif
|
16 | |
17 | |
18 | void uart_init(void) |
19 | {
|
20 | UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); // UART TX einschalten |
21 | UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 |
22 | |
23 | UBRRH = UBRR_VAL >> 8; |
24 | UBRRL = UBRR_VAL & 0xFF; |
25 | }
|
26 | |
27 | void uart_senden_c(char zeichen) |
28 | {
|
29 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
30 | {
|
31 | }
|
32 | |
33 | UDR = zeichen; |
34 | |
35 | return; |
36 | }
|
37 | |
38 | |
39 | ISR(USART_RXC_vect) |
40 | {
|
41 | |
42 | uart_senden_c( UDR+1); |
43 | |
44 | |
45 | }
|
46 | |
47 | |
48 | int main() |
49 | {
|
50 | |
51 | uart_init(); |
52 | sei(); |
53 | |
54 | |
55 | while(1) |
56 | {
|
57 | |
58 | |
59 | |
60 | |
61 | |
62 | }
|
63 | |
64 | return 0; |
65 | }
|
Wenn ich jedoch mit 9600 Baud daten übertragen möchte kommt es zu absolutem Blödsinn. ich empfange dann nur irgendwelche zusammenhanglosen Bytes. Kann mir jemand sagen was ich falsch mache? System... ATmega8 - 16 Externer 16Mhz Quarz Vielen Dank.