Hi, folgende Merkwürdigkeit ist mir aufgefallen:
Wenn ich die Eingestellte Baudrate 115200 benutze, und mir die Ausgaben
auf Br@ys Terminalprogramm anzeigen lassen will, dann kommen nur wirre
Zeichen über die Schnittstelle. Wenn ich im Terminal als Rate 128000
einstelle, dann funktionierts ohne Probs. Warum aber mit dem falschen
Wert und nicht mit dem Richtigen?
Hier ist meine #def und die Uart init.
#define BAUD 115200UL
#define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1)
void uart_init(void)
{
UCSRB |= (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
UCSRC |= (1<<URSEL) | (3<<UCSZ0);
UBRRH = (char) (UBRR_BAUD>>8);
UBRRL = (char) UBRR_BAUD;
}
Resonatoren werden im schlimmsten Fall auch mit +/- 1% angegeben,
trozdem sollte es nicht von 115k2 auf 128k drifen...
Was für eine Resonatorfrequenz benutzt du? Ist in F_CPU evtl. noch ein
falscher Wert drin?
schonmal die Werte zu Fuss berechnet und in die Register geladen?
Hast du ein Oszi? Evtl. mal die Impulszeit der Bits messen. 8,68us
(115k2) zu 7,812us (128k) sollte man eigentlich sehen...
Gruß Micha,
>(char)
sollte eher (unsigned char) heissen.
Vermutlich ist dein Resonator nicht so genau in seiner Frequenz.
Probier's doch mal mit einem Quarz(-oszillator).
Hab mal die Register manuell beschrieben:
UBRRH = 0;
UBRRL = 3; // weil F_CPU/16*BAUDRATE - 1 = 3,3
geht aber immer noned mit der richtigen Einstellugn.
ähm, hüstel det geht aber net!
Laut Datenblatt bei 8MHz und 115k2 macht das 8,5% abweichung... 115k2 *
1,085 = 124,992kbaud...
Baudratenquarz benutzen, Übertragungsgeschwindigkeit runter, oder
wenigstens U2X = 1 setzten, dann sinds aber immer noch -3,5% !!!
Gruß Micha,
So,
Impulszeiten sind: ca. 8,1 µs. Komisch, müssten doch 8,6 sein....
Vielleicht dann deswegen weil 8,1 näher an 7,812us (128k) liegt als
8,68us
(115k)...
Verkehrte Welt!
Jo, laut Datenblatt von Atmel (doc2486.pdf S. 161) hast du bei 8 MHz und
UBRR=3 eine +8,5% Fehlanpassung. Mit U2X=1 Einstellung und UBRR=8
könntest du die Fehlanpassung auf -3,5% senken. Noch besser würde es mit
einem "Baudratenquarz" von z.B. 7,3728 MHz klappen - Fehlanpassung 0,0%!
Was soll denn das für eine serielle Schnittstelle im PC sein?
Die üblichen Onboard-Standardschnittstellen verwenden (als IP-Core)
einen mit 1.8432 MHz angesteuerten 16C550 und können deswegen maximal
mit 115200 Baud (1.8432 MHz / 16) betrieben werden.
Daß man im "Terminalprogramm" irgendwelche Werte einstellen kann, hat
keinerlei Bedeutung, da nicht der verwendete Devicetreiber nach
möglichen Baudraten abgefragt wird.
Werden nicht erzeugbare Baudraten eingestellt, wird der nächstbeste Wert
verwendet; und der ist bei 16C550 & Konsorten das Resultat einer
ganzzahligen Division von 115200 - die nächstkleinere Baudrate ist also
57600 (/2), gefolgt von 38400 (/3) etc.