[AVR] 割り込み処理でのチャタリング対策

| コメント(0) | トラックバック(0) |

チャタリング対策ができたので、その方法を書いておきます。

なぜ、割り込み処理でディレイを入れても、チャタリングが発生するのか?

AVRは、割り込みが発生すると割り込み要求用のレジスタ(割り込み要求フラグ)に1がセットされます。セットされると、割り込み処理にジャンプし、処理が行われます。割り込み処理の開始と同時に、フラグが0になりクリアされます。

割り込み処理を開始された後、スイッチのチャタリングが発生すると、一度クリアされた割り込み要求レジスタに1が再びセットされます。通常、このフラグが立つと、即座に割り込み処理が開始されますが、割り込み処理中なので、一時的に割り込みが無効になります。そのため、割り込み処理が終了したあと、また割り込み処理が開始されます。つまり、同じ処理が2回実行されてしまうわけです。

解決策

データシートによると、割り込み要求フラグは、割り込み処理が開始されるとクリアされるようです。さらに、割り込み要求フラグに1を書き込むことでも、クリアすることができます。

各種割り込みに対応するフラグの一覧を挙げます。

外部割り込み(INT0,INT1) EIFR
ピン変化割り込み0-2(PCIE0-2) PCIFR

例えば、INT0の割り込みをクリアするには、EIFRのINTF0をクリアすれば良いです。

注意としては、ピン変化割り込みは、ポート単位でのクリアしかできません。例えば、PD0の割り込みをクリアするとします。すると、PD1-7までクリアされてしまい、割り込み処理がなされない場合があります。

アルゴリズム

チャタリングを解消するためのアルゴリズムを考えました。

  1. 割り込みが発生する。
  2. 割り込み処理が開始
    1. チャタリング発生のため待つ(5ms程度)
    2. 要求フラグに1をセットする
    3. 各種割り込み処理を行う

こうすることで、チャタリングを解消できます。

プログラムリスト

プログラムリストを載せておきます。

前回のロータリーエンコーダのプログラムをバージョンアップしたものをアップロードしておきます。内容の詳細は、以前の記事を見てください。

チャタリング対策済み割り込み処理 re_intr2.c

トラックバック(0)

トラックバックURL: https://www.letstryit.net/mt/mt-tb.cgi/222

AVRで、ロータリーエンコーダを使ってみます。環境は、ATmega88P、AVR Studio + WinAVR(C言語)です。 ロータリーエンコーダと... 続きを読む

コメントする

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0

このブログ記事について

このページは、enjoypcが2011年6月14日 16:43に書いたブログ記事です。

ひとつ前のブログ記事は「[AVR] ロータリーエンコーダを使う」です。

次のブログ記事は「情報セキュリティスペシャリスト受けてきました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