[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マイコンによって違うので注意。

 

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

トラックバック(0)

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

コメントする

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0

このブログ記事について

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

ひとつ前のブログ記事は「ヘッドフォンアンプの製作」です。

次のブログ記事は「快適なモバイル環境を作りたい!」です。

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

ウェブページ