mikrocontroller.net

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


Autor: Uwe K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
mov p0,#0

    ljmp main     
org 0Bh         
    call timerfuntkion
    reti
    
main:
    mov  040h, #0 
    mov  TMod, #01
    setb IE.1 
    setb EA
    setb TCon.4
w:  sjmp w

timerfuntkion:
    cpl p0.2
    ret
end

Ich hoffe ihr könnt mir da weiterhelfen.

Lg
Uwe

Autor: holger (Gast)
Datum:

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

Autor: Uwe K. (Gast)
Datum:

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

Autor: Jochen R. (josch90)
Datum:

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

Autor: Uwe K. (Gast)
Datum:

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

Autor: Jochen R. (josch90)
Datum:

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

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.