Forum: Mikrocontroller und Digitale Elektronik Timer mega 8


von Christian (Gast)


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

von Carsten P. (papa_of_t)


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.

von Tomtom (Gast)


Lesenswert?

- Entweder NOP Scleife oder
- eleganter hardware timer benutzen

von Christian (Gast)


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

von Christian (Gast)


Lesenswert?

Nachtrag: Ich meinte die Funktion wird nur einmal ausgeführt...danach 
reagiert die Schaltung nicht mehr auf den Taster...irgendwo hängt sichs 
auf...in AVR Studio lässt sichs aber schön simulieren...

von Christian (Gast)


Lesenswert?

habs...danke nochmal....

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.