Tidak ada yang lebih sederhana dibanding saklar dan push button. Ini merupakan cara yang paling sederhana untuk memberikan kondisi tegangan pada pin masukan mikrokontroler, dan tidak memerlukan penjelasan secara detail mengenai cara kerjanya. Namun demikian, dalam prakteknya, tidak semudah yang diperkirakan. Apa penyebabnya?
Getaran yang terjadi pada kontak saklar, yang merupakan masalah yang biasa dijumpai pada saklar mekanis.
Ketika kontak bersentuhan, momentum dan elastisitas beraksi bersamaan sehingga menimbulkan getaran. Hasilnya adalah sejumlah pulsa listrik (lihat gambar di atas) yang dapat menimbulkan salah interpretasi. Namun, kejadian ini tidak berlangsung lama (beberapa mikro atau milidetik), namun cukup lama untuk sebuah mikrokontroler. Bila menggunakan sebuah push button sebagai penghitung pulsa, kesalahan terjadi pada hampir 100% kasus.
Masalah ini mungkin cukup mudah diatasi dengan menghubungkannya dengan sebuah rangkaian RC untuk menekan perubahan tegangan yang cepat. Bila periode getaran tidak didefinisikan, nilai komponen yang digunakan tidak dapat ditentukan secara pasti. Namun dalam kebanyakan kasus, disarankan untuk menggunakan nilai yang tertera pada gambar di bawah ini:
Bila dibutuhkan stabilitas yang tinggi maka dibutuhkan cara lain. Output dari rangkaian berikut akan merubah kondisi logikanya hanya setelah men-deteksi pulsa pertama yang dipicu oleh getaran kontak saklar. Solusi ini lebih mahal, namun masalah dapat diselesaikan dengan sempurna.
Selain solusi berbasis hardware, juga terdapat solusi sederhana berbasis software. Bila sebuah program menguji kondisi sebuah pin input dan men-deteksi perubahan, pemeriksaan dilakukan selama jeda tertentu. Jika program memastikan perubahan, ini berarti bahwa posisi saklar atau push button sudah berubah. Keuntungan dari solusi ini sangat jelas: bebas biaya, efek dari noise di-eliminasi dan dapat diterapkan pada kontak yang kualitasnya kurang baik.
Sumber: mikroe.com
Berikut adalah contoh sederhana untuk mengatasi masalah bouncing:
TRISA = 255; PORTA = 0; TRISB = 0; PORTB = 0; while (1) { int a, b; a = PORTA.F3; delay_ms(10); b = PORTA.F3; if ( a == b ) if ( a == 0 ) { PORTB.F0 = 1; delay_ms(2000); PORTB.F0 = 0; } }