org 4 intvec bcf INTCON, GIE ; disable Interupt MOVWF W_TEMP ;Copy W to TEMP register SWAPF STATUS,W ;Swap status to be saved into W ;Swaps are used because they do not affect the status bits MOVWF S_TEMP ;Save status to bank zero STATUS_TEMP register ; BTFSS INTCON,INTF ; Übergehe wenn INTF = 1 ; wechsel an Port RB0 GOTO Next1 ; MOVLW B'00000001' ; RA0 mit xor vernüpfen XORWF PORTA,1 ; invertieren von RA0 bcf INTCON, INTF ; RB0-Interrupt-Flag löschen bsf PORTA,B'00000100' GOTO Int_End Next1 BTFSS INTCON,T0IF GOTO Next2 MOVLW B'00000010' ; RA1 mit xor vernüpfen XORWF PORTA,1 ; invertieren von RA1 bcf INTCON,T0IF ; Timer0 Flag wieder setzen GOTO Int_End Next2 Int_End bsf INTCON, GIE ; ensable Interupt SWAPF S_TEMP,W ;Swap STATUS_TEMP register into W ;(sets bank to original state) MOVWF STATUS ;Move W into STATUS register SWAPF W_TEMP,F ;Swap W_TEMP SWAPF W_TEMP,W ;Swap W_TEMP into W ; Intrupt servic routine Int_serv RETFIE ;************************************************************** ; Port A/B auf Ausgabe stellen Init ; Port RA0 auf Ausgabe stellen clrf PORTA ; LED aus bsf STATUS, RP0 ; auf Bank 1 umschalten movlw B'00000000' ; PortA RA0-RA3 output movwf TRISA movlw B'00000000' ; PortA RA0-RA3 output movwf TRISB movlw B'00000011' ; PortA RA0-RA3 output movwf TRISB bcf STATUS, RP0 ; auf Bank 0 zurückschalten ; RB0-Interrupt einstellen bsf STATUS, RP0 ; auf Bank 1 umschalten bsf OPTION_REG, INTEDG ; 0-1-Flanke an RB0 bcf OPTION_REG, T0CS bcf STATUS, RP0 ; auf Bank 0 zurückschalten bcf INTCON,T0IE ; Timer 0 einschalten !!!!!! bsf INTCON, INTE ; RB0-interrupt erlauben MOVLW B'00001111' MOVWF PORTA NOP NOP NOP MOVLW B'00000000' MOVWF PORTA bsf INTCON, GIE ; Interrupt generell erlauben loop goto loop ; eine Endlosschleife ;********************************************************** end Hallo es handelt sich hierbei um einen PIC16F887 Eigentlich sollte die Interruptschleife "INTF", wenn ich ein 5V Potential auf RB0 gebe richtig aufgerufen werden, beim PIC16F84A funktionierte dies. Übersehe ich was. Martin Michael
Auf ORG 0 den Sprung in deine Initialisierung. Der Prozessor rennt los und landet erst einmal in der Interrupt Routine. Es ist gute Proxis vorne erst einmal auf ORG 0 zwei NOP für den Debugger und dann auf ORG 2 den Spung in die INIT zu verwenden. Die Interrupt Routine würde ich auch mit einem Sprung von ORG 4 ans Ende meines Programm legen. mfG Michael
Ei das habe ich doch gemacht Ich dachte das wäre klar org 0 goto Init und mir ist auch klar das der Timer0 ausgeschaltet ist. Es geht mir vor allem darum, ob es richtig ist das bei einer Pegeländerung, ein Interrupt INTE / INTF ausgelöst wird. Danke
Im OPTION_REG nur die Flanke einzustellen dürfte zu wenig sein. Datenblatt F887 sagt: ...... All of the PORTB pins are individually configurable as an interrupt-on-change pin. Control bits IOCB<7:0> enable or disable the interrupt function for each pin. Refer to Register 3-8. The interrupt-on-change feature is disabled on a Power-on Reset. ...... Da fehlt wohl noch: BANKSEL IOCB movlw b'00000001' movwf IOCB
Ich werde mal einen voll funktionsfähigen Assemblercode anfügen ; ;************************************************************** ; Includedatei für den 16F877 einbinden list p=16f887 #include <P16f887.INC> __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF ; % _DEBUG_ON __CONFIG _CONFIG2, _WRT_OFF & _BOR21V ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES ;************************************************************** ; Variablennamen vergeben ; werden hier nicht alle benötigt UDATA 0x20 Ziffer1 RES 1 ; Wert des LSD Ziffer2 RES 1 ; Wert der zweitkleinsten Stelle Ziffer3 RES 1 ; Wert der zweitgrößten Stelle Ziffer4 RES 1 ; Wert des MSD Digit RES 1 ; Ziffernzähler ar RES 1 TastCount1 RES 1 ; zum Zählen der Timerdurchgänge TastCount2 RES 1 ; W_TEMP EQU 0x71 ; Backup für Akkuregister S_TEMP EQU 0x72 ; Backup für Statusregister PortA_Temp EQU 0x73 PortB_Temp EQU 0x73 ;************************************************************** ; los gehts mit dem Programm org 0 goto Init ;************************************************************** ; die Interuptserviceroutine org 4 intvec bcf INTCON, GIE ; disable Interupt MOVWF W_TEMP ;Copy W to TEMP register SWAPF STATUS,W ;Swap status to be saved into W ;Swaps are used because they do not affect the status bits MOVWF S_TEMP ;Save status to bank zero STATUS_TEMP register MOVFW PORTB ; Status von Port B sichern MOVWF PortB_Temp CheckInt BTFSS INTCON,RBIE ; Übergehe wenn INTE = 1 ; wechsel an Port RB0 GOTO Next1 ; BTFSS INTCON,RBIF ; RBIE "UND" RBIF GOTO Next1 ; MOVFW PortB_Temp ; PortB Eingang mit xor vernüpfen XORWF PORTA,1 ; invertieren von RA0 bcf INTCON, RBIF ; RB0-Interrupt-Flag löschen bsf INTCON, T0IE ; Timer Interrupt setzen GOTO Next1;Int_End Next1 BTFSS INTCON,T0IE GOTO Next2 BTFSS INTCON,T0IF ; T0IE "UND" T0IF GOTO Next2 DECFSZ TastCount1 GOTO Next2 MOVLW 0xFF ; Anzahl Timer Durchgänge MOVWF TastCount1 ; für neues Starten bcf INTCON,T0IF ; Timer0 Flag wieder löschen bcf INTCON,T0IE ; Timer0 Disabel GOTO Next2;Int_End Next2 BTFSS INTCON,INTE GOTO Next3 BTFSS INTCON,INTF ; INTE "UND" INTF GOTO Next3 bcf INTCON,INTF ; INTF Flag wieder löschen GOTO Next3;Int_End Next3 Int_End SWAPF S_TEMP,W ;Swap STATUS_TEMP register into W ;(sets bank to original state) MOVWF STATUS ;Move W into STATUS register SWAPF W_TEMP,F ;Swap W_TEMP SWAPF W_TEMP,W ;Swap W_TEMP into W bsf INTCON, GIE ; enable Interupt ; Intrupt servic routine Int_serv RETFIE ;************************************************************** ; Port A/B auf Ausgabe stellen Init MOVLW 0xFF MOVWF TastCount1 ; Port RA0 auf Ausgabe stellen clrf PORTA ; LED's aus BANKSEL TRISA movlw B'00000000' ; PortA RA0-RA3 output movwf TRISA movlw B'00001111' ; PortB RB4-RB7 output movwf TRISB ; PortB RB0-RB3 input BANKSEL ANSEL ; alle Ports Digital CLRF ANSEL CLRF ANSELH BANKSEL ADCON0 CLRF ADCON0 BANKSEL ADCON1 CLRF ADCON1 ; End Port Dugital Diffination BANKSEL CCP1CON CLRF CCP1CON BANKSEL CCP2CON CLRF CCP2CON BANKSEL IOCB ; movlw b'00001111' ; Set Port RB0-RB1 INTERRUPT-ON-CHANGE movwf IOCB CLRF WPUB ;WEAK Pull-Up deaktiviert BANKSEL OPTION_REG bcf OPTION_REG,PSA ;bit 3 = 0 PSA: Prescaler Assignment bit ;1 = Prescaler is assigned to the WDT ;0 = Prescaler is assigned to the Timer0 module MOVFW B'00000111' ;bit 2-0 PS<2:0>: Prescaler Rate Select bits ;110 - 1:64 ; 111 - 1:128 bsf OPTION_REG, INTEDG ; 0-1-Flanke bcf OPTION_REG, T0CS ; Internal Timer Foac/4 BANKSEL INTCON ; auf Bank 0 zurückschalten bcf INTCON,T0IE ; Timer 0 AUS schalten !!!!!! bsf INTCON, INTE ; Intern Interrupts erlauben bsf INTCON, RBIE ; RB -interrupt erlauben BCF INTCON,RBIF ; Flags löschen BCF INTCON,INTF ; !!!! MOVLW B'00001111' ; Nur zum Test MOVWF PORTA ; Led RA0-4 an NOP NOP NOP MOVLW B'00000000' ; und wieder aus MOVWF PORTA bsf INTCON, GIE ; Interrupt generell erlauben loop goto loop ; eine Endlosschleife ;********************************************************** end
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.