Forum: Mikrocontroller und Digitale Elektronik Baudrate einstellen


von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Sami T. (sami2008)


Lesenswert?

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
Noch kein Account? Hier anmelden.