Interrupts 
																		- An 
																		Introduction
The 
																		subject 
																		of 
																		interrupts 
																		is 
																		probably 
																		going to 
																		be the 
																		longest 
																		and most 
																		difficult 
																		to go 
																		through. There is 
																		no easy 
																		way of 
																		explaining 
																		interrupts, 
																		but 
																		hopefully 
																		by the 
																		end of 
																		this 
																		section 
																		you will 
																		be able 
																		to 
																		implement 
																		interrupts 
																		into 
																		your own 
																		programs. We have 
																		split 
																		the
																		section 
into two parts. This is to help break the subject up, and to give you, the 
reader, a break. 
So what is an interrupt?  Well, as the name suggests, an interrupt is a 
process or a signal that stops a microprocessor/microcontroller from what it is 
doing so that something else can happen. Let me give you an every day 
example. Suppose you are sitting at home, chatting to someone. 
Suddenly the telephone rings. You stop chatting, and pick up the telephone 
to speak to the caller. When you have finished your telephone 
conversation, you go back to chatting to the person before the telephone rang. You can think of the main routine as you chatting to someone, the telephone 
ringing causes you to interrupt your chatting, and the interrupt routine is the 
process of talking on the telephone. When the telephone conversation has 
ended, you then go back to your main routine of chatting. This example is 
exactly how an interrupt causes a processor to act. The main program is 
running, performing some function in a circuit, but when an interrupt occurs the 
main program halts while another routine is carried out. When this routine 
finishes, the processor goes back to the main routine again. 
The PIC has 4 sources of interrupt. They can be split into two groups. Two are sources of interrupts that can be applied externally to the PIC, while 
the other two are internal processes. We are going to explain the two 
external ones here. The other two will be explained in other tutorials 
when we come to look at timers and storing data. 
If you 
																		look at 
																		the 
																		pin-out 
																		of the 
																		PIC, you 
																		will see 
																		that pin 
																		6 shows 
																		it is 
																		RB0/INT. Now, RB0 
																		is 
																		obviously 
																		Port B 
																		bit 0. The INT 
																		symbolizes 
																		that it 
																		can also 
																		be 
																		configures 
																		as an 
																		external 
																		interrupt 
																		pin. Also, 
																		Port B
bits 
																		4 to 7 
																		(pins 10 
																		to 13) 
																		can also 
																		be used 
																		for 
																		interrupts. Before 
																		we can 
																		use the INT or 
other Port B pins, we need to do two things. First we need to tell the PIC 
that we are going to use interrupts. Secondly, we need to specify which 
port B pin we will be using as an interrupt and not as an I/O pin. 
Inside 
																		the PIC 
																		there is 
																		a 
																		register 
																		called 
																		INTCON, 
																		and is 
																		at 
																		address 
																		0Bh. Within 
																		this 
																		register 
																		there 
																		are 8 
																		bits 
																		that can 
																		be 
																		enabled 
																		or 
																		disabled. Bit 7 of INTCON 
																		is 
																		called 
																		GIE. This is 
																		the 
																		Global Interrngupt 
																		Enable. Setting 
																		this to 
																		1 tells 
																		the PIC 
																		that we 
																		are 
																		going to 
																		use an 
																		interrupt. Bit 4 of INTCON 
																		is 
																		called 
																		INTE, 
																		which 
																		means 
																		INTerrupt  
																		Enable. Setting 
																		this bit 
																		to 1 
																		tells 
																		the PIC 
																		that RB0 
																		will be 
																		an 
																		interrupt 
																		pin. Setting 
																		bit 3, 
																		called RBIE, 
																		tells 
																		the PIc 
																		that we 
																		will be 
																		using 
																		Port B 
																		bits 4 
																		to 7. 
																		Now the 
																		PIC 
																		knows 
																		when 
																		this pin 
																		goes 
																		high or 
																		low, it 
																		will 
																		need to 
																		stop 
																		what 
																		it’s 
																		doing 
																		and get 
																		on with 
																		an 
																		interrupt 
																		routine. Now, we 
																		need to 
																		tell the 
																		PIC 
																		whether 
																		the 
																		interrupt 
																		is going 
																		to be on 
																		the 
																		rising 
																		edge (0V 
																		to +5V) 
																		or the 
																		falling 
																		edge 
																		(+5V to 
																		0V) 
																		transition 
																		of the 
																		signal. In other 
																		words, 
																		do we 
																		want the 
																		PIC to 
																		interrupt 
																		when the 
																		signal 
																		goes 
																		from low 
																		to high, 
																		or from 
																		high to 
																		low. By 
																		default, 
																		this is 
																		set up 
																		to be on 
																		the 
																		rising 
																		edge. The edge 
																		‘triggering’ 
																		is set 
																		up in 
																		another 
																		register 
																		called 
																		the 
																		OPTION 
																		register, 
																		at 
																		address 
																		81h. The bit 
																		we are 
																		interested 
																		in is 
																		bit 6, 
																		which is 
																		called INTEDG. 
Setting this to 1 will cause the PIC to interrupt on the rising edge (default 
state) and setting it to 0 will cause the PIC to interrupt on the falling edge. If you want the PIC to trigger on the rising edge, then you don’t need to do 
anything to this bit. Now, unfortunately, the Option register is in Bank 
1, which means that we have to change from bank 0 to bank 1, set the bit in the 
Option register, then come back to bank 0. The trick here is to do all of 
the Bank 1 registers in one hit, such as setting up the port pins, then coming 
back to Bank 0 when you are finished. 
Ok, so now we have told the PIC which pin is going to be the interrupt, and 
on which edge to trigger, what happens in the program and the PIC when the 
interrupt occurs? Two things happen. First, a ‘flag’ is set. This tells the internal processor of the PIC that an interrupt has occurred. 
Secondly, the program counter (which we mentioned in the last tutorial) points 
to a particular address within the PIC. Let’s quickly look at each of 
these separately. 
Interrupt 
																		Flag
In our 
																		INTCON 
																		register, 
																		bit 1 is 
																		the 
																		interrupt 
																		flag, 
																		called 
																		INTF. Now, when any interrupt occurs, this flag will be set to 1. While there 
isn’t an interrupt, the flag is set to 0. And that is all it does. Now you are probably thinking ‘what is the point?’  Well, while this flag 
is set to 1, the PIC cannot, and will not, respond to any other interrupt. So, let’s say that we cause an interrupt. The flag will be set to 1, and 
the PIC will go to our routine for processing the interrupt. If this flag 
wasn’t set to 1, and the PIC was allowed to keep responding to the interrupt, 
then continually pulsing the pin will keep the PIC going back to the start of 
our interrupt routine, and never finishing it. Going back to my  
example of the telephone, it’s like picking up the telephone, and just as soon 
as you start to speak it starts ringing again because someone else want to talk 
to you. It is far better to finish one conversation, then pick up the 
phone again to talk to the second person. 
There is 
																		a slight 
																		drawback 
																		to this 
																		flag. Although 
																		the PIC 
																		automatically 
																		sets 
																		this 
																		flag to 
																		1, it 
																		doesn’t 
																		set it 
																		back to 
																		0! That 
																		task has 
																		to be 
																		done by 
																		the 
																		programmer 
																		– i.e. 
																		you. This is 
																		easily 
																		done, as 
																		We are sure 
																		you can 
																		guess, 
																		and has 
																		to be 
																		done 
																		after 
																		the PIC 
																		has 
																		executed 
																		the 
																		interrupt 
																		routine. 
Memory 
																		Location
When you first power up the PIC, or if there is a reset, the Program Counter 
points to address 0000h, which is right at the start of the program memory. However, when there is an interrupt, the Program Counter will point to address 
0004h. So, when we are writing our program that is going to have 
interrupts, we first of all have to tell the PIC to jump over address 0004h, and 
keep the interrupt routine which starts at address 0004h separate from the rest 
of the program. This is very easy to do. 
First, 
																		we start 
																		our 
																		program 
																		with a 
																		command 
																		called 
																		ORG. This 
																		command 
																		means 
																		Origin, 
																		or 
																		start. 
																		We 
																		follow 
																		it with 
																		an 
																		address. Because 
																		the PIC 
																		will 
																		start at 
																		address 
																		0000h, 
																		we type 
																		ORG 
																		0000h. 
																		Next we 
																		need to 
																		skip 
																		over 
																		address 
																		0004h. We do 
																		this by 
																		placing 
																		a GOTO 
																		instruction, 
																		followed 
																		by a 
																		label 
																		which 
																		points 
																		to our 
																		main 
																		program. We then 
																		follow 
																		this GOTO 
																		command 
																		with 
																		another 
																		ORG, 
																		this 
																		time 
																		with the 
																		address 
																		0004h. It is 
																		after 
																		this 
																		command 
																		that we 
																		enter 
																		our 
																		interrupt 
																		routine. Now, we 
																		could 
																		either 
																		type in 
																		our 
																		interrupt 
																		routine 
																		directly 
																		following 
																		the 
																		second 
																		ORG 
																		command, 
																		or we 
																		can 
																		place a GOTO 
																		statement 
																		which 
																		points 
																		to the 
																		interrupt 
																		routine. It 
																		really 
																		is a 
																		matter 
																		of 
																		choice 
																		on your 
																		part. To tell 
																		the PIC 
																		that it 
																		has come 
																		to the 
																		end of 
																		the 
																		interrupt 
																		routine 
																		we need 
																		to place 
																		the 
																		command RTFIE at 
																		the end 
																		of the 
																		routine. This 
																		command 
																		means 
																		return 
																		from the 
																		interrupt 
																		routine. When the 
																		PIC see 
																		this, 
																		the 
																		Program 
																		Counter 
																		points 
																		to the 
																		last 
																		location 
																		the PIC 
																		was at 
																		before 
																		the 
																		interrupt 
																		happened. We have 
																		shown 
																		below a 
																		short 
																		segment 
																		of code 
																		to show 
																		the 
																		above: 
            
																		ORG    
																		0000h  ;PIC 
																		starts 
																		here on 
																		power up 
																		and 
																		reset 
																		            
																		GOTO  
																		start    
																		;Goto 
our main program 
																		            
																		ORG    
																		0004h  
																		;The PIC 
																		will 
																		come 
																		here on 
																		an 
																		interrupt 
																		           
																		:                     ;This is 
																		our 
																		interrupt 
																		routine 
																		that we 
																		           
																		:                     ;want 
																		the PIC 
																		to do 
																		when it 
																		receives 
																		            
																		:                     ;an 
																		interrupt 
           
																		RETFIE           ;End of 
																		the 
																		interrupt 
																		routine 
            start               ;This is 
																		the 
																		start of 
																		our main 
																		program. 
