Hallo µC Päpste, ich habe Probleme bei einem Quellcode zur Interruptsteuerung eines PWM - Signals... das TMOD Register ist folgendermaßen konfiguriert: TMOD &= 0xF0 TMOD | 0x01 Was bedeutet diese Schreibweise... die ganze Zeit habe ich lediglich die Schreibweise TMOD = 0x01 verwendet um den Timer0 und 1 als 16-Bit Counter zu verwenden.... Wenn ich mich richtig eingelesen habe, bedeutet das obere Beispiel, dass ich nicht das Setzen des TF abfragen muss while(TF==0) sondern wenn das TF gesetzt wird den Timer starten kann... oder bin ich auf dem Holzweg.... In der ISR selber taucht beim vorsetzten des TH0 Regsiters noch folgendes auf TH0 = 0xFF - (temp>>8)0xFF --> damit kann ich rein gar nichts anfangen... Wieso ich mich damit beschäftige ist so zu erklären.... ich schreibe zur Zeit meine Abschlußarbeit über PWM und verwende zur Steuerung ein Programm das ohne Interrupts arbeitet... mein Lehrer hat mir ein Prgm zur Verfügung gestellt, das ein PWM Signal über INterrupts erzeugt.... das soll ich analysieren und mit in die Doku aufnehemen... hab auch alles verstanden, bis auf diese zwei Sachen....
Step Han schrieb: > Hallo µC Päpste, > > ich habe Probleme bei einem Quellcode zur Interruptsteuerung eines PWM - > Signals... > > das TMOD Register ist folgendermaßen konfiguriert: > > TMOD &= 0xF0 > TMOD | 0x01 Damit werden alle Timer-0-Modes gelöscht, und Timer 0 in den 16-bit-Modus gesetzt, der dann mit dem internen Maschinentakt-Zyklus zählt, üblicherweise 1/12 der Quarzfrequenz. > Was bedeutet diese Schreibweise... die ganze Zeit habe ich lediglich > die Schreibweise TMOD = 0x01 verwendet um den Timer0 und 1 als 16-Bit > Counter zu verwenden.... > > Wenn ich mich richtig eingelesen habe, bedeutet das obere Beispiel, dass > ich nicht das Setzen des TF abfragen muss while(TF==0) sondern wenn das > TF gesetzt wird den Timer starten kann... TF0 kann man ohne installierten Interrupt pollen, und muß es dann auch manuell löschen. Im Interrupt wird es aber automatisch gelöscht, man muß sich dort gar nicht darum kümmern. > oder bin ich auf dem Holzweg.... > > In der ISR selber taucht beim vorsetzten des TH0 Regsiters noch > folgendes auf > > TH0 = 0xFF - (temp>>8)0xFF --> damit kann ich rein gar nichts > anfangen... in der Variable temp steht wohl der Nachladewert drin. Der Ausdruck schiebt den Variablenwert um 8 bit nach rechts, und blendet außer diesen 8 bit alles andere aus.
Wilhelm Ferkes schrieb: > Damit werden alle Timer-0-Modes gelöscht, und Timer 0 in den > 16-bit-Modus gesetzt, der dann mit dem internen Maschinentakt-Zyklus > zählt, üblicherweise 1/12 der Quarzfrequenz. und was passiert mit Timer1, die beiden Timer teilen sich doch das TMOD Register? Wilhelm Ferkes schrieb: > TF0 kann man ohne installierten Interrupt pollen, und muß es dann auch > manuell löschen. Im Interrupt wird es aber automatisch gelöscht, man muß > sich dort gar nicht darum kümmern. ist es denn richtig, das wenn der Timer mit TMOD = 0x01 gesetzt wird, dass dann die Interrupts nicht installiert sind? Wilhelm Ferkes schrieb: > in der Variable temp steht wohl der Nachladewert drin. Der Ausdruck > schiebt den Variablenwert um 8 bit nach rechts, und blendet außer diesen > 8 bit alles andere aus. und was genau habe ich davon....? erspare ich mir da irgendwas anderes zu ändern?
Step Han schrieb: > Wilhelm Ferkes schrieb: >> Damit werden alle Timer-0-Modes gelöscht, und Timer 0 in den >> 16-bit-Modus gesetzt, der dann mit dem internen Maschinentakt-Zyklus >> zählt, üblicherweise 1/12 der Quarzfrequenz. > > und was passiert mit Timer1, die beiden Timer teilen sich doch das TMOD > Register? Ja eben. Richtig. Ein Register mit 8 bit reicht für je 4 Steuerbits für jeden Timer. Deswegen wird da auch 0xF0 UND-verknüpft, um den Modus, die 4 bits, von Timer 1 nicht zu verstellen. Leider kann man nur das ganze Byte in einem Befehl beschreiben. Für eine Änderung eines bits in einem Register muß man dann einmal verUNDen, und einmal verODERn. > Wilhelm Ferkes schrieb: >> TF0 kann man ohne installierten Interrupt pollen, und muß es dann auch >> manuell löschen. Im Interrupt wird es aber automatisch gelöscht, man muß >> sich dort gar nicht darum kümmern. > > ist es denn richtig, das wenn der Timer mit TMOD = 0x01 gesetzt wird, > dass dann die Interrupts nicht installiert sind? Das ist völlig unabhängig, ob der Timer mit oder ohne Interrupt läuft. Wenn man den Interrupt verwenden will, dann muß man den eben in der Software installieren. > Wilhelm Ferkes schrieb: >> in der Variable temp steht wohl der Nachladewert drin. Der Ausdruck >> schiebt den Variablenwert um 8 bit nach rechts, und blendet außer diesen >> 8 bit alles andere aus. > > und was genau habe ich davon....? erspare ich mir da irgendwas anderes > zu ändern? So wie es aus sieht, könnte die Variable temp eine 16-bit-Variable sein, wo der gesamte Timerwert drin steht, also für beide Register TH0 und TL0.
Meine Antwort auf deine früheren Probleme hast du gelesen?? Beitrag "Re: AT89C5131, Displayausgabe, Servosteuerung" Insbesondere den weiteren Beitrag mit dem Hinweis auf http://www.mikrocontroller.net/articles/8051_Timer_0/1
Übrigens... Step Han schrieb: > das TMOD Register ist folgendermaßen konfiguriert: > > TMOD &= 0xF0 > TMOD | 0x01 ^^^ da fehlt ein = für die Zuweisung und ; am Zeilenende darf man auch hier bei C-Code reinschreiben.
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.