mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Baudrate einstellen


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sami Tiger (sami2008)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hay Thomas,
SCON soll auf 0x52 eingestellt werden für Baudrate 9600,wenn ich deine 
Frage verstanden habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.