マイコン工作実験日記

Microcontroller を用いての工作、実験記録

ナビ・スイッチのつなげ方

2011-05-17 13:17:03 | SAM3
BlueSAMではナビ・スイッチを2つ使っていますが、これらのスイッチは言うまでもなく、GPIO(ATMEL用語ではPIO)のポートにつながっています。



裏返すとこんなデタラメな配線が丸見え↑。長さもとらずにテキトーに線材を切って配線していたので、線がみんなたわんでいます。(^_^;)

きょうの記事ではSAM3Sをつかうと、GPIOにつなげたスイッチの処理が簡単になるということを書きとめておこうと思います。

マイコンを使っての実験の第1歩がLEDチカチカ(Lチカ)であるとするならば、その第2歩2としてポピュラーなのが入力スイッチの状態検出でしょう。ここで問題となるのが、スイッチの機械的なチャタリングです。そのため、スイッチの状態変化を検知したならば、しばらく待って同一状態であることを確認してから初めてその時点で変化を確定するという処理がおこなわれます。一時的に状態変化がバタバタとする期間の変化を無視するためです。

SAM7やSAM3ではPIOポートの状態変化は、割り込みで検出することができます。SAM7では短期間の入力変化ノイズを除去するGlitch filterという機能がありましたが、このフィルタで除去できるのはマスター・クロック(MCK)の半分までの長さのノイズでした。MCKはメガHz単位なので、除去できるのはナノ秒単位であり、スイッチの機械的なチャタリング除去には使えないものでした。そのため、SAM7ではタイマーを利用して一定時間待った後に、状態を再確認するソフトウェア的処理が必要になっていました。

SAM3では新たにDebouncing filterという機能が追加されています。Glitch filterがMCKを使っていたのに対し、Deboucing filterでは32KHzのクロックを分周したクロックで、判定期間の長さを指定できるようになり、機械的なチャタリング除去に利用できるようになりました。チャタリング除去後に、状態変化を割り込みとして発生することができるので、ソフトウェア側ではチャタリング処理を全く考慮せずに良くなりました。加えて、割り込み発生条件として立ち上がり/立下りのエッジも指定することができますので、1)スイッチを押した時、2)スイッチを離した時, 3)押し/離しの両方というように割り込みを発生する条件も指定することができます。

このようにdebouncing filterを利用すれば、これまでチャタリング除去の処理のために用意していたタイマーやタスク/スレッド/割り込み処理を不要にすることができるので、便利です。今回のナビ・スイッチの処理でも、この機能を使ってみました。もっとも、スイッチの長押しとかオート・リピートとかの機能が欲しくなると、やはりタイマやタスクが必要となってきます。現在のわたしが、この段階なんですが。