Forum: Mikrocontroller und Digitale Elektronik Baudrate exakt einstellen


von Chris Dorner (Gast)


Lesenswert?

Hallo,
Ich arbeite für die Schule an einem Projekt, wo unter anderem Daten vom 
Microcontroller (AT89S8252) über die serielle Schnittstelle an den PC 
übertragen werden (eigene PC-Software [C++], bzw. Hyperterminal zum 
testen).
folgendes Problem:
Ich programmiere den MC mit Keil uVision mit assembler. Der Debugger 
dort zeigt mir bei gesetztem BD eine Baudrate von 8012 an. Da man am PC 
nicht so wirklich solche krummen Raten einstellen kann, führt dies zu 
einer verfälschung bei der Datenübertragung.
Frage: wie kann ich jetzt die Baudrate am Microcontroller so genau 
einstellen, damit ich gängige Werte erreichen kann (9600, 4800, ...)

Vielen Dank schonmal für die antworten

von crazy horse (Gast)


Lesenswert?

geht nur exakt, wenn du auch den passenden Quarz verwendest. Die 
Baudrate wird aus der Quarzfrequenz über (einstellbare) Teiler erzeugt, 
und das geht nunmal nur mit ganzen Zahlen.
Bist du an die Quarzfrequenz gebunden, hilft nur: runter mit der 
Baudrate, da findet man dann meist einen passenden Teilerwert. Schreib 
mal, welchen Quarz du hast.

von Chris Dorner (Gast)


Lesenswert?

das ist ein 12 Mhz-Quarz...

von crazy horse (Gast)


Lesenswert?

4800 baud bekommt man mit dem 12MHz-Quarz noch gut hin (TH1=-13)-> 
Baudrate=Quarz/16/12/13=4807) das passt. Ansonsten einen 11.094MHz-Quarz 
verwenden, dann kannst du alle gängigen Baudraten benutzen.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Einen Fehler bis max 2,5% verträgt die RS-232, wenn man nicht gerade 
super lange Leitungen verwendet.

Anbei die Liste der möglichen Baudraten und Teilerfaktoren bei 
Verwendung von T1 bzw. T2 für die UART.


Peter

von Chris Dorner (Gast)


Lesenswert?

ok gut, und wie programmier ich das dann?

einfaches beispiel: (sendet '1' über serielle schnittstelle)
---------------------------------------------------
$nomod51
$include(reg515.inc)


start:     mov SCON,#01000000b  ;Serielle Schnittstelle auf Mode 1 
setzen

    setb BD

bla:    mov A,#31H
    clr TI
    mov SBUF,A
    jnb TI,$

end
------------------------------------------------------

von crazy horse (Gast)


Lesenswert?

oh, lange nichts mehr mit 51er in Assembler gemacht, es fehlt aber noch 
die Baudrateneinstellung.
Laufzeitmässig ist es aber besser, das TI-Flag vor dem Schreiben nach 
SBUF zu prüfen. Mit deinem Programm wartest du die ganze Zeit, bis das 
Zeichen auch raus ist.
also:
jnb TI, §
clr TI
mov SBUF, A
Damit kannst du die Zeit, während die UART sendet, für andere Aufgaben 
nutzen.

von Chris Dorner (Gast)


Lesenswert?

ok, vielen dank schonmal..
jetzt brauch ich nur noch die baudrateneinstellung...
ich hab leider keine ahnung wie ich das jetzt programmier..

von Peter D. (peda)


Lesenswert?

Das kann aber voll ins Auge gehen, wenn Du den AT89S8252 verwendest, 
aber den

$include(reg515.inc)

als Zielprozessor definierst.
Wie man den T1 oder T2 als Baudratengenerator verwendet findest Du im 
AT89S8252 Datenblatt.


Peter

von Chris Dorner (Gast)


Lesenswert?

ok, habs hingekriegt, wie das geht... aber irgendwie sendet der immer 
noch müll...

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.