Debouncing adalah FAQ. Anda harus dapat menemukan ... hampir tidak terbatas jumlah halaman web pada topik tersebut. Smith berkomentar tentang Jack Ganssle yang banyak membaca PDF tentang topik ini, juga. Dan dengan semua jawaban ini Anda memiliki metode perangkat keras dan perangkat lunak.
Saya akan menambahkan "literatur" ini sedikit dengan hanya berbicara tentang ide-ide yang belum dibahas dengan baik. Tetapi sebelum saya melakukannya, satu atau dua poin:
- Debouncing dalam perangkat keras analog dapat mencapai hasil yang tidak dapat Anda capai dengan sakelar "yang diamati" hanya secara digital secara berkala dengan polling atau bahkan oleh peristiwa pergantian pin perangkat keras. Tetapi Anda dapat melakukan "cukup baik" untuk semua maksud dan tujuan, secara digital. Hampir tidak seorang pun hari ini menggunakan solusi debouncing analog eksternal. Tapi saya telah menggunakan semuanya mulai dari peregangan pulsa menggunakan satu tembakan (74121) ke teknik yang disebutkan oleh Jack Ganssle di sini .
- Bagi mereka yang melakukan pemrograman tertanam saja dan sama sekali tidak tertarik untuk belajar tentang elektronik, switch debouncing mungkin salah satu dari dua set keterampilan dasar yang diperlukan. LED operasi mungkin yang lain. Dan dengan ini, saya tidak bermaksud hanya memiliki satu keterampilan dalam hal ini. Maksud saya bisa melakukannya dalam beberapa cara. Jadi, Anda benar - benar perlu memahami sepenuhnya apa yang ditulis Jack Ganssle, dan lebih lagi, tentang sakelar.
Karena saya telah menyebutkan peregangan pulsa menggunakan 74121 dan karena Jack Ganssle tidak menyebutkannya, dan juga belum ada orang di sini, saya mungkin juga menyediakan tautan tambahan ini sebagai bacaan tambahan yang disarankan tentang penggunaan 74121 atau 555 sebagai satu suntikan penghitung waktu untuk sakelar debouncing.
Sekarang, lanjutkan melakukan ini melalui pengamatan dengan mikrokontroler.
Saya biasanya menggunakan mesin negara untuk menangani debouncing. Ini hampir selalu didorong oleh timer "detak jantung" reguler yang saya atur8MS, jika memungkinkan. (Saya biasanya TIDAK menggunakan peristiwa interupsi yang dipicu oleh tepi karena beberapa alasan.)
Mesin negara terlihat seperti ini:
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
Nilai DEBOUNCED untuk switch dapat mengambil nilai "tidak aktif", "aktif", dan "tidak dikenal". Dengan cara ini, Anda dapat memastikan bahwa perangkat lunak Anda menunggu hingga nilai sakelar turun setelah inisialisasi. Tapi biasanya, saya tidak repot dengan itu. Saya mengganti nilai "tidak dikenal" dengan beberapa nilai default dan sebagai gantinya hanya menggunakan sistem nilai biner.
Mesin negara dimasukkan dengan terlebih dahulu mengatur nilai yang didebok ke standarnya dan kemudian memasukkan status "MENGUBAH" mesin negara. Pada setiap interval waktu (biasanya8MSjika saya bisa lolos begitu saja), saya akan membaca nilai sakelar saat ini dan melakukan pembaruan dari keadaan saat ini dan mungkin, nilai yang dilepaskan. Lalu aku keluar begitu saja. Kode tingkat tinggi kemudian hanya mengakses negara yang didebok.
Jika itu penting bagi saya, saya juga dapat mempertahankan status debouncing sebelumnya. Dalam kasus ini, saat memperbarui status yang didebok itu sendiri, saya pertama-tama akan menyalin status itu ke 'kondisi yang sebelumnya didebok'. Saya kemudian dapat menggunakan pasangan nilai untuk menentukan apakah telah ada transisi yang dilepaskan. Terkadang, saya tidak peduli dengan transisi. Terkadang saya melakukannya. Jadi itu tergantung. Tetapi dalam semua kasus, saya hanya ingin tahu tentang transisi yang telah ditolak. Aku tidak pernah peduli kerdil transisi. Jadi kode tingkat tinggi tidak pernah menggunakan status internal apa pun yang digunakan mesin negara untuk pekerjaannya sendiri.
Salah satu hal yang menyenangkan tentang metode ini adalah saya dapat menghapus seluruh port switch secara bersamaan. Dan saya bisa melakukannya tanpa satu cabang pun dalam kode interupsi juga. Ini berarti kode debouncing yang sangat cepat dan pendek hingga lebar port mikrokontroler (biasanya 8 bit.) Contoh dari Atmel AT90 menunjukkan bagaimana hal ini dicapai menggunakan acara interupsi Timer0:
.equ SWPORTPINS = PINB
.def SwRawCurr = r4
.def SwRawPrev = r5
.def SwState = r6
.def SwDebCurr = r7
.def SwDebPrev = r8
; Debounce the input switches.
mov SwRawPrev, SwRawCurr
in SwRawCurr, SWPORTPINS
mov Timer0Tmp1, SwRawCurr
eor Timer0Tmp1, SwRawPrev
mov Timer0Tmp0, Timer0Tmp1
or Timer0Tmp1, SwState
mov SwState, Timer0Tmp0
mov Timer0Tmp0, Timer0Tmp1
com Timer0Tmp0
and Timer0Tmp1, SwDebCurr
and Timer0Tmp0, SwRawCurr
or Timer0Tmp1, Timer0Tmp0
mov SwDebPrev, SwDebCurr
mov SwDebCurr, Timer0Tmp1
Sekarang, contoh ini menunjukkan kesepakatan penuh, termasuk nilai sakelar yang dideboisasi sebelumnya dan saat ini. Dan itu melakukan semua transisi negara yang diperlukan, juga. Saya tidak menunjukkan inisialisasi kode ini. Tetapi di atas mendapatkan titik tentang betapa mudahnya mesin negara untuk beroperasi dan betapa sedikit kode yang diperlukan untuk melakukannya. Ini cukup cepat dan sederhana dan tidak memerlukan percabangan (yang terkadang melibatkan siklus tambahan serta ruang kode tambahan.)
Saya lebih suka menggunakan 8MSpengaturan waktu karena pengujian yang sangat lama dengan berbagai orang yang menggunakan peralatan yang pernah saya kerjakan di masa lalu telah membawa saya ke sana. Saya sudah mencoba periode yang lebih lama dan ketika saya melakukannya, saya mulai membuat orang mengatakan kepada saya bahwa "responsif" tidak cukup "cepat". (Saat ini, dengan anak-anak yang tumbuh dengan bekerja secara real-time "shoot 'em" gaming, saya mungkin akan mempersingkatnya lebih jauh. Mereka akan mengeluh dengan sangat pahit tentang bahkan sedikit keterlambatan yang disebabkan oleh TV digital modern dalam mengatur dan menampilkan bingkai.)
Beberapa orang akan memiliki perasaan yang sangat jelas tentang seberapa jernih dan responsif suatu sistem seharusnya. Renyah dan responsif berarti sampel lebih sering, bukan lebih sedikit. Tetapi secara pribadi, saya menemukan20MSperiode observasi dapat diterima. (Aku tidak menemukan waktu yang cukup lama bahkan untukku.)
Harap dicatat bahwa mesin keadaan yang saya sebutkan pertama-tama harus memasukkan keadaan SETTLED dan kemudian tinggal di sana untuk satu waktu sampel lagi sebelum nilai untuk DEBOUNCED diperbarui. Jadi menekan sebuah tombol dan menahannya, bahkan dalam keadaan terbaik, akan memerlukan transisi ini:
- ubah dari SETTLED ke CHANGING
- ubah dari CHANGING ke SETTLED
- tetap dalam SETTLED, memperbarui DILUNCURKAN
Jadi keadaan debounce baru membutuhkan minimal 3 periode waktu sampel untuk mencapai.
Sebuah tombol akan memerlukan setidaknya 6 kali sampel untuk beralih dari tidak aktif, ke aktif, dan kemudian kembali ke tidak aktif.
Saya menyebutkan detail di atas sehingga sangat jelas bahwa waktu sampel 8MS berarti di suatu tempat antara 16ms <t≤24MSuntuk beralih dari tidak aktif ke hasil debounce aktif yang diakui. Dan itu akan membutuhkan yang lain24MSsebelum negara dapat kembali menjadi tidak aktif. Itu minimum40ms <t≤48MS untuk melewati seluruh siklus tombol tekan.
Menggunakan waktu sampel yang lebih lama akan memiliki periode yang lebih lama. Menggunakan20MS Saya disebutkan sebagai "dapat diterima" bagi saya sudah berarti di suatu tempat di sekitar 100ms <t≤120MSuntuk seluruh siklus tombol tekan. Dan yang semakin tepat sampai ke daerah di mana orang yang cenderung pemberitahuan. Saya tentu tidak suka "perasaan" jika itu lebih lama dari itu.
Jika Anda menggunakan rute ini, jangan menjadi angkuh tentang penggunaan waktu sampel yang lebih lama. Jika harus, maka saya pikir Anda juga harus melakukan banyak pengujian dengan pengguna / konsumen.
Dan jika Anda mengembangkan kode untuk mengetik keyboard, maka gunakan waktu yang lebih singkat. Catatan untuk juru ketik ditetapkan puluhan tahun yang lalu pada 217 wpm. Ini menghasilkan sekitar satu kunci setiap45MS. Pengetik seperti itu menekan beberapa kunci dalam urutan yang terkontrol. Untuk mendapatkan kinerja yang baik untuk juru ketik yang sangat cepat menggunakan sistem switching relay reed mercury-wetted, saya menemukan itu2MS bekerja dengan baik.