Hallo,
ein bisschen bin ich weiter gekommen. Einmal mit meinem Verständnis zum Baudraten-Generator in ATMEL-Controllern. Und ein bisschen in meiner ursprünglichen Behauptung, dass man Baudraten doch optimieren kann (bitte versteht das nicht als Versuch nach dem Motto "ich will doch Recht behalten"). Danke jedenfalls für eure konstruktiven Hinweise zu meiner ursprünglich falschen Auffassung.
Zum besseren Verständnis des Ganzen habe ich mir zwei Rechnungen gemacht: die analytische und die synthetische. Die zugrundeliegenden Formeln stammen aus dem ATMEL-Doc, siehe Tabelle. Zuerst wurde auf der Basis von 20 MHz und der ganzzahligen Vorgabe des UBRR-Wertes eine theoretische Baudrate (mit Nachkommastellen, also RZ = reeller Zahlenwert) errechnet, wie dies PicNick schon getan hatte; Robert, nochmal danke dafür. Zur Zielbaudrate wurde der theoretische Fehler - Zielwert = 100 % - errechnet. Die Kombinationen mit den geringsten Fehlern im entsprechenden Baudratenbereich sind farbig unterlegt.
Danach wurde zu einer vorgegebenen Baudrate als #define xxx ein UBRR-Wert (RZ) errechnet. (Anmerkung: Bei der Berechnung fällt im vorliegenden Fall der Nachkommaanteil erst "zum Schluss" des Rechenganges an, es wird also kein Anteil unkontrolliert mitgeschleppt). Der als #def BD (#define Baudrate) vorgegebene Wert wird etwa so gewählt, dass er rund 0,5 (Nachkommaanteil wird bei der Rechnung im Praeprozessor abgeschnitten) über dem UBRR-Wert mit dem minimalen Fehler im entsprechenden Bereich liegt. So bekomme ich teilweise durch eine "falsche" Vorgabe (farbig unterlegt und farbige Schrift) einen minimalen Fehler.
Wieso? In der Zeile mit dem roten Marker sieht man, was unter den zugrunde gelegten Umständen bei 115k2 passiert: der Praeprozessor berechnet mit dem #define 115200 ein UBRR von 9 - die 0,85 fallen ja weg - und damit einen Fehler von 8,5 % über der Zielrate. Wenn ich im #define nun den Wert 111 000 schreibe, bekomme ich die theoretische Baudrate 113636 und damit einen Fehler von -1,36 %. Auch mein im Eingangsposting genannter #define 113600 ergibt noch ein UBRR von 10 - und damit -1,36 % - die Abweichung, mit der meine Controller-PC-Verbindung noch zurecht kommt. Auch ein #define 56k bringt bei einer Verbindung mit 56k 1,46 %, bei einer Verbindung mit 57k6 nur -1,36 % - - und so weiter. Ich hoffe, dass diese Rechnung dem einen oder anderen hilft - und dass meine Erläuterungen und Rechnungen verständlich (und diesmal richtig) sind.
............Bild hier
Volker: Dumm wirds natürlich bei den internen Oszillatoren. Dann kommen die Schwankungen oder ein Offset des internen Oszillators noch zu den hier genannten Abweichungen. Nach Murphy eben immmer (oder zumindest dann, wenns besonders stört) nach der falschen Seite. Also ist die genaue Kenntnis der Frequenz des internen Oszillators schon wünschenswert - ich weiß allerdings nicht, wie ich das 1. messen sollte und 2. wie ich das korrigieren könnte (zur Korrektur gibts doch irgendeine Speicherzelle - damit kenne ich mich leider nicht aus).
Viel Erfolg
Lesezeichen