Timer mega 8

Gast #547006
Lesenswert?
• ▲
▼
Hallo,

Hab mich in letzter Zeit so langsam in Mikrocontroller eingearbeitet.

Jetzt bräuchte ich eine Funktion die das Programm einfach mal in etwa 
grob  0,2 Sekunden warten lässt bis der nächste Befehl abgearbeitet 
wird.

In Software Programmierungen hab ichs schon öfter gesehen bsp wait 
200ms, bascom war das, glaub ich...aber nicht sicher. Wie bekomme ich so 
etwas in assembler hin. Im Tutorial hab ich eine Lösung gefunden um LEDs 
blinken zu lassen. Kann man das ohne die Schleife machen oder überhaupft 
ohne Interupt oder ist mit dem Timer immer ein Interupt verbunden ?

Vielen Dank im Voraus....

Viele Grüße

Christian
#547017
Lesenswert?
• ▲
▼
Worin bestand denn Deine "Einarbeitung" bisher? :-)

Eine Programmverzögerung kann man z.B. erreichen, inden man (ggf. 
verschachtelte) Schleifen programmiert, oder einen Timer startet und 
permament abfragt, ob der Zielwert schon erreicht ist oder beim Überlauf 
einen Interrupt auslösen läßt. Dabei ist es egal, Du Deinen Mega8 mit C, 
Basocm oder Assember dazu bringst. Wenn es Dir also nur auf die 
ungefähre Verzögerung ankommt, brauchst Du nicht unbedingt einen Timer.
Gast #547283
Lesenswert?
• ▲
▼
Schon mal danke für die Antworten...hab mal einen ersten Versuch 
gestartet aufbauend auf dem Entwurf aus dem YVR Tutorial...allerdings 
wird die Funktion immer nur genau einaml ausgeführt...z.B. wenn ich 
Versuche mit einem Taster das Programm abrufe.

Hab den Code des "Einmal" Timers mal eingefügt. Vielleicht sieht jemand 
den Fehler. Wäre sehr dankbar...und ja...bin Anfänger...;)...

Beste Grüße


.include "m8def.inc"

.def temp = r16
.def leds = r17


.org 0x0000

                rjmp    main

.org OVF0addr

    rjmp    timer0_overflow

main:
        ldi     temp, LOW(RAMEND)
        out     SPL, temp
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp

        ldi     temp, 0xFF
        out     DDRD,temp

        ldi     leds, 0xFF

        ldi     temp, 0b00000100
        out     TCCR0, temp

        ldi     temp, 0b00000001
        out     TIMSK, temp

        sei

loop:   sbrc r18, 0

!hier ist der Ausbruch aus der 
!Schleife, indem in dem Interupt (paar Zeilen weiter unten) ein Bit 
eines Registers geändert wird...

    rjmp    continue

    rjmp    loop



timer0_overflow:                      ;
        out     PORTD,leds
        com     leds
        ldi temp, 0b00000000
    out TCCR0, temp
    out TCNT0, temp

    ldi r18, 0b00000001

    reti

continue:  rjmp continue

Antwort schreiben

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.

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.