Forum: Mikrocontroller und Digitale Elektronik Sekunden zählen mit einem Timer


von Uwe K. (Gast)


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

von holger (Gast)


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.

von Uwe K. (Gast)


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

von Jochen R. (josch90)


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ß

von Uwe K. (Gast)


Lesenswert?

Klingt vielleicht doof, aber wie meinst du das mit dem Timer vorladen?
Hast du ein Beispiel?

von Jochen R. (josch90)


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.

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.