PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART baud-problem



µcFlo
12.10.2013, 23:38
Guten Tag,
ich habe noch recht wenig Erfahrung mit µcs. Nun habe ich ein Problem mit der Baudrate. Ich verwende einen ATmega8 und wollte eigendlich mit einer Frequenz von 8 Mhz und einer Baudrate von 9600 über den USART senden. Doch bei 8 Mhz kommt nur Schrott an. Wenn ich es aber auf 1 Mhz laufen lasse funktioniert es gut.

Da ich in C programmiere beziehe ich den UBRR-Wert über die Include-Datei "setbaud.h".


#define F_CPU 1000000 // bzw. 8Mhz
#define BAUD 9600
#include <util/setbaud.h>

void usart_init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
#warning "U2X wird genutzt"
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
}
Aber laut den Rechnungen die ich auf "www.mikrocontroller.net" gefunden habe habe ich bei 8 Mhz eine geringere Abweichung (unter 1%) als bei 1 Mhz (über 1%). Es wird bei 1 Mhz auch der U2X-Modus genutzt.

Nun Frage ich mich natürlich was da Falsch läuft. Ich stelle natürlich auch immer den intern Takt um, wenn ich die Frequenz im Code ändere.

Ps.: Da ich gelesen habe, dass es in den meisten Fällen um Hardware Probleme geht, wenn es zum USART kommt, habe ich den Post einfach mal hier gemacht.

Vielen Dank,
Flo

oberallgeier
12.10.2013, 23:56
Hallo Flo!
... 8 Mhz und einer Baudrate von 9600 ... kommt nur Schrott ... auf 1 Mhz ... gut ...Ich interpretiere mal aus Deinen Angaben, dass Du ohne Quarz fährst, mit dem internen Prozessortakt. Der weicht erfahrungsgemäß deutlich vom genau(er)en Quarztakt ab, sodass Deine fehlerhaften Ergebnisse schon erstmal einen glaubhaften Hintergrund haben. Es kommt aber auch auf das Übertragungsverfahren an - ich fahre bis in die Gegend von 600MBd (<= die MBd sind schlichte Kilobaud) mit nem 20 MHz-Quarz mit einem Ringspeicher und interruptgetriebener UART-Routine.

Vermutung: mach nen Quarz dran (mit entsprechenden Kondensatoren und Fusebits), dann wirds gehen. Besonders sinnvoll sind spezielle Quarze mit "krummen" Frequenzen, die Vielfache der Übertragungsraten sind . . .

Nachtrag: mit Megabaud, siehe oben, sind natürlich die tausendmal langsameren Kilobaud gemeint - sorry.

Besserwessi
13.10.2013, 00:25
Der Mega8 nutzt bei 1 MHz bzw. 8 MHz einen anderen internen Oszillator (neuere Chips wie Mega88 haben nur einen Teiler). Da kann der 8 MHz Oszillator mehr daneben lieben als der interne 1 MHz Takt, auch zusammen mit dem Rundungsfehler. Für einen zuverlässige UART sollte man einen Quarz benutzen, oder wenigstens den Oszillator bei der genutzten Spannung abgleichen.

µcFlo
13.10.2013, 14:35
Danke für eure Antworten,
ich hab jetzt erst mal ein 8 Mhz Quarz drann gemacht und es läuft einwandfrei.
Ich werde gleich morgen noch ein Baudratenquarz kaufen gehen.

Vielen Danke
Flo

oberallgeier
13.10.2013, 14:52
... ich hab jetzt erst mal ein 8 Mhz Quarz drann gemacht und es läuft einwandfrei ...Schön dass Du Erfolg hattest - und das trotz meiner übertriebenen Angabe von oben (da meinte ich mit "über 600MBd" nämlich die taustendmal langsamere Rate von Kilobaud :.-./ ).