Lényegében semmi különöset nem kell csinálnunk, mit figyeljük melyik Flag vesz fel 1-es értéket, és ennek megfelelően ugrunk.
Fontos, hogy az egyes esetek után, ne hagyjuk ott a programot, hanem ugorjunk a kilépésre, hisz ha esetünkben most a Timer0 megszakítás után nem lépünk a kilépés részre, akkor végrehajtaná az RB0 interruptot is, mivel folyamatosan szépen halad tovább!
LIST P=16F877
#INCLUDE "P16F877.INC"
ERRORLEVEL 0, -302 ; suppress bank selection messages
__CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
CBLOCK 0x70 ;A Minden BANK-ból látható GPR kezdőcím
W_SAVE
STATUS_SAVE
ENDC
#include "m_bank.asm"
ORG 0
GOTO MAIN ;Beugrunk a MAIN loopba
ORG 4
; Elmentjük a Work és Status regisztereket
MOVWF W_SAVE ;Először a Work regisztert
MOVFW STATUS ;STATUS-t bele a már lementett Workbe
MOVWF STATUS_SAVE ;Status_save-be beletölti a Worköt
BTFSC INTCON,T0IF ;Ha 1 a TMR0 flag
GOTO MEGSZ_TIMER ;Goto a timer megszakításra
BTFSC INTCON,INTF ;Ha 1 az INTF flag
GOTO MEGSZ_RB0 ;Goto a rb0 megszakításra
GOTO MEGSZ_KILEP ;Ha egyiksem, akkor visszatölt+kilép
MEGSZ_TIMER
INCF PORTD,F
BCF INTCON,T0IF ;Töröljük az T0IF flag bitet (Jelezzük, kezeltük a megszakítást Timer0)
GOTO MEGSZ_KILEP ;Kilépés+visszatöltős részre ugrunk
MEGSZ_RB0
MOVLW b'00000001' ;Be az adatot
MOVWF PORTD ;Ki a portra - bekapcs első led
BCF INTCON,INTF ;Töröljük az INTF flag bitet (Jelezzük, kezeltük a megszakítást RB0)
GOTO MEGSZ_KILEP ;Kilépés+visszatöltős részre ugrunk
MEGSZ_KILEP ;Label kezdet
; Visszatöltjük a Work és Status regisztereket
MOVFW STATUS_SAVE
MOVWF STATUS
MOVFW W_SAVE
RETFIE ;Visszajövünk az interruptból
MAIN
BANK1 ;Unit az m_bank.asm-ben
MOVLW B'00011111' ;Betöltjük az akksiba a TRISA-ba valót
MOVWF TRISA ;Beletöltjük (0-5 bemenet)
MOVLW B'00000000' ;Betöltjük az akksiba a TRISD-be valót
MOVWF TRISD ;Beletöltjük (mind kimenet a nulla miatt)
MOVLW B'00000001' ;Betöltjük az akksiba a TRISB-be valót
MOVWF TRISB ;Beletöltjük az 0. PORTB bemenet lesz
MOVLW B'00000111'
MOVWF OPTION_REG ;256-os előosztás, lefutó él, TMR0-é az előosztó
BANK0 ;BANK0-ba visszalépünk
MOVLW B'00000001' ;Betöltjük az akksiba a PORTD-be valót
MOVWF PORTD ;Beletöltjük a PORTD-be
;Beállítjuk az RB0 interruptot
BSF INTCON,T0IE ;Engedélyezzük az interruptot az INT0-ra
BSF INTCON,INTE ;Engedélyezzük az interruptot az INT0-ra
BSF INTCON,GIE ;Bekapcsolunk minden megszakítást
LOOP
NOP
GOTO LOOP ;Vissza a végtelen ciklusba
END ;Teljes program végét jelentő END
Hogy az OPTION_REG-nél mire mit állítottunk be, azt láthatjuk ha előttünk van a regiszteres oldal.
A TRISA-t azért állítjuk be, mert még egy Gomb ott van a PORTA-n.
A program forráskód, segéd rutinok és a lefordított hex: multi_asm.zip
Nézzük most meg a C nyelven írt változatot.
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!