www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer1 Interrupt springt falsch aus isr


Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!!!

ich Programmiere einen Atmega8 in Assembler. Ich möchte den timer1 für 2 
dinge verwenden.
mein Problem: bei der simulation im AVR studio springt der 
timerinterrupt nach auslösung komischerweise auf die adresse 0x000, 
sprich er startet von anfang an; was natürlich völliger blödsinn ist, da 
er nach dem "sleep" befehl wieder einspringen sollte. warum tut er das 
nicht? ob ich den "nop" befehl nun weg mache oder nicht, spielt keine 
rolle.
natürlich funktioniert das programm praktisch in der schaltung ebenfalls 
nicht.

noch ein paar einzelheiten:
und zwar wird der timer 1 einmal als sicherheit für eine gewisse zeit 
programmiert und löst dann einen interrupt aus.
als 2. wird er verwendet, um den µC jede 10 min aus dem schlaf zu 
wecken. (das passt alles noch nicht, will erstmal mein problem lösen)
hier mal ein ausschnitt aus dem programm:
.org 0x000  rjmp reset    ;Programm start
.org 0x001  rjmp impuls    ;Näherungsschalter
;.org 0x002  rjmp aus    ;Interrupt schalter
.org 0x008  rjmp timer    ;Timer für sicherheit, wird aktiviert nach dem schalten der ausgänge

slep:              ;schlafen legen, und alle 10 min wieder wecken
    ldi    r16, 0b00000101    ;teiler 
    out    TCCR1B, r16
    ldi    r16, 0b00000100
    out    TIMSK, r16
    clr    r16
    out    TCNT1H, r16
    out    TCNT1L, r16
    sbr    r31, 0b00000001 
    sleep
                nop
    cbr    r31, 0b00000001
    rjmp  haupt 

;nach abgelaufener zeit motor aus
timer:
    push   r16
    sbrc  r31, 0b00000001
    rjmp  timer1_weiter
    reti
  timer1_weiter:  
    clr    r16
    out    PORTB, r16
    pop    r16
    reti


"Haupt" ist das hauptprogramm, indem ein adc einen wert einliest und 
auswertet.

so, ich hoffe ihr könnt damit was anfangen und habt vielleicht ne idee.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>so, ich hoffe ihr könnt damit was anfangen und habt vielleicht ne idee.

Nö, nicht wirklich. Aber pass auf deine PUSH,POP auf.
Zum Beispiel hier

timer:
    push   r16
    sbrc  r31, 0b00000001
    rjmp  timer1_weiter
Wo ist das POP?
    reti


slep wird hoffentlich nicht per CALL angesprungen?

Autor: Charly B. (charly)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,


push r16 ueber clr r16 schreiben , iss dort besser aufgehoben ;)

stack definiert ?

und denk auch daran das stausregister beim begin der isr zu push'en
und beim austritt zu pop'en wenn du operationen in der isr routine
hast die es veraendern


viel erfolg & vlg
Charly

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> mein Problem: bei der simulation im AVR studio springt der
> timerinterrupt nach auslösung komischerweise auf die adresse 0x000,
> sprich er startet von anfang an; was natürlich völliger blödsinn ist

Das riecht nach nicht initialisiertem Stackpointer.

...

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mehr am Rande: auch in ASM lesen sich Namen von Ports, Pins, 
Timerregistern und Interruptroutinen wesentlich besser als Bitmuster...
.org 0x000
  rjmp reset    ;Programm start
.org INT0addr
  rjmp impuls    ;Näherungsschalter
;.org INT1addr
  rjmp aus    ;Interrupt schalter
.org OVF1addr
  rjmp timer    ;Timer für sicherheit, wird aktiviert nach dem schalten der ausgänge

.org INT_VECTORS_SIZE

wo ist eigentlich reset???

So in der Art meine ich.

Gruß aus Berlin
Michael

Autor: Toni (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!!!

danke erstmal für die ersten antworten, stack ist initialisiert, läuft 
auch nicht über ( weil ich vielleicht ein pop oder push vergessen habe).

ich hänge am besten mal das komplette programm an, damit könnt ihr es 
vielleicht auch einfach mal im studio probieren.

das mit dem sreg sichern ist natürlich richtig, das habe ich total 
vergessen :)

besten dank und grüße

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich nochmal!!!

oh shit, ich habe den 2. post total überlesen, ich glaube das ist das 
problem, das der pop - befehlt fehlt. somit ist die letzte adresse im sp 
0 :/ und hier entstand auch immer das problem.
ich seh vor lauter baümen den wald nicht mehr :)

ich bin jetzt leider etwas unter zeitdruck, werde es aber nachher 
ausprobieren und nochmals posten.

nochamls vielen dank.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tatsächlich, mit dem pop befhel funktioniert die ganze sache nun 
endlich. jetzt kann ich endlich weiter machen :)

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.