Forum: Mikrocontroller und Digitale Elektronik ext Interrupt mit ATMega644


von Sven B. (svenba)


Lesenswert?

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
31
          ldi     zL, LOW(Touchwert)   
32
          ldi     zH, HIGH(Touchwert) 
33
          
34
          ld temp1, z+
35
          cp discursorl, temp1
36
          breq Zahl_gleich
37
38
;Zahl nicht gleich:
39
          ldi disdata1, 0x0c
40
          mov disdata2, temp3;discursorl
41
          rcall sende_daten
42
          mov disdata2, temp4;discursorh
43
          rcall sende_daten
44
          
45
          ldi     zL, LOW(Touchwert)   
46
          ldi     zH, HIGH(Touchwert)
47
          st z+, temp3
48
          st z, temp4
49
          
50
          rcall touch_ruhe
51
          
52
          pop disdata2
53
          pop disdata2
54
          pop discursorh
55
          pop  discursorl
56
          pop temp3
57
          pop temp2
58
          pop temp1
59
          out sreg, temp1
60
          pop temp1
61
          
62
          reti          
63
64
65
Zahl_gleich:
66
          ld temp1, y
67
          cp discursorh, temp1
68
          breq alles_gleich
69
; nicht gleich::            
70
          ldi disdata1, 0x0c
71
          mov disdata2, temp3;discursorl
72
          rcall sende_daten
73
          mov disdata2, temp4;discursorh
74
          rcall sende_daten
75
          
76
          ldi     zL, LOW(Touchwert)   
77
          ldi     zH, HIGH(Touchwert)
78
          st z+, temp3
79
          st z, temp4   
80
81
alles_gleich:
82
          rcall touch_ruhe
83
          pop disdata2
84
          pop disdata1
85
          pop discursorh
86
          pop  discursorl
87
          pop temp3
88
          pop temp2
89
          pop temp1
90
          out sreg, temp1
91
          pop temp1
92
          
93
          reti
Hilfe!! Stehe ein bißchen auf dem Schlauch!!

von Gast 57 (Gast)


Lesenswert?

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

von Sven B. (svenba)


Lesenswert?

Danke schön, werd´s mal ändern.

Ist die Init der Interrupts denn so richtig??

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.