| Home
| Contact
|
Title: Interrupts in PIC Microcontrollers
Author: Vincent Wong
Date: 29th March 2005
Below shows the code for enabling all interrupts in a PIC18F452 microcontroller. The program will blink four LEDs connected to
PORTB bit 0 to PORTB bit 3 at different rate demonstrating the functinality of interrupt and the timing control for each timer.
When Vcc drops below 3.3-3.5V, you can save your parameter settings into the EEPROM, in the LVD_INTRSER interrupt service routine.
PortB change interrupt and external interrupt were also implemented. You can perform necessary function within the specified interrupt service routines. Serial interrupt were also implemented.
If there is data coming into the RxD pin, the program will jump to the RX_INTRSER interrupt service routine.
;*******************************************************************
;* TMR0,TMR1,TMR2,TMR3,INT0,INT1,INT2,RBIF INTERRUPTS *
;* LVD,RXD,TXD,MAIN RUNNING SIMULTANEOUSLY *
;*******************************************************************
LIST P=18F452, F=INHX32 ;DIRECTIVE TO DEFINE PROCESSOR AND FILE FORMAT
#INCLUDE ;PROCESSOR SPECIFIC VARIABLE DEFINITIONS
;*******************************************************************
;* CONFIGURATION BITS *
;*******************************************************************
__CONFIG _CONFIG1H, 21H
__CONFIG _CONFIG2L, 0EH
__CONFIG _CONFIG2H, 0EH
__CONFIG _CONFIG3H, 00H
__CONFIG _CONFIG4L, 80H
__CONFIG _CONFIG5L, 0FH
__CONFIG _CONFIG5H, 0C0H
__CONFIG _CONFIG6L, 0FH
__CONFIG _CONFIG6H, 0E0H
__CONFIG _CONFIG7L, 0FH
__CONFIG _CONFIG7H, 40H
;*******************************************************************
;* RAM REGISTER DEFINATION *
;*******************************************************************
CBLOCK 0X080
WREG_TEMP ;VARIABLE USED FOR CONTEXT SAVING
STATUS_TEMP ;VARIABLE USED FOR CONTEXT SAVING
BSR_TEMP ;VARIABLE USED FOR CONTEXT SAVING
ENDC
CBLOCK 0X000
COUNTER
COUNTER1 ;TIMER REGISTERS
COUNTER2
COUNTER3
ENDC
;*******************************************************************
;* PROGRAM VECTOR *
;*******************************************************************
ORG 0X0000 ;RESET VECTOR
GOTO MAIN ;GO TO START OF MAIN CODE
ORG 0X0008
MOVFF STATUS,STATUS_TEMP ;SAVE STATUS REGISTER
MOVFF WREG,WREG_TEMP ;SAVE WORKING REGISTER
MOVFF BSR,BSR_TEMP ;SAVE BSR REGISTER
BTFSC PIR1,RCIF ;Did USART cause interrupt?
GOTO RX_INTRSER
BTFSC INTCON,TMR0IF ;TIMER 0 INTERUPTED
GOTO TMR0_INTRSER
BTFSC PIR1,TMR1IF ;TIMER 1 INTERRUPTED
GOTO TMR1_INTRSER
BTFSC PIR1,TMR2IF ;TIMER 2 INTERRUPTED
GOTO TMR2_INTRSER
BTFSC PIR2,TMR3IF ;TIMER 3 INTERRUPTED
GOTO TMR3_INTRSER
BTFSC INTCON,INT0IF ;EXTERNAL INTR 0
GOTO INT0_INTRSER
BTFSC INTCON3,INT1IF ;EXTERNAL INTR 1
GOTO INT1_INTRSER
BTFSC INTCON3,INT2IF ;EXTERNAL INTR 2
GOTO INT2_INTRSER
BTFSC INTCON,RBIF ;RB PORT CHANGE
GOTO RBIF_INTRSER
BTFSC PIR2,LVDIF
GOTO LVD_INTRSER ;LOW VOLTAGE DETECTED
ISR_ERR:BSF PORTB,3 ;IF INTERRUPT ERROR SOUND BUZZER
GOTO ISR_ERR
TMR0_INTRSER: ;TIMER 0 ISR
DECFSZ COUNTER, F ;DECREMENT COUNTER, SKIP IF ZERO
GOTO TMR0_EXIT
MOVLW D'61' ;SET UP A COUNTER TO COUNT DOWN FROM 61
MOVWF COUNTER ;256 * 64 = 16384 USEC. 61 OF THESE GIVES 999424 USEC.
BTG PORTB,0 ;blink LED1
TMR0_EXIT:
BCF INTCON, TMR0IF ;CLEAR INTERRUPT FLAG, TIMER RUNS ALWAYS
GOTO ISR_EXIT
TMR1_INTRSER:
BCF PIR1,TMR1IF
MOVLW 0X00
MOVWF TMR1L
MOVLW 0XFF
MOVWF TMR1H
DECFSZ COUNTER1, F ;DECREMENT COUNTER, SKIP IF ZERO
GOTO TMR1_EXIT
MOVLW D'250'
MOVWF COUNTER1 ;256 * 8 = 2048 USEC. 250 OF THESE GIVES 512000 USEC.
BTG PORTB,1 ;blink LED2
TMR1_EXIT:
BCF PIR1,TMR1IF
goto ISR_EXIT
TMR2_INTRSER:
BCF PIR1,TMR2IF
MOVLW 0X00
MOVWF TMR2
DECFSZ COUNTER2, F ;DECREMENT COUNTER, SKIP IF ZERO
GOTO TMR2_EXIT
MOVLW D'250'
MOVWF COUNTER2 ;256 * 16 = 4096 USEC. 250 OF THESE GIVES 1024000 USEC.
BTG PORTB,2 ;blink LED3
TMR2_EXIT:
BCF PIR1,TMR2IF
goto ISR_EXIT
TMR3_INTRSER:
BCF PIR2,TMR3IF
MOVLW 0X00
MOVWF TMR3L
MOVLW 0XFF
MOVWF TMR3H
DECFSZ COUNTER3, F ;DECREMENT COUNTER, SKIP IF ZERO
GOTO TMR3_EXIT
MOVLW D'250'
MOVWF COUNTER3 ;256 * 8 = 2048 USEC. 250 OF THESE GIVES 512000 USEC.
BTG PORTB,3 ;;blink LED4
TMR3_EXIT:
BCF PIR2,TMR3IF
goto ISR_EXIT
INT0_INTRSER:
BCF INTCON,INT0IF
INT0_EXIT:
GOTO ISR_EXIT
INT1_INTRSER:
BCF INTCON3,INT1IF
INT1_EXIT:
GOTO ISR_EXIT
INT2_INTRSER:
BCF INTCON3,INT2IF
INT2_EXIT:
GOTO ISR_EXIT
RBIF_INTRSER:
BCF INTCON,RBIF
RBIF_EXIT:
GOTO ISR_EXIT
LVD_INTRSER:
;SAVE ALL SETTINGS AND GO BACK TO RESET 0X00
GOTO ISR_EXIT
RX_INTRSER:
BCF PIR1,RCIF
GOTO ISR_EXIT
ISR_EXIT:
MOVFF BSR_TEMP,BSR ;RESTORE BSR REGISTER
MOVFF WREG_TEMP,WREG ;RESTORE WORKING REGISTER
MOVFF STATUS_TEMP,STATUS ;RESTORE STATUS REGISTER
RETFIE FAST
;*******************************************************************
;* MAIN PROGRAM *
;*******************************************************************
MAIN:
INIT: CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
CLRF INTCON
MOVLW 0X04
MOVWF ADCON1,0 ;A0,A1,A3 ANALOG INPUT, VCC & VSS REF.
MOVLW 0X0B ;PORT DIRECTIONS
MOVWF TRISA,0 ;PA0,PA1,PA3 ANALOG INPUT SET AS INPUT
MOVLW B'11110000' ;KEYPAD
MOVWF TRISB
MOVLW B'10100000' ;RXD INPUT,RC5=SW4
MOVWF TRISC
MOVLW 0X00 ;MAKE ALL PORT AS OUTPUTS
MOVWF TRISD
MOVLW B'00000111' ;RE0,RE1,RE2 SWITCH INPUT
MOVWF TRISE
BCF ADCON1,ADFM,0 ;FORMAT=LEFT JUSTIFIED
BCF ADCON1,ADCS2,0
BCF ADCON0,ADCS1,0
BSF ADCON0,ADCS0,0 ;CLOCK=FOSC/4
BSF ADCON0,ADON,0 ;ENABLE ADC
CLRF PIR1
CLRF PIE1
BSF TRISC,0 ;TIMER 0 RTC CRYSTAL AS INPUT
CLRF PIR1
BCF INTCON,GIEH ;TURN OFF ALL INTERRUPTS
BCF INTCON,GIEL ;disable low priority interrupt
BCF INTCON,TMR0IF
BCF PIR1,TMR1IF
BCF PIR1,TMR2IF
BCF PIR2,TMR3IF
BCF INTCON,RBIF
BCF INTCON2,7 ;RBPU ENABLED
CLRF T0CON
BSF T0CON,T08BIT ;8-BIT FFH->00H
BCF T0CON,T0CS ;SET AS TIMER
BCF T0CON,T0SE ;CLOCK SOURCE = INTERNAL HI->LO TRANSITION
BCF T0CON,PSA ;ASSIGN PRESCALLER TO TIMER 0
BSF T0CON,T0PS2 ;PRESCALER = 1:64
BCF T0CON,T0PS1
BSF T0CON,T0PS0
BSF INTCON,TMR0IE ;ENABLE TIMER0 OVERFOLOW INTERRUPT
CLRF T1CON
BSF T1CON,RD16 ;16-BIT OPERATION
BSF T1CON,T1CKPS1 ;1:8 PRESCALE
BSF T1CON,T1CKPS0
BCF T1CON,T1OSCEN ;OSC DISABLED
BSF T1CON,T1SYNC ;DO NOT SYNC EXTERNAL CLOCK INPUT
BCF T1CON,TMR1CS ;INTERNAL CLOCK
BSF IPR1,TMR1IP
BCF PIR1,TMR1IF
BSF PIE1,TMR1IE ;ENABLE TIMER 1 OVERFLOW INTERRUPT
CLRF T2CON
BCF T2CON,TOUTPS3 ;1:1 POSTSCALER
BCF T2CON,TOUTPS2
BCF T2CON,TOUTPS1
BCF T2CON,TOUTPS0
BSF T2CON,T2CKPS1 ;1:16 PRESCALER
BSF T2CON,T2CKPS0
BSF IPR1,TMR2IP
BSF PIE1,TMR2IE ;ENABLE TIMER 2 OVERFLOW INTERRUPT
CLRF T3CON
BSF T3CON,RD16
BSF T3CON,T3CKPS1 ;1:8 PRESCALER
BSF T3CON,T3CKPS0
BSF T3CON,T3SYNC
BCF T3CON,TMR3CS
BSF IPR2,TMR3IP
BSF PIE2,TMR3IE
MOVLW 0X00 ;LOAD TIMER 0 VALUE
MOVWF TMR0L
MOVLW 0X00 ;LOAD TIMER 1 VALUE
MOVWF TMR1L
MOVLW 0X00 ;LOAD TIMER 2 VALUE
MOVWF TMR2
MOVLW 0X00 ;LOAD TIMER 3 VALUE
MOVWF TMR3L
BCF INTCON2,INTEDG0 ;NEGATIVE EDGE TRIGGERING
BCF INTCON2,INTEDG1
BCF INTCON2,INTEDG2
BSF INTCON3,INT1IP
BSF INTCON3,INT2IP
BSF INTCON,INT0IE ;ENABLE ALL EXTERNAL INTR
BSF INTCON3,INT1IE
BSF INTCON3,INT2IE
BSF INTCON,RBIE ;ENABLE PORTB ON CHANGE INTERRUPT
BSF INTCON,RBIP
BSF LVDCON,IRVST ;INTERRUPT WHEN VCC BELOW TRIP POINT
BSF LVDCON,LVDEN ;ENABLE LVD MODULE
BSF LVDCON,LVDL3 ;DO HOUSEKEEPING WHEN VCC = 3.3V-3.5V
BCF LVDCON,LVDL2
BCF LVDCON,LVDL1
BCF LVDCON,LVDL0
BCF PIR2,LVDIF
BSF IPR2,LVDIP
BSF PIE2,LVDIE ;ENABLE LOW VOLTAGE DETECT INTR
BSF TXSTA,BRGH ;ENABLE HIGH BAUD RATE
movlw D'12' ;115.2K baud @4MHz
movwf SPBRG
BCF TXSTA,SYNC ;ASCYNCHRONOUS COMM
bsf RCSTA,SPEN ;Enable Serial Port
BSF TXSTA,TXEN ;ENABLE TRANSMISSION
bsf RCSTA,CREN ;Enable continuous reception
bcf PIR1,RCIF ;Clear RCIF Interrupt Flag
bsf PIE1,RCIE ;Set RCIE Interrupt Enable
BSF T0CON,TMR0ON ;TURN ON TIMER 0
BSF T1CON,TMR1ON ;TIMER1 START
BSF T2CON,TMR2ON
BSF T3CON,TMR3ON
BSF INTCON,PEIE
BSF INTCON,GIEH ;TURN ON ALL INTERRUPTS
;*******************************************************************
;* PROGRAM BODY *
;*******************************************************************
PROG: goto PROG
end
| Home
| Top Page
| Contact
|
Copyright Notice: This article, including all text, documents and schematic diagrams, are the intellectual property
of Vincent Wong, and is Copyright (c) 2005. Reproduction or re-publication by any means whatsoever,
whether it is electrical & electronic, mechanical or electro-mechanical, is strictly prohibited under International Copyright laws.
The author (Vincent Wong) grants the reader the right to use this information for personal use only.
Commercial use is prohibited without express written authorisation from Vincent Wong.
Copyright of Vincent Wong. All Rights Reserved.
|