Baudrate exakt einstellen

Gast #33195
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
Gast #33196
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.
Gast #33198
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.
Gast #33200
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
------------------------------------------------------
Gast #33201
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren