Free Web Hosting by Netfirms
Web Hosting by Netfirms | Free Domain Names by Netfirms

EE Design > In Technical
| 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.