Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert dieser Timer


von Sebastian (Gast)


Lesenswert?

Hi,

unter C-Control verwende ich einen Timer, den ich gerne verstehen 
möchte. Er dient dazu, eine LED blinken zu lassen.

Hier ist der Code-Schnipsel:
1
Do While True
2
Timer_T0Time(100,PS0_1024)              ' 69,4 µs*100=6,94 ms
3
Port_WriteBit(PORT_PWM,0)               ' LED2 einschalten
4
BUSY=1
5
Do While BUSY=1 : End While
6
Timer_T0Time(200,PS0_1024)              ' 69,4 µs*200=13,84 ms
7
Port_WriteBit(PORT_PWM,1)               ' LED2 ausschalten
8
BUSY=1
9
Do While BUSY=1 : End While
10
End While

Ich verstehe allerdings nicht die Funktionsweise. Hat jemand eine 
Ahnung?

Sebastian

von STK500-Besitzer (Gast)


Lesenswert?

Vermutlich wird "BUSY" in einer/der Interrupt-Service-Routine (des 
Timers) gleich 0 gesetzt.
Vielleicht wird mit "BUSY=1" auch erst der Timer gestartet.
In der Dokumentation zu "Timer_TOTime" sollte das beschrieben sein.
Allerdinsg ist die Angabe in Millisekunden doch sehr kurz.
Das "PORT_PWM" lässt eine Pulsweitenmodulation vermuten...

von Karl H. (kbuchegg)


Lesenswert?

Da muss es noch einen Code-Schnipsel geben, einen Interrupt,
der vom Timer aufgerufen wird. In dieser Funktion wird dann BUSY
wieder auf 0 gesetzt.

Das ganze scheint nach dem Muster zu laufen:
Um eine bestimmte Wartezeit zu warten, wird ein Timer mit einem
bestimmten Wert initalisiert. Der Timer läuft los und zählt
vor sich hin (ob er rauf oder runter zählt, kann ich dem
Code Schnipsel nicht entnehmen). Auf jeden Fall: Wenn er an seinem
Endwert angelangt ist, wird ein Interrupt ausgelöst und in dieser
Interrupt Funktion, wird BUSY auf 0 gesetzt.

Daher: Nachdem der Timer gestartet wird, setzt das Programm BUSY auf
1 und wartet, bis die Interrupt Funktion BUSY wieder auf 0 setzt.
Damit 'weiß' dann dass Programm, das die vorbestimmte Zeit abgelaufen
ist.

von Sebastian (Gast)


Lesenswert?

Vielen, Vielen Dank,

jetzt geht mir ein Licht auf. Der Code der Interrupt-Funktion lautet 
übrigens:
1
Sub Timer0_ISR()
2
    Dim irqcnt As Integer
3
    BUSY=0
4
    irqcnt=Irq_GetCount(INT_TIM0COMP)           ' Interrupt Request Counter
5
End Sub

Grüße

Sebastian

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.