Forum: Mikrocontroller und Digitale Elektronik Konfiguration Timer AT89C5131


von Step H. (step_h)


Lesenswert?

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....

von Wilhelm F. (Gast)


Lesenswert?

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.

von Step H. (step_h)


Lesenswert?

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?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Bernhard S. (b_spitzer)


Lesenswert?

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

von Bernhard S. (b_spitzer)


Lesenswert?

Ü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
Noch kein Account? Hier anmelden.