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?
Haste am Ende von der Interrupt-Routine auch statt "ret" ein "reti" verbaut?
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 |
Nö!! hehe jo funktioniert danke für die schnelle Hilfe peinlich peinlich!!!!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.