Wahrscheinlich wieder das 'übliche Problem'
1 | void USART_init (void)
|
2 | {
|
3 | // USART initialization
|
4 | // Communication Parameters: 8 Data, 1 Stop, No Parity
|
5 | // USART Receiver: On
|
6 | // USART Transmitter: On
|
7 | // USART Mode: Asynchronous
|
8 | // USART Baud rate: 9600
|
9 | UCSRA=0x00;
|
10 | UCSRB=0x18;
|
11 | UCSRC=0x86;
|
12 | UBRRH=0x00;
|
13 | UBRRL=0x33;//67
|
14 | }
|
wo kommen die 67 her?
und warum schreibst du 0x33, wenn du 67 meinst. Schreib doch gleich 67,
dann brauchst du keinen Kommentar. Aber eigentlich ist auch das
unsinnig, denn den Zahlenwert kann der Compiler wunderbar aus der
Cpu-Taktfrequenz und der gewünschten Baudrate auch selber ausrechnen.
So etwas
ist sowieso ein Sargnagel. Die Bits haben Namen! Diese Namen benutzt man
auch, damit man im Source Code sehen kann, welche Bits gesetzt sind (wie
die heissen). Denn mit den Bitnamen hast du im Gehirn eine Bedeutung
verknüpft. Damit, dass das Bit 4 gesetzt ist, hab ich überhaupt nichts
verknüpft. Das muss ich erst mal im Datenblatt nachsehen, was das
überhaupt für ein Bit ist, bis es dann endlich bei mir klingelt, dass
hier (beispielweise) der Transmitter Empty Interrupt freigeschaltet
wird.
Fazit: Es ist nicht schlau, generell einfach überall Hex-Zahlen zu
benutzen. Die Art und Weise wie Zahlen angeschrieben werden, sei es als
Dezimalzahl, sei es als Hex-Zahl, sei es als ASCII-Character, oder sei
es auch in Form der Bitnamen-Verschiebe Schreibweise, richtet sich nach
dem Einsatzzweck und welche Form dort am klarsten die Absicht ausdrückt.
Technisch gesehen, machen
1 | c = 'A';
|
2 | c = 65;
|
3 | c = 0x41;
|
4 | c = ( 1 << 6 ) | ( 1 << 5 ) | ( 1 << 2 ) | ( 1 << 1 );
|
5 | c = 0b01100101;
|
alles dasselbe: in c wird das Bitmuster 01100101 abgelegt. Und trotzdem
ist je nachdem, wofür dieses c verwendet wird, die eine oder andere Form
die klarste, weil sie die beasichtigte Wirkung am besten ausdrückt.
Zurück zum Problem.
Wenn dein AVR in der Zeichen-Ausgabe ein 'x' ausgibt, am PC aber alles
mögliche andere ankommt, dann stimmt die Baudrate nicht.