; Assembly PIC18 - Versione 0.1 - Maggio 2016 ; Copyright (c) 2016, Vincenzo Villa ; Creative Commons | Attribuzione - Condividi allo stesso modo 4.0 Internazionale (CC BY-SA 4.0) ; Creative Commons | Attribution-Share Alike 4.0 Unported ; https://www.vincenzov.net/tutorial/PIC18/Assembly/interrupt.htm ; Interruzioni: Priority mode ; PIC18F26K20 / MPLAB X 3.30 / MPASM v5.67 #include "p18f26k20.inc" ; ;****************************************************************************** RES_VECT CODE 0x0000 ; Vettore di Reset goto Inizio ; Va all'inizio del programma ISR_Alta CODE 0x0008 ; Vettore per ISR ad alta priorità goto AltaPriorita ; Salta all'inizi della ISR ad alta priorità ISR_Bassa CODE 0x0018 ; Vettore per ISR a bassa priorita goto BassaPriorita ; Salta all'inizi della ISR bassa priorità ;****************************************************************************** Variabili_ISR UDATA ; Variabili temporanee utilizzate dalle ISR a bassa priorità WREG_TEMP res 1 ; Variabile temporanea per salvare il registro WREG STATUS_TEMP res 1 ; Variabile temporanea per salvare i flags BSR_TEMP res 1 ; Variabile temporanea per salvare il registro BSR ;****************************************************************************** Interruzioni CODE ; Codice per la gestione delle interruzioni AltaPriorita btfsc INTCON, INT0IF ; Interruzione causata da INT0 ? bra GestioneINT0 ; Esegue il codice corrispondente btfsc INTCON, TMR0IF ; Interruzione da Timer0 ? bra GestioneTimer0 ; ; ... retfie FAST ; Nessuna fleg settato... Indizio di un errore? GestioneINT0 rlncf LATC ; "Ruota" i LED bcf INTCON, INT0IF ; Azzera il flag che segnala INT0 retfie FAST ; Torna ad eseguire il codice principale GestioneTimer0 ; Non implementato bcf INTCON, INT0IF retfie FAST ;****************************************************************************** BassaPriorita movff WREG, WREG_TEMP ; salva il registro W nella variabile "temporanea" movff STATUS, STATUS_TEMP ; salva i flag nella variabile "temporanea" movff BSR, BSR_TEMP ; salva il registro BSR nella variabile "temporanea" btfsc INTCON3, INT1IF ; Interruzione causata da INT1 ? bra GestioneINT1 ; Esegue il codice corrispondente btfsc INTCON3, INT2IF ; Interruzione causata da INT2 ? bra GestioneINT2 ; Esegue il codice corrispondente bra Ritorna ; Nessuna fleg settato... Indizio di un errore? GestioneINT1 bcf INTCON3, INT1IF ; Azzera il flag che segnala INT1 movlw 0x01 ; LED0 acceso; LED1-7 spenti (situazione iniziale) movwf LATC bra Ritorna GestioneINT2 ; Non implementato bcf INTCON3, INT2IF ; Azzera il flag che segnala INT2 bra Ritorna Ritorna movff STATUS_TEMP, STATUS ; ripristina i flags movff WREG_TEMP, WREG ; ripristina il registro W movff BSR_TEMP, BSR ; ripristina il registro BSR retfie ;****************************************************************************** MAIN_PROG CODE Inizio ; Configurazione delle porte di I/O clrf TRISC ; PORTC come uscita, tutti gli 8 pin movlw 0x01 ; LED0 acceso; LED1-7 spenti movwf LATC movlw 0xFF ; PORTB come ingresso, tutti gli 8 pin movwf TRISB bsf WPUB, INT0 ; abilita il pull-up interno su INT0 bsf WPUB, INT1 ; abilita il pull-up interno su INT1 bcf INTCON2, RBPU ; Pull-up attivo su tutti i pin abilitati ; Configurazione delle interrupt bsf RCON, IPEN ; Abilito le interruzioni a livelli di priorità bsf INTCON, INT0IE ; Abilito INT0 a generare interruzioni (ad alta priorità) bcf INTCON3, INT1IP ; Imposto INT1 a bassa priorità bsf INTCON3, INT1IE ; Abilito INT1 a generare interruzioni bsf INTCON, GIEH ; Abilito la CPU a ricevere interruzioni ad alta priorità bsf INTCON, GIEL ; Abilito la CPU a ricevere interruzioni a bassa priorità ; Superloop repeat nop ; non fa nulla (No OPeration), per sempre nop bra repeat END