Hallo,
finde den Fehler leider nicht, bei 1MHz geht es wunderbar, bei 10MHz
geht gar nichts mehr.
Hier die Files:
uart.c:
1 | /*** uart.c ***/
|
2 | #include <avr/io.h>
|
3 | #include "uart.h"
|
4 |
|
5 | void init_uart(void)
|
6 | {
|
7 | UBRR0H = (unsigned char)(UBRR_VAL>>8); // UBRR = UART Baud Rate Register
|
8 | UBRR0L = (unsigned char)(UBRR_VAL); // UBRR Register zum berechnen/setzen der Baudrate
|
9 |
|
10 | UCSR0B = (1<<TXEN0) | (1<<RXEN0); // tx & rx enable
|
11 | // Wenn TXEN und RXEN gesetzt ist, arbeitet die UART,
|
12 | // sonst sind die PINS normale I/O-Pins
|
13 |
|
14 | UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // Asynchron 8N1
|
15 | }
|
16 |
|
17 | void uart_putc(unsigned char c)
|
18 | {
|
19 | while (!(UCSR0A & (1<<UDRE0)))
|
20 | {
|
21 | /* warten bis Senden moeglich */
|
22 | }
|
23 | UDR0 = c; // UDR0 = UART Data Register
|
24 | // Hier werden Daten zwischen UART und CPU übertragen
|
25 | }
|
uart.h:
1 | /*** uart.h ***/
|
2 | #ifndef uart_h
|
3 | #define uart_h
|
4 |
|
5 | #define BAUD 9600UL // Baudrate
|
6 |
|
7 | #ifndef F_CPU
|
8 | //#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 14745600UL"
|
9 | #define F_CPU 9216000UL // Systemtakt in Hz
|
10 | // Definition als unsigned long beachten
|
11 | // Ohne UL ergibt Fehler in der Berechnung
|
12 | #endif
|
13 |
|
14 | // Berechnungen
|
15 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
16 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
17 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
18 | // Fehler in Promille, 1000 = kein Fehler
|
19 |
|
20 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
21 | //#warning "Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!"
|
22 | #endif
|
23 |
|
24 | void init_uart(void);
|
25 | void uart_putc(unsigned char c);
|
26 | #endif /* uart_h */
|
ps. Habs (wie man sieht) jetzt mal mit 9216000 Hz probiert, wegen der
Rundung.
Bitte um Hilfe.
Danke schön.
Mfg