Electronic Projects, forums and more.

Go Back   Electronic Circuits Projects Diagrams Free > Electronics Categories > Micro Controllers


Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc.

Reply
 
LinkBack Thread Tools Display Modes
Old 21st May 2004, 10:45 PM   (permalink)
Default Interrupt on GP Change problem

I've been working with this for a couple days, and can't get it to behave properly. This minimal code should use interrupts to simply set the output state based on the input state. I've tried this without interrupts (basically just using the interrupt handler as the main loop) and it works fine, so I know my inputs and outputs are right.

Any insight as to why this doesn't work will be greatly appreciated!

Code:
#define BUTTON_BIT	2
#define OUTPUT_BIT	4

	LIST	p=12F629
	include "P12F629.inc"
	__config b'10000110000100'
	
	org	0x0000
	goto Setup
	
	org	0x0004
	goto Interrupt

Setup
	;turn comparators off					
	movlw	0x07
	movwf	CMCON

	bsf 	STATUS,		RP0	;Bank 1
	
	;Specify input ports
	clrf	TRISIO
	bsf		TRISIO, BUTTON_BIT

	;Enable pull up on input
	clrf	WPU	
	bsf		WPU, BUTTON_BIT

	;Set interrupt on change for input
	clrf	IOC
	bsf		IOC, BUTTON_BIT
	
	;Callibrate internal oscillator
	call	3FFh 
	movwf	OSCCAL
	
	;Set options (enable global weak pull ups)
	movlw	b'01111111'
	movwf	OPTION_REG
		
	bcf		STATUS, RP0 ;Bank 0

	;Read input state
	movf	GPIO,w
	
	;Enable global interrupts and GPIO change interrupt	
	bsf		INTCON, GPIE		
	bsf		INTCON, GIE

	;infinite loop
	goto $
	
Interrupt
	;Clear interrupt flag
	bcf		INTCON,GPIF
	
	;Set output based on input state
	btfss	GPIO,BUTTON_BIT
	goto	$+3
	bsf		GPIO,OUTPUT_BIT
	goto	$+2
	bcf		GPIO,OUTPUT_BIT
	
	retfie

	end
Dan East is offline  
Old 22nd May 2004, 02:39 PM   (permalink)
Default

I did some more testing and I think I have a better handle on the problem. It seems that an interrupt is only being generated when the input goes high, but not when it goes low.

I thought an interrupt would be generated in both cases. Am I misinterpreting the datasheet?

Dan East
Dan East is offline  
Old 22nd May 2004, 06:12 PM   (permalink)
Default

Okay, I've gotten it to work after modifying my circuit, however I'm not exactly sure why it wouldn't work properly before.

I'm using the internal pull up, and pulling the pin low externally using a 560 ohm resistor. Now as I said, if I read the pin state in a loop without using interrupts it behaves as it should - the GPIO state matches the physical switch. So I tried removing the 560 ohm resistor, and that correct the problem - the interrupts now work properly. So I can only surmise that the input tolerances required to trigger an interrupt are somehow different than those required to set the pin state. My guess is there is some logic used to properly interpret analog input so it will correctly trigger interrupts on a digital input, and since I wasn't pulling it all the way down to 0 volts it wasn't resetting that logic.

Maybe this will save someone else some trouble in the future.

Dan East
Dan East is offline  
Reply

Bookmarks

Thread Tools
Display Modes





All times are GMT. The time now is 06:19 AM.


Electronic Circuits  |  Learning Electronics
Powered by vBulletin® Version 3.7.0
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.

eXTReMe Tracker