Hi!
Ich versuche, ein Touchdisplay per ext Interrupt an PinA4 meines
ATMega644 abzurufen. Entweder läuft der Interrupt immer wieder durch
oder das ganze Programm hakt nach ein paar Mal touchen und alles bleibt
stehen. Die Werte werden so gut wie nie richtig angezeigt.
Leider findet man nirgends richtige Angaben, wie denn nun die PCInts
außer 0 und 1 richtig angesteuert werden. Hier mal meine Init und ISR,
ich hoffe, ich kriege ein paar Tipps von euch!!!
1
; Erst auswählen welcher Int(0 bis 2) mit High.
2
; hier: PCInt0 weil Pin für Touch an PA4 = PCInt4 = INT0
3
lds temp1,EIMSK
4
sbr temp1, 0<< INT2 | 0<<INT1 | 1<<INT0
5
sts EIMSK,temp1
6
; Flanke H/L, L/H oder Low Pegel einstellen
7
lds temp1,EICRA
8
sbr temp1, 1<<ISC01 | 0<<ISC00 ; Low Level löst Int aus
9
sts EICRA,temp1
10
11
/* lds temp1,EIFR
12
sbr temp1, 1<<INTF2 | 1<<INTF1 | 1<<INTF0
13
sts EIFR,temp1
14
*/
15
16
; Welche Pin-Gruppe?
17
lds temp1, pcicr
18
sbr temp1, 1 << PCIE0
19
sts pcicr, temp1
20
;Welcher Pin in Gruppe genau?
21
lds temp1, pcmsk0
22
sbr temp1, 1 << pcINT4 ; PA4 als Auslöser
23
sts pcmsk0, temp1
24
25
; sei ; Alle Interrupts an
Dann kommt das Hauptprogramm, welches im Moment nicht viel macht.
Die ISR sieht so aus:
1
touch_beruehrt:
2
; interrupts aus
3
push temp1
4
in temp1, sreg
5
push temp1
6
push temp2
7
push temp3
8
push Discursorl ; vorherige Werte
9
push discursorh
10
push disdata1
11
push disdata2
12
13
in temp1, pina
14
andi temp1, 0b00010000
15
cpi temp1, 0b00010000
16
breq alles_gleich
17
18
ldi zL, LOW(Touchwert) ; ZL mit den unteren Bits der Adresse initialisieren
19
ldi zH, HIGH(Touchwert) ; ZH mit den oberen Bits der Adresse initialisieren
20
ld Discursorl, z+ ; discursorl = temp3 = Zahl
21
ld discursorh, z ; discursorh = temp4 = - oder +
22
23
24
25
26
27
rcall Touch_speichern_x
28
rcall Touch_speichern_y
29
30
rcall touch_auswerten; jetzt stehen Zahl und +/- in y
Ich vermute der Fehler liegt beim Zurücklesen vom Stack,
;Zahl nicht gleich:
ldi disdata1, 0x0c
mov disdata2, temp3;discursorl
rcall sende_daten
mov disdata2, temp4;discursorh
rcall sende_daten
ldi zL, LOW(Touchwert)
ldi zH, HIGH(Touchwert)
st z+, temp3
st z, temp4
rcall touch_ruhe
pop disdata2; !!!!!!!!!!!!!!!! Beides Mal das gleiche
pop disdata2; !!!!!!!!!!!!!!!! Register, Tipp-Fehler!
pop discursorh
pop discursorl
pop temp3
pop temp2
pop temp1
out sreg, temp1
pop temp1
Schönes Wochenende