Mikrocontroller und Digitale Elektronik
›
Thread
Interrupt bei Timer2 wird nicht ausgelöst
TF
Thomas Frosch
Gast
13.05.2008 19:11
#866156
Hi arbeite mit einem ATmega 8L mit 8MHz
in meinem Assembler Prog soll ein Interrupt durch Timer 2 ausgelöst
werden dies funktioniert auch einmal! dann löst der Timer 2 kein
interrupt mehr aus?! der Timer läuft aber!
TOIE2 ist dabei ständig gesetzt und wird auch nicht verändert!
zudem ist CS20 auf 1
und OCF2 wird automatisch auf 1 gesetzt
TOV2 wird sozusagen beim 2. Interrupt auf 1 gesetzt
wie bekomme ich es hin dass der Timer statt dem TOV2 Flag wieder ein
Interrupt auslöst?
Kannst Du bitte mal Deinen Code posten? ;)
SP
Sven P.
Gast
13.05.2008 19:17
#866164
Haste am Ende von der Interrupt-Routine auch statt "ret" ein "reti"
verbaut?
TF
Thomas Frosch
Gast
13.05.2008 19:22
#866167
So dass sind mal die wichtigsten Teile meines Progs ich hoffe ihr blickt
da durch!
1 .include "m8def.inc"
2 .def temp = r16
3 .def temp1 = r21
4 .def temp2 = r22
5 .def temp3 = r23
6 .def sevent = r17 ;variable für Postscaler
7 .def completed = r18
8 .equ prescaler = 0b00000010
9 .equ postscaler =7
10
11 .def Key_Old = r24
12 .def Key_New = r25
13 .def Temperatur = r19
14
15 .org 0x0000
16 rjmp main
17 .org INT1addr
18 rjmp IR_Interrupt
19 .org OVF2addr
20 rjmp IR_Sending
21 .org OVF0addr
22 rjmp IR_Incomming
23
24
25 main:
26
27 ldi temp,Low(Ramend); Stackpointer initialisieren
28 out SPL, temp
29 ldi temp,High(RAMEND)
30 out SPH,temp
31
32 ldi temp,0b11110000 ;0->Eingang 1->Ausgang
33 out DDRD, temp
34 ldi temp,0b11111111
35 out PortD,temp
36
37 ldi temp, 0xFF
38 out DDRB, temp
39
40 ldi temp, 0b00111100
41 out DDRC, temp
42
43 ldi temp,0b00000000 ;prescaler von Timer0 auf 0
44 out TCCR0,temp
45
46 ldi temp, 0b00000001 ;Timer 0 Erlauben Interrupt bei Overflow auszulösen
47 out TimSK, temp
48
49 ldi temp, 0b00001100 ;Interrupt durch PD3 bei steigender Flanke
50 out MCUCR, temp
51
52 ldi temp, 0b10000000 ; INT1 aktivieren
53 out GICR, temp
54
55 ldi temp, 0b01100000
56 out ADMUX, temp
57
58 ldi temp, 0b11100111
59 out ADCSRA, temp
60
61
62 ldi completed, 0b00000000
63 ldi sevent, 0b00000000
64
65 sei
66
67 rcall lcd_init ; Display initialisieren
68
69 rcall lcd_clear ; Display löschen
70
71 ldi temp1, 'M' ; Zeichen anzeigen
72 rcall lcd_data
73
74 ;...........gekürzt................
75
76 sbic PortC,1
77 rcall IR_Senden
78
79 rjmp ende
80
81 ;--------------------------------------------------------------
82
83 IR_Senden:
84 push temp1
85 push temp2
86 push temp3
87
88
89 ldi temp1, 0b00000000 ;INT0 und INT1 deaktivieren
90 out GICR, temp1
91
92 ldi temp1,0b00000000 ; Timer0 deaktivieren
93 out TCCR0,temp1
94
95 ldi temp1, 0b01000000 ;Timer 2 Erlauben Interrupt bei Overflow auszulösen
96 out TimSK, temp1
97
98 ldi temp1,0b00000001 ;prescaler von Timer2 auf 1
99 out TCCR2,temp1
100
101 ldi sevent ,28
102 ldi completed, 28
103
104 ldi ZL, LOW(Senden*2) ; Adresse des Strings in den
105 ldi ZH, HIGH(Senden*2) ; Z-Pointer laden
106
107 pop temp3
108 pop temp2
109 pop temp1
110 ret
111
112 ;--------------------------------------------------------------
113
114 IR_Sending:
115 push temp1
116 push temp2
117 push temp3
118
119 ;ldi temp1, 0b10000000 ;Interrupt Flags löschen
120 ;out gIFR, temp1
121
122
123 dec sevent
124 brne IR_Sending_Ende
125
126 ldi sevent ,28
127
128 lpm temp1, Z+ ; Byte aus Flash laden in temp2 speichern
129
130 sbrc temp1,0
131 sbi PortC,5
132
133 sbrs temp1,0
134 cbi PortC,5 ; und Z-Pointer um 1 erhöhen
135
136 dec completed
137 brne IR_Sending_Ende
138
139 ldi temp1,0b00000000 ;prescaler von Timer2 auf 1
140 out TCCR2,temp1
141
142 ldi temp1, 0b00000000 ;Timer 2 Erlauben Interrupt bei Overflow auszulösen
143 out TimSK, temp1
144
145 ldi temp1, 0b10000000 ;INT1 aktivieren
146 out GICR, temp1
147
148
149 IR_Sending_Ende:
150
151 pop temp3
152 pop temp2
153 pop temp1
154 ret
TF
Thomas Frosch
Gast
13.05.2008 19:25
#866171
Nö!! hehe
jo funktioniert danke für die schnelle Hilfe
peinlich peinlich!!!!
AK
Andreas K.
(a-k)
13.05.2008 19:27
#866173
Es gibt für alle Bits in den Steuerregistern Namen. Die haben den
Vorteil, dass mal sehr viel leichter sieht, was da gemacht wird. Wer
deinen Code kontrollieren will, muss sich statt dessen anhand der
0b10110001 durch's Handbuch quälen um rauszukriegen was die bedeutet.
Rechne folglich nicht damit, dass viele das tun werden.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren