Sekunden zählen mit einem Timer

Gast #1236438
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
>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
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...
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ß
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.