mikrocontroller.net

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


Autor: Quiddi Quiddinson (quiddi)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du reti durch rjmp a1 ersetzt, baust du eine Endlosschleife im 
Timerinterrupt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Claus K. (clako)
Datum:

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

Autor: Quiddi Quiddinson (quiddi)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Markus E. (engelmarkus)
Datum:

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

Autor: Quiddi Quiddinson (quiddi)
Datum:

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

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.