PIC16f887 PORTB Interrupt funktioniert nicht

Gast #4172845
Hallo,
ich versuche gerade meinen PIC so zu konfigurieren, dass ein Interrupt 
ausgelöst wird, wenn sich ein Pin Zustand an PORTB ändert.
Ich hatte das schonmal hinbekommen, jedoch kriege ich es jetzt nicht 
mehr hin.
Ich kann einfach keinen Fehler bei der Initialisierung finden....


                                BANK_SEL3

                                    ; Initialisiere Ansel Register.
                                    ; Deaktiviere Analoge Eingänge.
                                    CLRF  ANSELH
                                    CLRF  ANSEL

                                    BANK_SEL1

                                    ; Initialisiere Tris Register.
                                    MOVLW  H'00'
                                    MOVWF  TRISA

                                    MOVLW  H'FF'
                                    MOVWF  TRISB

                                    ; Aktiviere alle Pull Ups an PortB.
                                    BCF     OPTION_REG, RBPU
                                    MOVLW   H'FF'
                                    MOVWF   WPUB

                                    BANK_SEL0

                                    ; Initialisiere Port Register.
                                    CLRF  SHADOW_PORTA
                                    MOVF  SHADOW_PORTA
                                    MOVWF  PORTA

                                    CLRF  SHADOW_PORTB
                                    MOVF  SHADOW_PORTB
                                    MOVWF  PORTB

                                    CLRF  SHADOW_PORTC
                                    MOVF  SHADOW_PORTC
                                    MOVWF  PORTC

                                    CLRF  SHADOW_PORTD
                                    MOVF  SHADOW_PORTD
                                    MOVWF  PORTD

                                    CLRF  SHADOW_PORTE
                                    MOVF  SHADOW_PORTE
                                    MOVWF  PORTE

                                    SEL_BANK1

                                    ; Aktiviere Interrupts an allen 
PortB Pins.
                                    MOVLW  H'FF'
                                    MOVWF  IOCB

                                    SEL_BANK0


                                    ; Initialisiere Interrupts
                                    BSF     INTCON, RBIE
                                    BSF     INTCON, GIE
Gast
Nur weil ich ganz am Anfang

CLRF  SHADOW_PORTB
MOVF  SHADOW_PORTB
MOVWF  PORTB

mache soll niemals ein Interrupt ausgelöst werden ?
Ich glaube nicht, dass das der Fehler ist.
Außerdem dachte ich eigentlich, dass PORT's die im TRIS als Eingang 
gesetzt sind Schreibvorgänge zum Port ignorieren, weil es ja keinen Sinn 
macht einen Port Zustand zu setzten, wenn dieser doch äußere "Messen" 
soll.

Die Shadow Register sind doch auch nur simple Register im GPR.
Warum sollte das in irgendeiner weise meinen Fehler hervorrufen?
Warum der Port-Change Interrupt nicht geht, sehe ich auch gerade nicht.
Aber müsste nicht z.B.
     MOVF  SHADOW_PORTA
heißen:
     MOVF  SHADOW_PORTA,W

AFAIK nimmt der Assembler sonst als Default-Destination "File" (MOVF 
SHADOW_PORTA,F), der Befehl macht also nichts, außer das Z-Flag zu 
setzen...
Wieso es nicht funkt. Weil vorher das lese Latsch gesetzt werden muss, 
sonst funkt es nicht. Steht so auch im Datenblatt.
Ein
Movf portb
Reicht dafür.
Nicht aber
Clrf portb-shadow ; shadow=0
Movf portb-shadow ; z flag
Movwf portb ; schreibt 0xff in portb

W enthält 0xff aufgrund eines früheren movlw.
Gast
@Max (Gast)
Hast Du den PORT Change real oder nur im Simulator erprobt? Im Simulator 
funktioniert es nicht. Es hilft da nur einen Taster an einen Pin von 
PORTB anzuschließen und das Ganze real zu prüfen.

Ich habe das mal vor langer Zeit mit dem 16F876A erprobt, nur um meine 
Neugierde zu befriedigen. Beim 876 ist das Register um die Pins an PORTB 
einzeln für den Interrupt zu aktivieren nicht vorhanden.

Den Code habe ich mal begefügt (kurz getestet = OK), vielleicht hilft es 
Dir.

mfG GroberKlotz
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.