Tuesday, 10 March 2009

Key Bouncing Problem on Switches and How to Debounce

Bouncing problem ဆိုတာကေတာ့ Embedded application ေတြမွာ ျဖစ္တတ္တဲ့ ကိစၥပါပဲ။ သေဘာကေတာ့ ခလုတ္ (switch/ key) ကို တစ္ခ်က္ႏွိပ္ေပမယ့္ pulse ေတြအမ်ားႀကီး ၀င္သြားတဲ့ ျပသနာပါ။ Keyboard ခလုတ္ ကပ္သြားသလို ျဖစ္တာေပါ့။ အဲဒါကို key bouncing လို႔ ေခၚပါတယ္။ အဲဒီ ျပသနာကို ျပန္ေျဖရွင္းတာကိုေတာ့ debouncing လို႔ေျပာတာေပါ့။

Microcontroller application ေတြမွာ Debounce လုပ္တဲ့နည္း ၃ မ်ိဳးရွိပါတယ္။
၁။ ပထမဆံုး Key (pulse) တစ္ခ်က္ ႏွိပ္တာကိုပဲ အတည္ယူပါ။ ေနာက္ထပ္ ၀င္လာတဲ့ pulse ေတြကို ignore လုပ္ပစ္ပါ။ (ေနာက္ထပ္ Key မလႊတ္မခ်င္း လုပ္ငန္း မၿပီးေသးဘူးလို႔ သတ္မွတ္ၿပီး ဘာမွဆက္မလုပ္ပဲ ရပ္ (nop) ထားပါ)
၂။ တစ္ခ်က္ႏိွပ္ၿပီး ခနေစာင့္ေနပါ။ ( ၁ စကၠန္႔၊ ဒါမွ မဟုတ္ ၀.၅ စကၠန္႔ေပါ့။ Switch ရဲ႕သဘာ၀ေပၚမူတည္ၿပီး ေစာင့္ရတဲ့ အခ်ိန္ကို ညွိပါ)
၃။ ပထမ Key တစ္ခ်က္ႏိွပ္ရင္ အလုပ္လုပ္ၿပီး ဒုတိယ Key တစ္ခ်က္မႏွိပ္ခင္အထိ ေစာင့္ခိုင္းထားပါ။

Bouncing ကို Hardware ေရာ Software ေရာနဲ႔ ထိန္းလို႔ ရပါတယ္။ Software နဲ႔ကေတာ့ ပိုလြယ္ပါတယ္။ Hardware နဲ႔ဆိုရင္ေတာ့ ေအာက္မွာ ျပထားတဲ့ အတုိင္း တပ္ဆင္ၿပီး ထိန္းလို႔ရပါတယ္။ HCF4093 ကေတာ့ အိုင္စီပါ။

Software နဲ႔ဆိုရင္ေတာ့ ေအာက္မွာ ျပထားတဲ့အတိုင္း ေရးလို႔ရပါတယ္။ ဒီ program မွာက active low ကိုယူထားပါတယ္။

//////////////////////////////////////////////////////////////////////
void init_ports(void) {
TRISIO = (1<<5);>// set as output except bit 5 GP5=i/p

//////////////////////////////////////////////////////////////////////
int get_key(void) {

// Is GP5 low - no so exit
if (GPIO & (1<<5))>

delay_ms(1); // wait for key to settle

// Is GP5 high ? yes so exit = false key.
if ( (GPIO & (1<<5))>0 ) return 0; // was a false key so restart

return 1; // key ok so return valid
}
//////////////////////////////////////////////////////////////////////

No comments:

Post a Comment