EGSLER
24.05.2007, 09:40
Moin Moin,
Ich möchte bei einem PIC 16f628 einen Interrupt durch Pegeländerung an den Pins RB4 bis RB7 auslösen. Wie erkennt nun der PIC, durch welchen Pin der Interrupt ausgelöst wurde? Wie komme ich von einem Interrupt in ein Unterprogramm? RB4 bis RB7 sollen jeweils einen Interrupt auslösen und in verschiedene Unterprogramme springen. Z.B RB7 Interrupt -> knightrider. Im Anhang befindet sich ein Textdokument mit dem Programm, dass ich bis jetzt programmiert habe, es funktioniert aber leider nicht ](*,)
Wäre nett, wenn jemand mir helfen würde :-b
intvec
movwf w_copy ; Arbeitsregister sichern
swapf STATUS, w ; STAtus retten
bcf STATUS, RP0 ; status_temp in Bank 0
movwf s_copy
incf PORTA, f ; invertieren von RA0
btfsc f,B'10000000' ; Wenn RB7 0 ist überspringe goto
goto rider ; Springe nach rider
call wait ; Springe ins Unterprogramm
btfsc f,B'01000000' ; Wenn RB6 "0" ist goto
goto lauf ; Springe nach lauf
call wait ; Springe ins Unterprogramm
Int_end
bcf INTCON, RBIE ; Flag Bit löschen
swapf s_copy, w ; Status zurück holen
movwf STATUS
swapf w_copy, f
swapf w_copy, w
retfie
;************************************************* *************
; das Hauptprogramm
Init
;16F628 alle Comparatoreingänge auf Digital umschalten
; Port RA0 auf Ausgabe stellen
clrf PORTA ; LED aus
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11110000' ; PortA RA0 output
movwf TRISA
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
BSF CMCON, CM0 ;Eingänge auf Digital schalten
BSF CMCON, CM1
BSF CMCON, CM2
; RB0-Interrupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
bsf OPTION_REG, RBIF ; Interrupt wird durch RB4-RB7
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bsf INTCON, RBIE ; RB0-interrupt erlauben
bsf INTCON, GIE ; Interrupt generell erlauben
loop goto loop ; eine Endlosschleife
Ich möchte bei einem PIC 16f628 einen Interrupt durch Pegeländerung an den Pins RB4 bis RB7 auslösen. Wie erkennt nun der PIC, durch welchen Pin der Interrupt ausgelöst wurde? Wie komme ich von einem Interrupt in ein Unterprogramm? RB4 bis RB7 sollen jeweils einen Interrupt auslösen und in verschiedene Unterprogramme springen. Z.B RB7 Interrupt -> knightrider. Im Anhang befindet sich ein Textdokument mit dem Programm, dass ich bis jetzt programmiert habe, es funktioniert aber leider nicht ](*,)
Wäre nett, wenn jemand mir helfen würde :-b
intvec
movwf w_copy ; Arbeitsregister sichern
swapf STATUS, w ; STAtus retten
bcf STATUS, RP0 ; status_temp in Bank 0
movwf s_copy
incf PORTA, f ; invertieren von RA0
btfsc f,B'10000000' ; Wenn RB7 0 ist überspringe goto
goto rider ; Springe nach rider
call wait ; Springe ins Unterprogramm
btfsc f,B'01000000' ; Wenn RB6 "0" ist goto
goto lauf ; Springe nach lauf
call wait ; Springe ins Unterprogramm
Int_end
bcf INTCON, RBIE ; Flag Bit löschen
swapf s_copy, w ; Status zurück holen
movwf STATUS
swapf w_copy, f
swapf w_copy, w
retfie
;************************************************* *************
; das Hauptprogramm
Init
;16F628 alle Comparatoreingänge auf Digital umschalten
; Port RA0 auf Ausgabe stellen
clrf PORTA ; LED aus
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11110000' ; PortA RA0 output
movwf TRISA
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
BSF CMCON, CM0 ;Eingänge auf Digital schalten
BSF CMCON, CM1
BSF CMCON, CM2
; RB0-Interrupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
bsf OPTION_REG, RBIF ; Interrupt wird durch RB4-RB7
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bsf INTCON, RBIE ; RB0-interrupt erlauben
bsf INTCON, GIE ; Interrupt generell erlauben
loop goto loop ; eine Endlosschleife