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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.