Hallo zusammen!
Ich habe z.Z. ein Problem mit einem Atmega64 bei dem die
UART-Kommunikation nicht so funktioniert wie gewollt. Heißt im Klartext,
dass in meinem Terminalprogramm trotz Einstellung der richtigen
Baudrate, der richtigen Anzahl der Stopbits und keinem Paritätsbits nur
"Müll" angezeigt wird.
Die Berechnung der Baudrate und die Initialisierung der USART Register
wurden wie folgt relisiert:
1 | #define F_CPU 16000000UL
|
2 | #define BAUD_LOW 19200UL //19.2 kBaud
|
3 | #define UBRR_BAUD_LOW ((F_CPU/(16*BAUD_LOW))-1)
|
.
.
.
1 | UBRR1H = UBRR_BAUD_LOW >> 8;
|
2 | UBRR1L = UBRR_BAUD_LOW & 0xFF;
|
3 | UCSR1A = 0x00;
|
4 | UCSR1C |= (1<<UCSZ11)|(1<<UCSZ10);
|
5 | UCSR1B |= (1 << TXEN1) | (1 << RXEN1) | (1 << RXCIE1);
|
Überprüfe ich im Debugging die Register, werden diese auch alle richtig
gesetzt. UBRR hat den Wert 51 und die oben gesetzten Bits sind auch alle
da!
Mit dem Oszi habe ich jetzt die Breite eines Bits ermittelt (ca. 52ms).
Diesen Wert mit 10 (Startbit, Stopbit und 8 Datenbits) multipliziert
ergibt eine Baudrate von 1923, was sich verdächtig um den Faktor 10 zu
der gewollten Baudrate unterscheidet. Allerdings fehlt mir mittlerweile
absolut die Idee woran es noch liegen könnte.
Noch eine Anmerkung zum Quarz:
- Die Fuses sind alle richtig gesetzt! CKOPT ist gesetzt und
EXTHIFKTALRES_16KCK_64MS.
- Die Quarzfrequenz konnte ich leider nicht direkt messen, da ich keinen
diferentiellen Tastkopf zu Verfügung habe. Ich habe jedoch die ISP Clock
auf 4MHz (1/4 * 16MHz) eingestellt und hier war ein Programmieren noch
möglich. Drüber hinaus war das programmieren nicht mehr möglich. Damit
habe ich für mich erst einmal ermittelt, dass der Quarz auf der
richtigen Frequenz von 16MHz schwingen muss.
Ich hoffe, ihr habt eine gute Idee woran es noch liegen könnte!
Gruß
Andreas