mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert dieser Timer


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Do While True
Timer_T0Time(100,PS0_1024)              ' 69,4 µs*100=6,94 ms
Port_WriteBit(PORT_PWM,0)               ' LED2 einschalten
BUSY=1
Do While BUSY=1 : End While
Timer_T0Time(200,PS0_1024)              ' 69,4 µs*200=13,84 ms
Port_WriteBit(PORT_PWM,1)               ' LED2 ausschalten
BUSY=1
Do While BUSY=1 : End While
End While

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

Sebastian

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen, Vielen Dank,

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

Grüße

Sebastian

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.