View previous topic :: View next topic |
Author |
Message |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
Interrupt on Change |
Posted: Sun Feb 12, 2006 8:15 am |
|
|
Hello All,
18F4620
3.236
Standard run mode
5V
20MHz
RB4 pulled down to Vss through 10K resistor, with a momentary switch to Vdd through a 4K7 resistor.
RB5 jumpered to a 2.5V to the output of an op amp (op amp's out put will be used to awake PIC) Unjumpered: RB5 floats. Jumpered: RB5 steady at 2.5V during tests.
I'm trying to use oscillations on the op amps out put to trigger an interrupt on change and wake up the PIC. I have successfully put the processor to sleep and awoke it w/ the momentary switch... just as long as RB5 wasn't connected to the 2.5V.
My problem is this, when RB5 IS connected to the 2.5V I get repetitive interrupts. I'm guessing that some how when the processor returns from an interrupt it sees the 2.5V and interrupts again. So I must be missing something/wrong order of operations when it returns....
I found info on interrupt_on_change, but nothing with this sort of issue.
Here is the relevant code, I took out the LED flashes that I've been using to indicate sleep/wake, etc. Any help or suggestion would be greatly appreciated.
Code: |
#define SW_0 PIN_B4
#define FILT_INT PIN_B5
/*******************************
Int_RB ISR
*******************************/
#int_RB
void RB_isr(void) {
disable_interrupts(INT_RB);
if(!filt_int_flag) {
filt_int_flag = TRUE;
}
}
MAIN
//enable filter interrupt
//set_tris_b(0xFF);
set_tris_b(0b00110000);
//port_b_pullups(TRUE); //can't do that, pins pulled down
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while(TRUE) {
//-------------- Filter Interrupt Handler ---------------------------
if(filt_int_flag) { //Filter interrupt triggered
filt_int_flag = FALSE;
//clear_interrupt(INT_RB);
enable_interrupts(INT_RB);
} //if(filt_int_flag)
//---------------- End Filter Interrupt Handler ------------------
}
|
|
|
![](templates/subSilver/images/spacer.gif) |
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 12, 2006 8:45 am |
|
|
Quote: |
I'm trying to use oscillations on the op amps out put to trigger an interrupt on change and wake up the PIC. I have successfully put the processor to sleep and awoke it w/ the momentary switch... just as long as RB5 wasn't connected to the 2.5V.
|
I think you need to workaround your design. Lets assume that 2.5V is technically a
forbiden level for any TTL circuit. When the PIC return from the interrupt handler, it fall
in an undeterminate state and can't solve this. If the input floats the input buffer in the
PIC will consume far more current than normal, and the noise immunity of other ports
and of PIC internal signals may suffer, causing serious reliability problems.
I would try wiring a pull up resistor in RB5 and making a capacitive coupler between
the op amp output and RB5. IMO the easiest way to wake up the PIC will be achieved wiring
the capacitive coupled signal to the EXT_INT pin.
Humberto
Last edited by Humberto on Sun Feb 12, 2006 9:00 am; edited 2 times in total |
|
![](templates/subSilver/images/spacer.gif) |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Sun Feb 12, 2006 8:54 am |
|
|
Thanks Humberto,
This isn't the final scheme that is going to be used. This is just a quick test of an existing configuration that I'm twiddling with.
It's more of a question about the proper sequence of events in enabling and handling the interrupt than anything else.
Does the 2.5V on RB5 cause another interrupt when the interrupt is re-enabled? If so, how would I prevent that?
Gracias,
John |
|
![](templates/subSilver/images/spacer.gif) |
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 12, 2006 9:10 am |
|
|
Quote: |
Does the 2.5V on RB5 cause another interrupt when the interrupt is re-enabled? If so, how would I prevent that?
|
John, I edited the last post to add this paragraph:
When the PIC return from the interrupt handler, it fall in an indeterminate state that can't solve.
To prevent this you must generate a stable state (High or Low) to enable the PIC to end the
hardware interrupt procedure when it return from interrupt.
Humberto |
|
![](templates/subSilver/images/spacer.gif) |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Sun Feb 12, 2006 9:28 am |
|
|
Quote: | To prevent this you must generate a stable state (High or Low) to enable the PIC to end the
hardware interrupt procedure when it return from interrupt. |
Ahhhhh, exactly, that's the question. I'm not sure how to accomplish that. I had thought about throwing out the first interrupt upon return but that seems as though it won't work either.... I essnetially enter a endless loop of interrupts.
Because of my limited experience, I don't have a clue how to get around this... |
|
![](templates/subSilver/images/spacer.gif) |
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 12, 2006 9:44 am |
|
|
John just to test, wire a pull up resistor (~2K2-4K7) in RB5 and a non polarized capacitor (~.1 - 1.0uF)
in the path between the op-amp output and RB5, this way you can detect the changes in RB5
while keeping a know logic level in the PIC input.
Humberto |
|
![](templates/subSilver/images/spacer.gif) |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Sun Feb 12, 2006 10:03 am |
|
|
I think I understand now. It isn't a matter of accomplishing the correct tasks in the firmware, the PIC can't handle the "ambiguous" 2.5V?
Code: |
+5V
|
|
\
/
\
/
\
/
|
|
|
|
RB5-----------------||----------Op Amp
|
Like this?
Thanks a bunch. |
|
![](templates/subSilver/images/spacer.gif) |
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 12, 2006 10:52 am |
|
|
Quote: |
It isn't a matter of accomplishing the correct tasks in the firmware, the PIC can't handle the "ambiguous" 2.5V?
|
Yes that' true.
Yes John, that's the idea.
Humberto |
|
![](templates/subSilver/images/spacer.gif) |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Sun Feb 12, 2006 11:25 am |
|
|
Excellent!
Humberto,
Thanks for the help. It worked after I increased the pullup resistor to 100K.
This helped with a quikie proof of concept. The final circuit will be able to be tweaked to be more elegant.
John |
|
![](templates/subSilver/images/spacer.gif) |
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sun Feb 12, 2006 12:11 pm |
|
|
Quote: |
It worked after I increased the pullup resistor to 100K.
|
I suggested a small R value because I doesn't know the AC response (dv/dt) of the op-amp
output signal. You would be aware that such a high R value as you used, add an unwanted RC
delay that can 'mask' fast repetitive transitions in such a way that will become undetectable.
Following actions would be to find out the best interrupt behaviour selecting the apropiate
RC pair to overcome the trade-off between interrupt detecting capabilities (High RC delay)
and an appropiate frequency response (Low RC delay).
Humberto |
|
![](templates/subSilver/images/spacer.gif) |
|