PDA

View Full Version : DT_instantINT 16f690 not working... what am I doing wrong?



Heckler
- 6th November 2011, 00:45
Hey group,
I am finally tackling DT's instant INT's

I have been able to get his LED blink sample working using INT_INT (pin RA2 on the 16F690, the external INT pin)
using this code...

include "ALLDIGITAL.pbp"
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts

wsave VAR BYTE $70 SYSTEM ' alternate save location for W

DEFINE OSC 4

TrisA = %00000100
TrisB = %00000000
TrisC = %00000011
LED0 VAR PORTC.0 'this LED is controlled by the "INT" pin, 16F690=RA2
LED1 var PortC.1 'this LED is controlled by the Main program loop

ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler INT_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM

@ INT_ENABLE INT_INT ; enable external (INT) interrupts

Main:
PAUSE 1000
Toggle led1
GOTO Main

'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
TOGGLE LED0
@ INT_RETURN

But I can not get the interupt to work using RB7(Individually controlled interrupt-onchange.
Individually enabled pull-up.)

I have tried several of the various INT choices and the one that seems to compile without errors is RABC_INT. But the program acts weird. I have two LED's one connected to RC0 that should be controlled by the instantINT. And another LED connected to RC1 that should be blinking at a 1 second rate controlled by the "Main" program loop.
Here is the code for that...

include "ALLDIGITAL.pbp"
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts

wsave VAR BYTE $70 SYSTEM ' alternate save location for W

DEFINE OSC 4

TrisA = %00000000
TrisB = %10000000
TrisC = %00000000
CM1CON0 = 0 'turn off the comparator 1
CM2CON0 = 0 'turn off the comparator 2
OPTION_REG.7=1 'Turn OFF weak pull ups


LED0 VAR PORTC.0 'this LED is controlled by the "INT" pin, 16F690=RA2
LED1 var PortC.1 'this LED is controlled by the Main program loop
IOCB.7=1

ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RABC_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM

@ INT_ENABLE RABC_INT ; enable external (INT) interrupts

Main:
PAUSE 1000
Toggle led1
GOTO Main

'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
TOGGLE LED0
@ INT_RETURN


LED0 controlled by the "Main" program loop is working correctly.
LED1 (should be controlled by RB7 INT) does not work correctly... it blinks erratically. ON dim, ON bright and OFF
and the LED1 ONLY blinks if in include this line of code... IOCB.7=1

What am I doing wrong??
How does one know which INT to use??

My goal is to impliment instantINT using a rotary encoder on RB6 & 7, and a third INT for the encoder push-button on RB5.

HELP! please

HankMcSpank
- 6th November 2011, 01:30
IOCB.7=1 is correct (you are enabling that pin for interupt on change interrupts)

You will also need to enable Weak pullups...
OPTION_REG.7 = 0
WPUB.7 = 1 '

I normally use a variable mapped to the associated interrupt bit like this...

IOC_FLAG VAR INTCON.0 ' Alias RABIF interrupt flag bit

...then it's easier to track clearing it, for example...

IOC_FLAG = 0 ' Clear the int-on-change flag bit

(the flag needs to be cleared before you enable with @ INT_ENABLE RABC_INT )

also it's a good idea to put a wend in at the beginning of your program to ensure things have settled. So pulling the sequence together would look something like this



ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RABC_INT, _Switch_Interrupt, PBP, YES
end

INT_CREATE ; Creates the interrupt processor
ENDASM
'
IOC_FLAG = 0 ' Clear the int-on-change flag bit
'
WHILE SW1 = 0 : WEND ' Wait until all sw has settled and is at logic 1 before proceeding
'
@ INT_ENABLE RABC_INT ; Now things have settled,eEnable 'Int On Change' interrupts



If it's still not working, get a DVM onto RB7 and make sure it's sitting at supply voltage. RB7 is also the EUSART TX pin, so if you're using anything with serial output, that could cause you grief, from recollection, it can be disabled something like this...

RCSTA.7 = 0


It sounds like your LED1 is actually toggling fine...it's just that it's toggling at one helluva lick (hence dim)....better to put a pause in your interrupt routine to give it a breather between on & off...



'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
TOGGLE LED0
pause 250
@ INT_RETURN


Hope that helps a little.

Heckler
- 6th November 2011, 05:48
Thanks Hank...
I added what you suggested and it is working better... BUT LED0 is still not ON fully when it is on. I looked at it with an O-scope and it is actually a square wave at 2.9 KHz... which makes me think it is constantly re-triggering the interrupt at that 2.9KHz rate (or something??)

Here is my code as it stands...

#CONFIG
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
#endconfig


include "ALLDIGITAL.pbp"
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts

wsave VAR BYTE $70 SYSTEM ' alternate save location for W

DEFINE OSC 4

TrisA = 00000000
TrisB = 00000000
TrisC = 00000000
OPTION_REG.7=0 'Turn On weak pull ups
WPUB.7 = 1

LED0 VAR PORTC.0 'this LED is controlled by the "INT" pin, 16F690=RA2
LED1 var PortC.1 'this LED is controlled by the Main program loop
IOC_FLAG VAR INTCON.0

IOCB.7=1

ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RABC_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM

IOC_FLAG = 0
@ INT_ENABLE RABC_INT ; enable external (INT) interrupts

Main:
PAUSE 500
Toggle led1
GOTO Main

'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
IOC_FLAG = 0
toggle LED0

@ INT_RETURN



Also... i am using a pulse generator that allows me to generate 1,10,100,1000 Hz and that is what I am using to feed RB7 (the source of the INT)

I have looked at the pulse signal feeding the INT and it is clean.

anyone?

PS. when you post code to the forum it seems to not like "%" and deletes some of the bits after the %. There are %'s in my actual code.

HenrikOlsson
- 6th November 2011, 10:05
Hi,
When using the Interrupt On Change feature you must read the pins in interrupt handler in order to end the mismatch condition. You're not doing that as far as I can see so the interrupt refires as soon as it exits which is why you get the 2.9kHz squarewave output.

/Henrik.

Heckler
- 6th November 2011, 14:34
Henrik... BINGO!

Go get yourself a doughnut... (or whatever sweet treat you good people of Sweden like to enjoy at celebrations!)

that was it...

I just added this line to my INT handler...
'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
myvar = PortB
IOC_FLAG = 0
toggle LED0

@ INT_RETURN



And now I have 2 LED's blinking at different rates, one controlled by the rate of the INT, the other at a fixed rate controlled by the PAUSE command in the Main program loop.

I spent a couple of hours testing and troubl shooting and pulling my hair out... on this last evening. Why? was it for a special important project? NO... I just wanted to get my brain around the DT INT's and be able to use them and under stand them. My signature line really says it for me.