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


von Toni (Gast)


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:
1
.org 0x000  rjmp reset    ;Programm start
2
.org 0x001  rjmp impuls    ;Näherungsschalter
3
;.org 0x002  rjmp aus    ;Interrupt schalter
4
.org 0x008  rjmp timer    ;Timer für sicherheit, wird aktiviert nach dem schalten der ausgänge
5
6
slep:              ;schlafen legen, und alle 10 min wieder wecken
7
    ldi    r16, 0b00000101    ;teiler 
8
    out    TCCR1B, r16
9
    ldi    r16, 0b00000100
10
    out    TIMSK, r16
11
    clr    r16
12
    out    TCNT1H, r16
13
    out    TCNT1L, r16
14
    sbr    r31, 0b00000001 
15
    sleep
16
                nop
17
    cbr    r31, 0b00000001
18
    rjmp  haupt 
19
20
;nach abgelaufener zeit motor aus
21
timer:
22
    push   r16
23
    sbrc  r31, 0b00000001
24
    rjmp  timer1_weiter
25
    reti
26
  timer1_weiter:  
27
    clr    r16
28
    out    PORTB, r16
29
    pop    r16
30
    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.

von holger (Gast)


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?

von Charly B. (charly)


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

von Hannes Lux (Gast)


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.

...

von Michael U. (amiga)


Lesenswert?

Hallo,

mehr am Rande: auch in ASM lesen sich Namen von Ports, Pins, 
Timerregistern und Interruptroutinen wesentlich besser als Bitmuster...
1
.org 0x000
2
  rjmp reset    ;Programm start
3
.org INT0addr
4
  rjmp impuls    ;Näherungsschalter
5
;.org INT1addr
6
  rjmp aus    ;Interrupt schalter
7
.org OVF1addr
8
  rjmp timer    ;Timer für sicherheit, wird aktiviert nach dem schalten der ausgänge
9
10
.org INT_VECTORS_SIZE
11
12
wo ist eigentlich reset???

So in der Art meine ich.

Gruß aus Berlin
Michael

von Toni (Gast)


Angehängte Dateien:

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

von Toni (Gast)


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.

von Toni (Gast)


Lesenswert?

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

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.