Forum: Mikrocontroller und Digitale Elektronik AT89C52, einie Verständnisfragen


von Micro T. (microtux)


Lesenswert?

Hallo

Ich betreibe mit meinem AT89C52 eine Serielle Übertragung, doch bei der 
Konfiguarion, die ich übernommen habe, treten einige Fragen auf, welche 
ich auch nicht mit dem 8051-Datenblatt beantworten kann.

SCON = 82; - somit aktiviere ich Mode2 (9-bit UART), REN und TI; was 
genau bedeutet das 9-bit UART, das REN und warum wird TI von mir 
gesetzt, normalerweise wird das doch vom µC selber gesetzt oder?

TH1 = 250;
TL1 = 250;
TH1 ist klar, mit dem stell ihc meine Baudrate ein, aber was mach ich 
dann mit TL1?

THO = 6;
TL0 = 6;
Was wird damit eingestellt?

Das wars vorerst, Danke im Voraus

von R. W. (quakeman)


Lesenswert?

Also es wäre hilfreich, wenn du den gesamten Code Teil der für die 
Initialisierung zuständig ist posten würdest.

Nun zu deinen Aussagen:

Den seriellen Mode 2 mit 9 Bit benutzt man eigentlich nur, wenn man z.B. 
ein Paritätsbit mit übertragen will als einfache Fehlererkennung.
Mit SCON = 0x82 setzt du die Schnittstelle aber auf Mode 1 (8 Bit) und 
nicht Mode 2, was ich auch für sinnvoll halte.

Und das setzen des TI Flags kann unter Umständen Sinn machen um den 
Sendevorgang zu starten, je nach Implementierung. Das kann man aber nur 
anhand des Codes entscheiden.

Mit dem setzen von TL1 wird der Startwert des Auto-Reload Timers 1 aus 
den Startwert gesetzt. Man kann sich das auch sparen, da der Timer nach 
dem Start nur das allererste mal von 0 bis 255 durchläuft und ab dann 
automatisch mit dem Reloadwert TH1=250 nachgeladen wird.

Die Werte von Timer 0 sind für die serielle Schnittstelle irrelevant und 
deren Funktion kann nur anhand des Codes herausgefunden werden.

Ciao,
     Rainer

von Micro T. (microtux)


Lesenswert?

Hallo, Danke schon mal für die schnelle Antwort.

Ich setz SCON nicht auf 0x82 sondern 82, entspricht 0x52, somit Mode2 
oder?

TH0=6;
TL0=6;

Mit diesen Werten möchte ich einen Interrupt auslösen der sich ca. alle 
250µs aufruft, das geht doch so?

Das mit TL1 hab ich jetzt nich kapiert, könntest du das nochmal erklären 
bitte?

von R. W. (quakeman)


Lesenswert?

Du hast natürlich Recht, das du 82dec und nicht 82hex verwendest wie ich 
fälschlicherweise gelesen hatte. :)
Somit wird auch Mode2 bei dir verwendet, wenn ich das auch immer noch 
für unsinnig halte.

Bei 12MHz Quarz und einem auto-reload Timer0 kannst du mit deinen Werten 
für TL0 und TH0 deine 250µs Interruptroutine realisieren.

Und wegen TL1 erst mal kurz zum Verständnis der Arbeitsweise des 
auto-reload Timers. Das niedrige Register TL1 stellt dabei den 
eigentlichen Zähler dar und das hohe Register TH1 beinhaltet den reload 
Wert, welcher bei einem Überlauf in TL1 geschrieben wird. Wenn du nun 
TL1 zu Beginn nicht mit dem reload Wert vorbelegst läuft der Timer das 
aller erste mal von 0 bis 255 durch. Dann kommt der Überlauf und in TL1 
wird der reload Wert geschrieben. Von nun an läuft der Timmer jedes mal 
nur noch vom reload Wert beginnend bis 255 durch bevor er sich wieder 
erneut nachlädt. Wenn du nun in TL1 direkt zu Beginn gleich den reload 
Wert einmal reinschreibst läuft der Timer auch das aller erste mal 
gleich von diesem Wert erst aus los.
Meine Erfahrung mit der seriellen Schnittstelle hat aber gezeigt, daß 
das vorbelegen des Startwertes in den meisten Fällen unnötig ist, da der 
Timer sowieso nur ein einziges mal zu Beginn vom falschen Wert (0) 
startet.

Ciao,
     Rainer

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.