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
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.
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?
Noch interessanter ist die Frage wie 256 in einem 8bit Register stehen kann.
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.