Das erste was ich an deiner Stelle tun würde, ist erst mal
sicherstellen, dass die Taktfrequenz tatsächlich die ist, die du
glaubst.
Das ist nicht weiter schwer. Am Port B scheinst du eine Anzeige zu haben
(LEDs?).
Die kannst du benutzen.
1 | #define F_CPU 16000000
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | DDRB = 0xff;
|
9 |
|
10 | while(1)
|
11 | {
|
12 | PORTB = 0xFF;
|
13 | _delay_ms( 1000 );
|
14 | PORTB = 0x00;
|
15 | _delay_ms( 1000 );
|
16 | }
|
17 | }
|
wie du siehst, wird am Port B abwechselnd das Muster 0xFF und 0x00
ausgegeben, mit jeweils (und das ist der springende Punkt) einem Delay
von 1 Sekunde dazwischen. Genau auf letzteres sind wir aus. Denn die
Zeit stimmt nur dann, wenn die F_CPU Angabe tatsächlich mit der realen
Taktfrequenz des Prozessors übereinstimmt. Läuft der Mega mit 16Mhz,
dann stimmen auch die 1 Sekunde Pausen. Läuft der Mega beispielsweise
mit 8Mhz, dann wechselt die Anzeige alle 2 Sekunden. Läuft er mit 4 Mhz,
dann sind es 4 Sekunden. Und läuft der Mega nur mit 1Mhz dann wechseln
die Ausgänge alle 16 Sekunden den Pegel.
Das sind Zeiten, die kann man auch mit freiem Auge noch gut
unterscheiden.
Solange diese 1 Sekunde nicht da ist, stimmt etwas mit deiner Fuse
Einstellung nicht und er Mege läuft nicht mit 16Mhz, wie du in deinem
Programm angegeben hast.
Das ist der erste Schritt. Solange der nicht erfolgreich absolviert ist,
brauchst du dich um die UART erst mal nicht weiter kümmern. Denn die
korrekte Taktfrequenz ist die Basis für die USART.