« 星太朗さんへの回答 | トップページ | 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る »

2014年7月19日 (土)

「天文屋のためのマイコン入門」始めの一歩

今日から、インターバルシャッターのプログラムを作り始めます。何から手を付けていけばよいか?

今までの説明をちゃんと読んでくれた方なら、このアプリケーションプログラムはタイマー割り込みベースのプログラムと想像できます。それでは、1秒間隔でタイマー割り込みが入るプログラムとすればよさそうです。

しかし、もっと重要な問題があります。プッシュスイッチです。このスイッチはインタバールシャッターの開始、停止をするスイッチですが、プッシュスイッチは、スライドスイッチやロータリースイッチと決定的に違う部分があります。

スライドスイッチやロータリースイッチはその状態が重要です。ONかOFFか、0~9のどれか。

一方、プッシュスイッチはONかOFFかの状態ではなく、OFF->ONとなる変化が重要です。状態ではなく動作です。このような場合は、割り込みが役立ちます。外部の信号の変化により割込みを発生させることができます。このような割り込みを外部割込みといいます。

しかし、PICの悲しいところでピン数が制約されているため、この外部割込みが使えるポートBにプッシュスイッチを付けることができませんでした。ポートBはほとんど7セグメントLEDに使われています。

それでは、割り込みが使えないとして、どのようにプッシュスイッチOFF->ONの変化をキャッチするかです。

単純に考えて、常にスイッチの状態を読み込んでおいて、前回の読み込みがOFFで、今回の読み込みがONなら、スイッチが押されたと判断してよさそうです。

ところが話はそう簡単ではありません。プッシュスイッチのような機械的なものは、押すときに非常に短い時間にON/OFFを繰り返す現象が発生します。

1407191

このような現象をチャタリングといいます。このチャタリングのため、OFF->ONを単純に検知するプログラムでは一回押しただけなのに、複数回押されたと判断してしまうミスが起きます。

このチャタリングの問題を回避するため、特別な回路を組むこともありますが、プログラム的になんとかする方法もあります。

そのためには、ある程度の時間間隔たとえば1/32秒とします。この間隔でスイッチの状態を読み込み、OFF->ON->ONという状態変化を検知したときのみ、スイッチが一回押されたと判断します。

1407192

なぜ、1/32秒かは、経験と実際にやってみて判断するしかありません。スイッチの種類によっても違います。短すぎると複数回押されたと判断されますし、長いとスイッチの反応がおそくなり、使っていてイライラします。

ということで、1/32秒間隔で発生するタイマー割り込みが主体のプログラムになることが期待されます。

それで、インタバルシャッターのプログラムの始めの一歩として次のようなプログラムを次回以降作成します。

プログラム

プッシュスイッチを一回押すとLEDが点灯する。もう一回押すと消灯する以下、繰り返す。

文章で書くと実に簡単なプログラムですが、実際作るのは大変です。このプログラムを作るためには1/32秒間隔でタイマー割込みを発生させますが、1秒間のタイマー割込みのプログラムは既に作成済みです。それをどう変更するか? 次回以降説明します。

|

« 星太朗さんへの回答 | トップページ | 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 星太朗さんへの回答 | トップページ | 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る »