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.
>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?
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
> 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.
...
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
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.