Forum: Mikrocontroller und Digitale Elektronik Interrupt bei Timer2 wird nicht ausgelöst


von Thomas Frosch (Gast)


Lesenswert?

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?

von Christian T. (shuzz)


Lesenswert?

Kannst Du bitte mal Deinen Code posten? ;)

von Sven P. (Gast)


Lesenswert?

Haste am Ende von der Interrupt-Routine auch statt "ret" ein "reti" 
verbaut?

von Thomas Frosch (Gast)


Lesenswert?

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

von Thomas Frosch (Gast)


Lesenswert?

Nö!! hehe

jo funktioniert danke für die schnelle Hilfe

peinlich peinlich!!!!

von Andreas K. (a-k)


Lesenswert?

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
Noch kein Account? Hier anmelden.