mikrocontroller.net

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


Autor: Micro Tux (microtux)
Datum:

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

Autor: R. W. (quakeman)
Datum:

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

Autor: Micro Tux (microtux)
Datum:

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

Autor: R. W. (quakeman)
Datum:

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

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.