PIC16f887 PORTB Interrupt funktioniert nicht

Gast #4172845
Lesenswert?
• ▲
▼
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 #4172896
Lesenswert?
• ▲
▼
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?
#4173062
Lesenswert?
• ▲
▼
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...
#4173085
Lesenswert?
• ▲
▼
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 #4174057
Lesenswert?
• ▲
▼
@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

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.

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.