Forum: Mikrocontroller und Digitale Elektronik AtTiny2313 Timer bleibt hängen


von Quiddi Q. (quiddi)


Lesenswert?

Hallo zusammen,

ich bin echt am verzweifeln.

Folgendes Problem.
Ich will in der TimerInterruptrutine einen Vergleich durchführen. 
Abhängig von dem Vergleich will ich in eine jeweils andere Schleife 
springen. Das Problem hierbei ist, dass wenn ich das Programm so wie es 
ist laufen lasse die LEDs an PortB blinken, so wie ich es mir vorstelle. 
Wenn ich jetzt jedoch in der Schleife a1 unten den Befehl reti mit rjmp 
a1 ersetze, bleibt mir der Timer hängen und springt nicht mehr in 
Schleife a2. Anderst herum genau das gleiche, wenn ich in Schleife a2 
reti mit rjmp a2 ersetze bleibt mir das Programm auch hängen.

Ich weiß, dass das Programm so keinen Sinn macht und man die Sache 
einfacher realisieren könnte. Es ist lediglich ein Auszug aus einem 
Programm um mein Problem zu spezialisieren.
1
AVR-Assembler-Code
Das Programm(ich hoffe ich habe es ausreichend kommentiert):





.include "tn2313def.inc"
.def temp = r16

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

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

        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp


        ldi     temp, 0b00000101       ; Timerinterrupt--> Teiler 1024
        out     TCCR0, temp

        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer 
Overflow
        out     TIMSK, temp

        sei
loop:
rjmp loop

timer0_overflow:                        ; Timer 0 Overflow Handler



    ldi r19, 0b00000001
    add r18, r19    ;Register r18 + 1

    cpi r18, 0b00000001  ; Vergleiche r18 mit 1
    breq a1      ; gehe zu a1, wenn gleich
    cpi r18, 0b00000010  ; Vergleiche r18 mit 2
    breq a2      ; gehe zu a2, wenn gleich
a1:
ldi r16, 0b00000111
out PortB, r16        ; r16 an PortB ausgeben
reti
a2:
ldi r16, 0b11000000      ; r16 an PortB ausgeben
out PortB, r16

ldi r18, 0b00000000      ;r18 auf 0 zurücksetzen
reti

von spess53 (Gast)


Lesenswert?

Hi

>    cpi r18, 0b00000010  ; Vergleiche r18 mit 2
>    breq a2      ; gehe zu a2, wenn gleich
>a1:
>ldi r16, 0b00000111

Und was soll passieren, wenn r18 nicht 2 ist? Wieder a1?

MfG Spess

von Flo (Gast)


Lesenswert?

wenn du reti durch rjmp a1 ersetzt, baust du eine Endlosschleife im 
Timerinterrupt.

von Karl H. (kbuchegg)


Lesenswert?

Quiddi Quiddinson schrieb:

> Wenn ich jetzt jedoch in der Schleife a1 unten den Befehl reti mit rjmp
> a1 ersetze, bleibt mir der Timer hängen und springt nicht mehr in
> Schleife a2.

Logisch.
Was soll auch sonst passieren.
Du hast eine Endlosschleife, die Interrupts sind disabled und da kommt 
der Prozessor so nicht mehr raus.

Aber die eigentliche Frage lautet:
Warum willst du da eigentlich eine Schleife haben?
Sie ergibt keinen Sinn.

von Claus K. (clako)


Lesenswert?

Hallo,
sicher nicht perfekt, aber solche kleinen Sachen lassen sich sehr gut im 
AVR-Studio 4 -Freeware- im Simulator mit dem Einzelschritt-Modus 
nachvollziehen.

Gruß
Claus

von Quiddi Q. (quiddi)


Lesenswert?

Hallo nochmal,

dass ich eine Endlosschleife erzeuge ist mir schon klar, aber wenn der 
Interrupt wieder kommt müsste die Endlossschleife doch unterbrochen 
werden und, die Schleife timer0_overflow erneut beginnen, oder warum 
unterbricht der Interrupt diese Endlosschleife nicht?


Danke für eure schnellen Antworten.

von Markus (Gast)


Lesenswert?

Hallo was verstehst du daran nicht. Ist doch alles klar, oder?

von Markus E. (engelmarkus)


Lesenswert?

Der Interrupt unterbricht die Schleife nicht, weil beim Betreten einer 
ISR die Interrupts deaktiviert werden. Erst beim Verlassen der ISR mit 
reti werden die Interrupts wieder aktiviert.

von Quiddi Q. (quiddi)


Lesenswert?

Hallo Markus,

vielen Dank für deine Antwort. Jetzt klingt die Sache für mich schon um 
einiges logischer und ich glaube sie auch verstanden zu haben.

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.