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
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.
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.
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
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 ------------------------------------------------------
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.
ok, vielen dank schonmal.. jetzt brauch ich nur noch die baudrateneinstellung... ich hab leider keine ahnung wie ich das jetzt programmier..
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.