マイコンの最近のブログ記事

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

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

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を繰り返す。

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

[AVR] 外部割り込み

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

AVRマイコン 外部割り込み

AVRでの割り込み処理についてメモしておきます。使用する言語は、C言語、使用するAVRは、ATmega88P。

割り込み

割り込みとは、CPUの行っている処理をなんらかのイベントにより、処理を分けること。CPU内部から発せられる物、0除算などは、内部割り込み、CPU外部から発せられる物、入力機器からの入力などは、外部割り込みに分類される。

今回は、AVRの汎用IOポートの割り込みを検出する。なので、外部割り込み。

AVRには、割り込みに使用できる専用ポート、INT0、INT1がある。

全てのポートで、ポートの変化を検出しており、この割り込みが発生する。今回はこちらを使う。

プログラムリスト

#include <avr/io.h>
#inlcude <avr/interrupt.h>

ISR(PCINT0_vect)  // ポートB用
{
    // 割り込みが発生 ここにその処理を記述 
}

ISR(PCINT1_vect)  // ポートC用
{
}

ISR(PCINT2_vect)  // ポートD用
{

int main()
{
    // ポートの入力を設定する
    DDRB = 0b00000000;
    DDRC = 0b00000000;
    DDRD = 0b00000000; 

    // 割り込みポートの有効にする
    PCICR = _BV(PCIE0) | _BV(PCIE1) | _BV(PCIE2);

    // 割り込みポートを指定する 
    PCMSK0 = _BV(PCINT0) | _BV(PCINT1) | _BV(PCINT2) | _BV(PCINT3) |
                   _BV(PCINT4) | _BV(PCINT5) | _BV(PCINT6) | _BV(PCINT7);
    PCMSK1 = _BV(PCINT8) | _BV(PCINT9) | _BV(PCINT10) | _BV(PCINT11) |
                   _BV(PCINT12) | _BV(PCINT13) | _BV(PCINT14);
    PCMSK2 = _BV(PCINT16) | _BV(PCINT17) | _BV(PCINT18) | _BV(PCINT19) |
                   _BV(PCINT20) | _BV(PCINT21) | _BV(PCINT22) | _BV(PCINT23); 

    // 割り込みを有効にする
    sei();

    // 終了しないようにする
    while(1); 

    return 0;

}

解説

上記のプログラムリストでは、全てのポートで割り込みが有効。

ただし、PC6(PCINT14/~RESET)は、フューズでリセットを無効にしないと有効にならない。有効にしてしまうと、ISP書き換えが使用できなくなるので注意。

PCICRレジスタで、割り込みの設定をする。PCIE0、1、2は、それぞれポートB、C、Dに対応。

PCMSKレジスタで、ポートでどのビットを有効にするかを決定。PCMSK0、1、2は、それぞれポートB、C、Dに対応。

PCMSKレジスタは、DDRやPORT、PINと同様に設定可。

sei関数を使って、割り込みを有効にする。_enable_interrupt()でも可能。

最後に、プログラムが終了しないようにする。

割り込みが発生すると、ISR関数で指定した内容が実行される。関数終了後は、割り込みが発生した命令の場所に戻る。

もし、割り込みが発生したときに、AVRマイコンが勝手にリセットされてしまう場合は、ISR関数が正しく指定されていない可能性がある。PCINT0_vectなどは、AVRマイコンによって違うので注意。

 

この外部割り込みについての資料があまりなかったので、メモしておきました。ここのプログラムリストについては、即席で作った物で、テストしていないので、注意してください。似たようなプログラムでチェックはしています。

AVRマイコン

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

ATMEL ATmega88P-20DU

マイコンに挑戦

DACの制御回路を作成するために、マイコンを導入してみました。そのマイコンの概要と参考を提示します。

マイコンとは、マイクロコントローラ(MicroController)、もしくはマイクロコンピュータ(MicroComputer)の略で、小型の組み込み用の装置のことを言います。今回使ったマイコンは、マイクロコントローラの方です。

マイコンには、様々な種類があり、代表的な物に、PIC、AVR、H8、ARMなどがあります。日本では、PICが有名で電子工作で広く使用されています。

ですが、PICには、少々難点があります。それは、プログラムをマイコンに転送するために必要なライターが高価なこと、PICによりライターがことなること、特殊なアセンブリ言語を使用していること、処理速度が少々遅いことです。詳しくは、下記のサイトを訪問してみてください。

いますぐPICをやめてAVRに移行すべき10の理由 http://d.hatena.ne.jp/yaneurao/20080228

※ただし、PIC使いによると、この理由はある程度否定できるらしいです。ですが、処理速度に関しては、AVRの方が有利だそうです。(あまり確かな情報ではないので注意)

と言うことで、初期導入が簡単なAVRを使用することにしました。

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0