Sekunden zählen mit einem Timer

Gast #1236438
Lesenswert?

Hi,
ich versuche mich gerade in die Timer und die Interrupts eines 
Mikrocontrollers einzuarbeiten.
Mein erstes Ziel ist es, dass nach ca. 5 sekunden ein Bit (P0.2) 
invertiert wird.

Wenn es 1 ist soll es danach 0 sein und andersrum.
Leider scheiter ich schon bei diesem wohl kleinen Code.

Verwenden tue ich einen 80535 mit 12 MHz.
Als Timer verwende ich den Timer0.
Momentan läuft er im Modus 01 (16Bit Timer).
Bei jedem Overflow-Interrupt wird das Bit P0.2 invertiert.

Das funktioniert auch ganz gut. Nur ich bekomme es nicht hin (bzw. ich 
weiß nicht wie) ich das mit den 5s mache.
Beim Timer0 kann man ja den Vorteiler nicht einstellen?!
Oder gibt es dafür eine andere Möglichkeit?

Ich programmieren NUR in Assembler.

Mein Code sieht bis jetzt so aus:
1
mov p0,#0
2

3
    ljmp main     
4
org 0Bh         
5
    call timerfuntkion
6
    reti
7
    
8
main:
9
    mov  040h, #0 
10
    mov  TMod, #01
11
    setb IE.1 
12
    setb EA
13
    setb TCon.4
14
w:  sjmp w
15

16
timerfuntkion:
17
    cpl p0.2
18
    ret
19
end

Ich hoffe ihr könnt mir da weiterhelfen.

Lg
Uwe
Gast #1236446
Lesenswert?

>Beim Timer0 kann man ja den Vorteiler nicht einstellen?!
>Oder gibt es dafür eine andere Möglichkeit?

Ein Variable im Interrupt mitzählen lassen? Wenn Wert x für 5s
erreicht, Variable auf 0 und alles von vorne.
Gast #1236451
Lesenswert?

Dann wäre ja bei 12000000/65536=183,1054 Interrupts eine Sekunde 
erreicht.

183,1054 ist aber doch kein guter Wert da ich dann ja nur 183 nehmen 
könnte und dann wäre es relativ weit von einer Sekunde entfernt...
#1236455
Lesenswert?

Uwe K. wrote:
> Dann wäre ja bei 12000000/65536=183,1054 Interrupts eine Sekunde
> erreicht.

Der Timer hat einen fest eingebauten Prescaler von 12, d.h. du hast alle 
65536 µS einen Interrupt. Läds du den Timer entsprechend vor, dass er 
alle 50000µS (50ms) einen Interrupt liefert, muss dein register bis 100 
hochzählen un du hast deine 5 sekunden.


Gruß
#1236477
Lesenswert?

Na du musst ja den Timer nicht immer seinen gesamten zählumfang 
durchlaufen lassen.


lädst du deinen Zähler mit 15536 und startest ihn dann, läuft er 50000µS 
(Schritte) später über und gibt dir einen Interrupt. Nun kannst du eine 
Variable um 1 erhöhen, den zähler erneut vorladen und wieder in die 
Hauptschleife springen. Jetzt musst du nur noch deine Variable jedes 
abfragen, ob sie 100 ist, ist der fall erreicht kannst du deine 
gewünschte aktion durchführen und die Variable zurücksetzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren