Forum: Mikrocontroller und Digitale Elektronik PIC16f887 PORTB Interrupt funktioniert nicht


von Max (Gast)


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

von Chris S. (schris)


Lesenswert?

Es gib keine Fehler, bis auf dem in deinem Kopf. Schadow wird auf 0 
gesetzt, richtiges reg auf 256. Nirgends wird portb eingelesen, usw.
Ein einfaches movf portb solte das problem beheben.

von Max (Gast)


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?

von 8bitter (Gast)


Lesenswert?

Noch interessanter ist die Frage wie 256 in einem 8bit Register stehen 
kann.

von Thomas E. (picalic)


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...

von Chris S. (schris)


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.

von GroberKlotz (Gast)


Angehängte Dateien:

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

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.