[AVR-Asm]Zählvariable setzt sich immer zurück

Gast #3689487
Lesenswert?
• ▲
▼
Guten Abend,

ich habe ein Problem mit einer Zählvariablen, die sich immer wieder auf 
den Anfangswert setzt.

Timer-Interrupt:
1
onTC0:    
2
    cli    
3
    dec r20
4
    cpse r20,r21    
5
    rjmp fiep
6
  
7
tint_ende:
8
      ldi  r16,196
9
      out ioTCNT0,r16
10
      sei
11
      reti
Initialisierung:
1
   ldi r20,0xFF
2
   ldi r21,0x00

Unterroutine "fiep"
1
fiep:   ;---Ton 1kHz--------
2
    sbic   pinb, 3          
3
      cbi    portb, 3      
4
    sbis   pinb, 3          
5
    sbi    portb, 3      
6
    ;------------------
7
    rjmp tint_ende

Ich möchte erreichen, dass das Unterprogramm "fiep" nur bei den ersten 
255 Durchläufen des Timers ausgeführt wird. Doch leider fiept es immer.

Ich sitze seit Stunden an diesem Problem und scheinbar helfen mir meine 
Google-Fähigkeiten nicht mehr weiter. Ein Tipp oder eine Lösung wäre 
sehr willkommen.

mit freundlichen Grüßen,
Torben
Gast #3689497
Lesenswert?
• ▲
▼
Hi

>Ich möchte erreichen, dass das Unterprogramm "fiep" nur bei den ersten
>255 Durchläufen des Timers ausgeführt wird. Doch leider fiept es immer.

Warum auch nicht? Du hast es doch so programmiert.

Mit

>   cpse r20,r21

wird einmal

>    rjmp fiep

übersprungen. Beim nächsten

>    dec r20

ist r20 = $FF und das Spiel geht weiter.

MfG Spess
Gast #3689510
Lesenswert?
• ▲
▼
Ich liebe die Zensur!

Natürlich geht der Code keinen etwas an, deshalb hast Du wohl auch alles 
andere rausgeschmissen.

Ich liebe Unterbrechungen ohne jede Sicherung!
Aber Spess hat wohl irgendwie Recht.
Moderator (Firma: Titel) Persönliche Seite #3689534
Lesenswert?
• ▲
▼
Amateur schrieb:
> Aber Spess hat wohl irgendwie Recht.
Hat er, aber trotzdem sollte man nachsehen, ob einer der Befehle in der 
ISR z.B. das Statusregister ändern. Falls das der Fall ist, dann sollte 
dieses Register gesichert (push) und wieder hergestellt (pop) werden. 
Sonst gibt es diese "seltsamen" Effekte...

Und wozu man ein cli und ein sei in der ISR braucht, ist mir auch nicht 
ganz klar. Beim AVR kann eine ISR doch sowieso nicht unterbrochen 
werden...

Torben Lange schrieb:
> Ein Tipp oder eine Lösung wäre sehr willkommen.
Starte den Simulator...
Gast #3689551
Lesenswert?
• ▲
▼
>>Falls das der Fall ist, dann sollte
>>dieses Register gesichert (push) und wieder hergestellt (pop) werden.
>>Sonst gibt es diese "seltsamen" Effekte...

Deshalb:
>Ich liebe Unterbrechungen ohne jede Sicherung!

Die Wahrscheinlichkeit ein "richtiges" Programm zu schreiben in dem kein 
Vergleich vorkommt...
Gast #3689698
Lesenswert?
• ▲
▼
Amateur schrieb:

> Die Wahrscheinlichkeit ein "richtiges" Programm zu schreiben in dem kein
> Vergleich vorkommt...

Das ist wirklich nur sehr selten möglich. Aber eine ISR zu schreiben, 
die die Flags nicht ändert und sie deshalb auch nicht retten muß, das 
geht schon öfters mal zu realisieren.

Allerdings: sobald irgendwas gezählt werden soll, ist das kaum noch 
sinnvoll möglich.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.