2011年6月アーカイブ

え~ 情報セキュリティスペシャリスト試験を、龍谷大学にて受けて参りました。これ受けるの3度目です。

DSC_0076.jpg

自信はまあまあ。取りあえず自己採点で、午前IIは84点でOK。

今回の問題は、午後Iが簡単で、午後IIが難しかったです。午後Iは、得意のC++とネットワークを選択。午後IIは、取りあえず問1で。

帰りにいつも写真撮ってますが、今回なかなか綺麗に撮れたました。バスが出る3分前だったので、焦って撮りましたが、時間掛けて撮るより綺麗に撮れてしまいました。いつもフォトレタッチしてますが、今回はリサイズのみです。さすがXperia arc。

合否は、8月15日(月)正午。

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

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

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

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

ロータリーエンコーダとは

ロータリーエンコーダとは、回転を検出するためのセンサーです。軸を回転させ、それがどれくらいの角度で回ったかをセンシングできます。回転角度の分解能は、さまざまです。

電子レンジなどで時間を設定するダイヤルとかにロータリーエンコーダが使用されています。

可変抵抗を使用しても、回転角度をアナログ的に見ることができますが、ロータリーエンコーダは、デジタル的に見ることができます。また可変抵抗とは異なり、回転角度が制限されておらず、一定方向に何度も回転させることができます。

ロータリーエンコーダの信号について

ロータリーエンコーダは、2つの出力端子を持っています。それぞれ、A相、B相となっていて、回転回数と回転方向を検出します。

ロータリーエンコーダには、インクリメンタル方式とアブソリュート方式の2種類があります。ここでは、インクリメント方式のロータリーエンコーダで説明します。

ロータリーエンコーダのA相とB相の出力される信号の方式には、様々な仕組みあります。今回は一番単純な機械スイッチが入った物を使用します。この方式は、ロータリーエンコーダ内部にスイッチが入っており、片方がGND、もう片方がそれぞれの相に接続され、スイッチのON/OFFで出力します。マイコンなどで使用するときは、単純なスイッチなので、プルアップ抵抗もしくはプルダウン抵抗が必要になります。ですがAVRには、内部にプルアップ抵抗があるので、抵抗を必ずしも用意する必要はありません。

ロータリーエンコーダは、A相・B相で回転したかどうかがわかります。信号の意味の詳細は、ロータリーエンコーダの仕様書を見ると書いていますが、案外単純なプログラムで検出できます。

A相もしくはB相をトリガーとして、もう一方のHiかLoを見るだけで回転したかを確認できます。手順は、

  1. A相を立ち下がりを見る。
  2. B相がLoの時、時計回り(もしくは反時計回り)。Hiの時、反時計回り(もしくは時計回り)。
  3. 1-2を繰り返す。

となります。これで、回転したかを検知することができます。トリガーをうまく使うと、細かな回転を検知できますが、ステップ付きのロータリーエンコーダでは、この手順で十分です。

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0