View previous topic :: View next topic |
Author |
Message |
noisepic
Joined: 24 Jul 2005 Posts: 20
|
debounce switch |
Posted: Fri Aug 19, 2005 10:46 pm |
|
|
this is my routine to check what key is pressed
Code: |
char key_id;
......
while(1)
{
if(RA0==0)
{
delay_ms(20);
if (RA==0) key_id=1;
}
if (RB0==0)
{
delay_ms(20);
if (RB==0) key_id=2;
}
} |
a mount of time for delay_ms(interval)? 20ms is suitable? |
|
|
MikeValencia
Joined: 04 Aug 2004 Posts: 238 Location: Chicago
|
|
Posted: Sat Aug 20, 2005 7:38 am |
|
|
Some switches are more bouncy than others. For example, if you have dry contact inputs (e.g. relays), some relays specs say that the contact settling time is 16ms; some say 25ms.
Some designs may exhibit a lot of switching noise that radiates throughout the whole circuit. So best to look at an oscilloscope to see how long you really need to debounce.
For the case of simple tactile pushbuttons, you'll just need a 10k pullup resistor and .1uF capacitor to ground, and heck, even 5ms debouncing may be enough. |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Mon Aug 22, 2005 6:58 pm |
|
|
Take a look also at the ICs for switch debouncing such as MAX6816. They come handy, when your switch is connected to an interrupt or a counter. |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Tue Aug 23, 2005 8:38 am |
|
|
Here's a little routine, that I use, that seems to work quite well. You can play with the value of 'j' to get the delay that you need, depending on how bouncy your switch is.
Code: |
void pushed_one(void)
{
unsigned int16 j = 0;
int1 save, current;
if(!input(PIN_B7))// is the button pushed?
{
save = 0;
for(j = 0; j < 400; j++)// adjust the value of j for your delay needs
{
if((current = input(PIN_B7)) != save)// if the button is not in the same state it was
{ // last time then it has bounced, start counting again.
j = 0;
}
save = current;
}
if(!input(PIN_B7))// if we’re still pressed after the delay time
{
pressed1 = 1;// set the flag that the button is pressed - global var
}
else
{
pressed1 = 0;// if we’re not pressed then make sure the flag is reset
}
}// end of if(!save)
else
{
pressed1 = 0;// if the button is not pressed, reset the flag
}
}// end of pushed_one()
|
Ronald |
|
|
sseidman
Joined: 14 Mar 2005 Posts: 159
|
|
Posted: Tue Aug 23, 2005 9:11 am |
|
|
kender wrote: | Take a look also at the ICs for switch debouncing such as MAX6816. They come handy, when your switch is connected to an interrupt or a counter. |
Can you recommend an IC that comes in a package more amenable to prototyping? I don't mind SMD's, but those really fine pitches intimidate me a tad.
Thanks,
Scott |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Tue Aug 23, 2005 10:25 am |
|
|
sseidman wrote: | Can you recommend an IC that comes in a package more amenable to prototyping? I don't mind SMD's, but those really fine pitches intimidate me a tad. |
Well, MAX6816 (single) and MAX6817 (dual) come in SOT-23, which are more a less solderable by hand. I couldn't find the multi-channel debounce ICs in SOIC or bigger package. Take a look at this lab guide, which shows how to make debouncers out of logic gates. The circuit in the figure 9 is particularly simple.
http://www.people.fas.harvard.edu/~thayes/phys123/lb14_305.pdf |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Sun Aug 28, 2005 2:56 am |
|
|
sseidman wrote: | Can you recommend an IC that comes in a package more amenable to prototyping? I don't mind SMD's, but those really fine pitches intimidate me a tad. |
A friend of mine cane across this one today http://www.onsemi.com/pub/Collateral/MC14490-D.PDF. It comes in DIP. |
|
|
sseidman
Joined: 14 Mar 2005 Posts: 159
|
|
Posted: Mon Aug 29, 2005 6:28 am |
|
|
kender wrote: | sseidman wrote: | Can you recommend an IC that comes in a package more amenable to prototyping? I don't mind SMD's, but those really fine pitches intimidate me a tad. |
A friend of mine cane across this one today http://www.onsemi.com/pub/Collateral/MC14490-D.PDF. It comes in DIP. |
Thanks-
As it turns out, timely info. We're using a matched p-channel, n-channel mosfet that will provide any digital out from TTL to high voltage, high current without any circuit mods except for what you tie to Vcc, with another FET on the input to transition the logic level to Vcc (or the p-chan and n-chan are on at the same time, and the chip desolders iitself!!). Switch bounce is doing some real nasties.
Scott |
|
|
MikeValencia
Joined: 04 Aug 2004 Posts: 238 Location: Chicago
|
|
Posted: Wed Sep 07, 2005 7:31 am |
|
|
I have a couple of MAX681X chips, but I ended up not trying or putting it on my board. Reason is that it looks for "30ms" of a clean signal before it considers it a truly changed signal.
I'm using a couple PWMs on my board, and the duty cycle transitions on the high voltage side of my isolated motor drive cause nasty decayed sine waves (aka switching noise) radiating into my supposedly isolated 5V lines. As a result I have put tons of .1uf capacitors everywhere.
Wouldn't such switching noise lock up the MAX681X chips from "deciding"? |
|
|
sseidman
Joined: 14 Mar 2005 Posts: 159
|
|
Posted: Wed Sep 07, 2005 7:59 am |
|
|
MikeValencia wrote: | I have a couple of MAX681X chips, but I ended up not trying or putting it on my board. Reason is that it looks for "30ms" of a clean signal before it considers it a truly changed signal.
I'm using a couple PWMs on my board, and the duty cycle transitions on the high voltage side of my isolated motor drive cause nasty decayed sine waves (aka switching noise) radiating into my supposedly isolated 5V lines. As a result I have put tons of .1uf capacitors everywhere.
Wouldn't such switching noise lock up the MAX681X chips from "deciding"? |
I think "logically" clean would be a better description--no logical low to logical high transitions-- but I've not used that chip so I'm not sure.
More importantly, how have you isolated the high voltage side?? If it were me, I'd have a master power driving a regulator for the low side, and an isolated DC/DC for the high side. All the connections between would be optically isolated, and the respective grounds must never touch |
|
|
MikeValencia
Joined: 04 Aug 2004 Posts: 238 Location: Chicago
|
|
Posted: Wed Sep 07, 2005 9:23 am |
|
|
My "motor voltage" is actually 100VAC rectified to 141vdc from the primary of a custom autotransformer. This transformer also has a a 12vac secondary for digital stuff and a 14vac secondary for the motor driver.
The motor voltage and the 14vac rectified thru a bridge and 15v voltage regulator are both floating and share a common 'return'.
As for my PIC's inputs, when i measure them with a scope, i admit the ground probe's lead length does owe to the ringing i see. For all I know, maybe i have noise coupling within the transformer windings. I do have a line filter at the entry of line power, but this might not help since the autotransformer is downstream.
All in all, its a somewhat noisy system. One day, i'll try breadboarding a MAX6818 into my circuit and add a follow-up to this thread. |
|
|
Guest
|
|
Posted: Wed Sep 07, 2005 7:44 pm |
|
|
MikeValencia wrote: | I have a couple of MAX681X chips, but I ended up not trying or putting it on my board. Reason is that it looks for "30ms" of a clean signal before it considers it a truly changed signal. |
The MC14490, which I have mentioned above has an adjustable by a capacitor delay. |
|
|
|