Hallo, ich habe ein 8051 kompatiblen µC von Atmel auf einem Testboard mit einem 12Mhz Oszillator. Damit will ich unter Anderem einen Dialog zu einem Terminal über serielle Schnittstelle implementieren. Ich würde gerne variable Baudraten unterstützen, deshalb nehme ich den Timer1 als 8Bit-Reload Timer/Counter. Das Problem ist aber, dass ich nur Baudraten bis 4800baud hinbekomme, bei höheren Baudraten ist der Reloadwert zu ungenau. Gibt es da nicht einen Trick, damit ich Baudraten von 9600, 19200 oder höher implementieren kann, ohne den Oszillator zu wechseln? Bei 11,0592Mhz funktionieren die ja wunderbar. Ich habe jedoch schon das fertige Board und will keine Veränderungen mehr daran vornehmen. Rob
Hallo Rob das ist wohl ein Thema das jeden mal trifft. Das Quarz-Thema ist besonders unangenehm wenn Du gleichzeitig 9600 Baud und einen Timer mit genau 1 Sekunde brauchst. Bei Deinem Problem kannste vielleicht über die Anzahl der Stopp-Bits verhindern daß ein Fehler erzeugt wird (Framingerror, Parity-Error). Aber nur wenn der Baudrate-Fehler kleiner als 1 Baudrate-Takt - bezogen auf die Übertragung eines Zeichens - ist, kann man mit dem Fehler leben. Eine Software-Korrektur oder wie auch immer ist mir nicht bekannt, da man die internen UART-Abläufe nicht beeinflussen kann. Gerhard
@Gerhard "Das Quarz-Thema ist besonders unangenehm wenn Du gleichzeitig 9600 Baud und einen Timer mit genau 1 Sekunde brauchst." Warum ? Die Baudraten sind doch ganzzahlig. Nimm einfach den richtigen Quarz für die Baudrate und berechne daraus den Teiler für die 1 Sekunde. Peter
Hallo Peter hast recht.Man muß bloß vorher schon mal rechnen. z.B. 2,4576 Mhz, 4,9152MHz... die gibts und da gehts auf. Gerhard
R2P2: Welche einrichtungen hat denn deim MC um Baudraten zu erzeigen? Es bibt ja Timer(0|1)(weis jezt garnicht welcher es eigendlich ist) und bei den zu 8052 kompatieblen noch den geneuaren Timer2 und bei manchen och den BaudrateGenerator(Benutze ich mit meinem AT89C51SND1). Mit dem timer2 komme ich mit einem AT89S8252 bei 24MHZ genau(0.16% oder so error) auf 57600Baud. Auf der keil website gibt es ueberigens einen guten online rechner, mit dem man baudraten und passende reloadwerte bestimmen kann. Gruß Tobias
Oder nimm den AT89C51xC2 Der hat einen eigenen Baudraten Timer. Damit sind ebenfalls 57600 Baud bei 24MHz möglich. (wenn man das X2 Bit setzt, wird der Takt verdoppelt, und es sind sogar 115200 möglich)
Naja, Danke für die Antworten, vorallem für den Tip mit dem Baudraten-Rechner bei keil.com, aber geholfen hat mir das bisher noch nicht so richtig. Ich will ein Programm für Kommunikation mit einem Terminal oder Modem mit variabler Baudrate, also 300, 600, 1200, 2400, 4800, 9600, 19200, 38400 und 57600baud oder so, aber nur diese Standard-Baudraten, die auch jedes Terminal versteht. Dazu verwende ich, wie gesagt den Timer1 im Mode 2 als 8Bit-Reload Timer. Ich habe ein fertiges Board, was ich nicht verändern will, also auch keinen Quarz wechseln. Mit dem 11,0592Mhz Standard-Oszillator gehen die Baudraten ja alle, aber mit meinem 12Mhz-Quarz halt nicht. Das habe ich selber ausgerechnet und getestet und der keil-Rechner bestätigt mein Ergebnis auch noch mal. Selbst mit dem Timer2 bekomme ich nur Baudraten bis 9600baud, laut keil-Rechner. Da muss ich mich wohl mit dem Ergebnis zufrieden geben, das höhere Baudraten so nicht funktionieren... das ist ja auch eine Erkenntnis Also Danke nochmal
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.