www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ext Interrupt mit ATMega644


Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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!!!
; Erst auswählen welcher Int(0 bis 2) mit High.
;   hier: PCInt0 weil Pin für Touch an PA4 = PCInt4 = INT0
        lds    temp1,EIMSK
        sbr    temp1, 0<< INT2 | 0<<INT1 | 1<<INT0
        sts    EIMSK,temp1
;  Flanke H/L, L/H oder Low Pegel einstellen 
        lds    temp1,EICRA
        sbr    temp1,  1<<ISC01 | 0<<ISC00  ; Low Level löst Int aus
        sts    EICRA,temp1      
      
    /*    lds    temp1,EIFR
        sbr    temp1, 1<<INTF2 | 1<<INTF1 | 1<<INTF0
        sts    EIFR,temp1
*/
        
; Welche Pin-Gruppe?
        lds temp1, pcicr
        sbr temp1, 1 << PCIE0
        sts pcicr, temp1
;Welcher Pin in Gruppe genau?
        lds temp1, pcmsk0
        sbr temp1, 1 << pcINT4    ; PA4 als Auslöser
        sts pcmsk0, temp1
        
      ;  sei  ; Alle Interrupts an
Dann kommt das Hauptprogramm, welches im Moment nicht viel macht.
Die ISR sieht so aus:
touch_beruehrt:
                    ; interrupts aus
          push temp1
          in temp1, sreg
          push temp1
          push temp2
          push temp3
          push Discursorl    ; vorherige Werte
          push discursorh
          push disdata1
          push disdata2
          
          in temp1, pina
          andi temp1, 0b00010000
          cpi temp1, 0b00010000
          breq alles_gleich  
    
    ldi     zL, LOW(Touchwert)   ; ZL mit den unteren Bits der Adresse initialisieren
    ldi     zH, HIGH(Touchwert)  ; ZH mit den oberen Bits der Adresse initialisieren          
    ld Discursorl, z+    ; discursorl = temp3 = Zahl
    ld discursorh, z    ; discursorh = temp4 = - oder +

            
          
  
  
          rcall Touch_speichern_x
          rcall Touch_speichern_y
        
          rcall touch_auswerten; jetzt stehen Zahl und +/- in y
          ldi     zL, LOW(Touchwert)   
          ldi     zH, HIGH(Touchwert) 
          
          ld temp1, z+
          cp discursorl, temp1
          breq Zahl_gleich

;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
          pop disdata2
          pop discursorh
          pop  discursorl
          pop temp3
          pop temp2
          pop temp1
          out sreg, temp1
          pop temp1
          
          reti          


Zahl_gleich:
          ld temp1, y
          cp discursorh, temp1
          breq alles_gleich
; 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   

alles_gleich:
          rcall touch_ruhe
          pop disdata2
          pop disdata1
          pop discursorh
          pop  discursorl
          pop temp3
          pop temp2
          pop temp1
          out sreg, temp1
          pop temp1
          
          reti
Hilfe!! Stehe ein bißchen auf dem Schlauch!!

Autor: Gast 57 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schön, werd´s mal ändern.

Ist die Init der Interrupts denn so richtig??

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.