There 
																		are two 
																		things 
																		you 
																		should 
																		be aware 
																		of when 
																		using 
																		interrupts. The 
																		first is 
																		that if 
																		you are 
																		using 
																		the same 
																		register 
																		in your 
																		main 
																		program 
																		and the 
																		interrupt 
																		routine, 
																		bear in 
																		mind 
																		that the 
																		contents 
																		of the 
																		register 
																		will 
																		probably 
																		change 
																		when the 
																		interrupt 
																		occurs. For 
																		example, 
																		let’s 
																		you are 
																		using 
																		the w 
																		register 
																		to send 
																		data to 
																		Port A 
																		in the 
																		main 
																		program, 
																		and you 
																		are also 
																		using 
																		the w 
																		register 
																		in the 
																		interrupt 
																		routine 
																		to move 
																		data 
																		from one 
																		location 
																		to 
																		another. If you 
																		are not 
																		careful, 
																		the w 
																		register 
																		will 
																		contain 
																		the last 
																		value it 
																		had when 
																		it was 
																		in the 
																		interrupt 
																		routine, 
																		and when 
																		you come 
																		back 
																		from the 
																		interrupt 
																		this 
																		data 
																		will be 
																		sent to 
																		Port A 
																		instead 
																		of the 
																		value 
																		you had 
																		before 
																		the 
																		interrupt 
																		happened. The way 
																		round 
																		this is 
																		to 
																		temporarily 
																		store 
																		the 
																		contents 
																		of the w 
																		register 
																		before 
																		you use 
																		it again 
																		in the 
																		interrupt 
																		routine. The 
																		second 
																		is that 
																		there is 
																		a delay 
																		between 
																		when one 
																		interrupt 
																		occurs 
																		and when 
																		the next 
																		one can 
																		occur. As you 
																		know, 
																		the PIC 
																		has an 
																		external 
																		clock, 
																		which 
																		can 
																		either 
																		be a 
																		crystal 
																		or it 
																		can be a 
																		resistor-capacitor 
																		combination. Whatever 
																		the 
																		frequency 
																		of this 
																		clock, 
																		the PIC 
																		divides 
																		it by 4 
																		and then 
																		uses 
																		this for 
																		it’s 
																		internal 
																		timing. For 
																		example 
																		if you 
																		have a 
																		4MHz 
																		crystal 
																		connected 
																		to your 
																		PIC, 
																		then the 
																		PIC will 
																		carry 
																		out the 
																		instructions 
																		at 
																		1MHz. 
																		This 
																		internal 
																		timing 
																		is 
																		called 
																		an 
																		Instruction 
																		Cycle. Now, the 
																		data 
																		sheet 
																		states 
																		(admittedly 
																		in very 
																		small 
																		print) 
																		that you 
																		must 
																		allow 3 
																		to 4 
																		instruction 
																		cycles 
																		between 
																		interrupts. My 
																		advice 
																		is to 
																		allow 4 
																		cycles. The 
																		reason 
																		for the 
																		delay is 
																		the PIC 
																		needs 
																		time to 
																		jump to 
																		the 
																		interrupt 
																		address, 
																		set the 
																		flag, 
																		and come 
																		back out 
																		of the 
																		interrupt 
																		routine. So, bear 
																		this in 
																		mind if 
																		you are 
																		using 
																		another 
																		circuit 
																		to 
																		trigger 
																		an 
																		interrupt 
																		for the 
																		PIC. 
Now, a 
																		point to 
																		remember 
																		is that 
																		if you 
																		use bits 
																		4 to 7 
																		of Port 
																		B as an 
																		interrupt. You 
																		cannot 
																		select 
																		individual 
																		pins on 
																		Port B 
																		to serve 
																		as an 
																		interrupt. So, if 
																		you 
																		enable 
																		these 
																		pins, 
																		then 
																		they are 
																		all 
																		available. So, for 
																		example, 
																		you 
																		can’t 
																		just 
																		have 
																		bits 4 
																		and 5 – 
																		bits 6 
																		and 7 
																		will be 
																		enabled 
																		as 
																		well. 
																		So what 
																		is the 
																		point of 
																		having 
																		four 
																		bits to 
																		act as 
																		an 
																		interrupt? Well, 
																		you 
																		could 
																		have a 
																		circuit 
																		connected 
																		to the 
																		PIC, and 
																		if any 
																		one of 
																		four 
																		lines go 
																		high, 
																		then 
																		this 
																		could be 
																		a 
																		condition 
																		that you 
																		need the 
																		PIC to 
																		act on 
																		quickly. One 
																		example 
																		of this 
																		would be 
																		a house 
																		alarm, 
																		where 
																		four 
																		sensors 
																		are 
																		connected 
																		to Port 
																		B 
bits 
																		4 to 7. Any 
																		sensor 
																		can 
																		trigger 
																		the PIC 
																		to sound 
																		an 
																		alarm, 
																		and the 
																		alarm 
																		sounding 
																		routine 
																		is the 
																		interrupt 
																		routine. This 
																		saves 
																		examining 
																		the 
																		ports 
																		all the 
																		time and 
																		allows 
																		the PIC 
																		to get 
																		on with 
																		other 
																		things. 
In the 
																		next 
																		tutorial, 
																		we will 
																		write a 
																		program 
																		to 
																		handle 
																		an 
																		interrupt. 
Click 
																		here  >>>> 
																		Tutorial 
																		12  |