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.