PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 16f628 -> Interrupts



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

kalledom
24.05.2007, 12:45
Hallo,
schau Dir mal diesen (http://www.domnick-elektronik.de/picasm.htm) und diesen (http://www.domnick-elektronik.de/picpwm.htm) Link an, vielleicht bringt es Dich ein Stück weiter.
Nach Auslösen eines Interrupts mußt Du in der ISR (Interrupt-Service-Routine) selber ermitteln, wer der Auslöser war.
Bei dem PortB-Int mußt Du auch zusätzlich ermitteln, welches Bit sich geändert hat.