Hallo, ich habe angefangen, mich mit dem Programmieren von Mikrocontrollern zu beschäftigen und habe wohl ein Problem mit dem Verständnis der Baudratengenerierung und hoffe, dass mir hier jemand einen kleinen Denkanstoß geben kann. Verwendet wird ein AT89C51CC03 der mit 20 MHz getaktet wird. Per FLIP kann ich diesen mit 38400 Baud ansprechen und auch programmieren. Ich habe das Beispielprogramm von Atmel für die serielle Schnittstelle genommen und auf den verwendeten Quarz angepasst, so dass ich mit 9600 Baud arbeiten kann. Laut dem Baudratenrechner (Atmel Excel-Sheet) muss X2=0, SMOD1=0 und das Reloadregister des Timer1 auf Dez. 245 eingestellt werden. Die Terminalprogramme, die ich zum testen verwende (Hercules Setup, Tera Term) sind auf 8N1 eingestellt. Es kommt aber egal bei welcher Einstellung immer nur Datenmüll zurück. Um sicher zu gehen, habe ich dann mal den Quarz gegen einen mit 11.0592 MHz ausgetauscht und das unveränderte Beispielprogramm darauf losgelassen. Bei diesem ist der Timer1 (8-bit Auto-reload) so eingestellt, dass bei dem 11er Quarz eine Baudrate von 9600 Baud erzielt wird. Und siehe da, es funktioniert, nur nicht mit 9600, sondern mit 38400 Baud (Faktor 4). Habe mir darauf hin das CKCON Register ausgeben lassen, aber das war auch ==0, also kein X2 Mode, was ja eigentlich auch nur zu einer Verdopplung der Baudrate führen sollte. Spaßeshalber hab ich dann einfach mal den 20 MHz Quarz wieder eingelötet und mit dem gleichen Programm wie für den 11er Quarz laufen lassen. Komischer Weise funktioniert der auch mit 38400 Baud einwandfrei, allerdings bei gleichen Einstellungen, wie für 11.0592 MHz. Warum ist das so? Was kann ich falsch gemacht haben? Schönen Dank im voraus Gruß, Thomas
Habe gerade gemerkt, dass immer genau die Baudrate eingestellt bleibt, mit der ich den Controller beschrieben habe. Hier ist der Code, mit dem ich die serielle Schnittstelle initialisiere void init_serial(){ EA = 0; SCON = 0x50; // 8-bit UART, REN PCON = 0x80; // doppelte Badrate TMOD |= 0x20; // Timer1 8-bit auto-reload TH1 = 0xFD; // Wert zum Nachladen (9600 Baud bei 11.0592 MHz) TL1 = 0xFD; // Startwert ES = 1; // Seriellen Port einschalten TR1 = 1; // Timer1 an } Thomas
Hay Thomas, SCON soll auf 0x52 eingestellt werden für Baudrate 9600,wenn ich deine Frage verstanden habe.
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.