チラシの裏の電子工作

電子工作、PC関係の備忘録というか、チラシの裏

ArduinoでPCINT割込

Arduinoで割込といえばINT0/1だけど、沢山のピンで割込を使いたい時のメモ。
(Arduino0023/ATmega168P)

たまに使おうとすると、PCINT,PCMSK,PCIEの対応を忘れていて調べるのが非常にめんどくさいので、もう定型にしてしまおうというものぐさ。


#define SW_INT_PCICR ((1<<PCIE0)|(0<<PCIE2)|(0<<PCIE2))
#define SW_INT_PCMSK0 ((1<<PCINT0 )|(1<<PCINT1 )|(1<<PCINT2 )|(1<<PCINT3 )|(0<<PCINT4 )|(0<<PCINT5 )|(0<<PCINT6 )|(0<<PCINT7))
#define SW_INT_PCMSK1 ((0<<PCINT8 )|(0<<PCINT9 )|(0<<PCINT10)|(0<<PCINT11)|(0<<PCINT12)|(0<<PCINT13)|(0<<PCINT14))
#define SW_INT_PCMSK2 ((0<<PCINT16)|(0<<PCINT17)|(0<<PCINT18)|(0<<PCINT19)|(0<<PCINT20)|(0<<PCINT21)|(0<<PCINT22)|(0<<PCINT23))

ISR(PCINT0_vect){
    Serial.println("PCINT0_vect");
}
ISR(PCINT1_vect){
    Serial.println("PCINT1_vect");
}
ISR(PCINT2_vect){
    Serial.println("PCINT2_vect");
}

void setup(){
    //割込有効化
    PCICR  |=SW_INT_PCICR;
    PCMSK0 |=SW_INT_PCMSK0;
    PCMSK1 |=SW_INT_PCMSK1;
    PCMSK2 |=SW_INT_PCMSK2;

    delay(10000);

    //割込無効化
    PCICR  &=~SW_INT_PCICR;
    PCMSK0 &=~SW_INT_PCMSK0;
    PCMSK1 &=~SW_INT_PCMSK1;
    PCMSK2 &=~SW_INT_PCMSK2;
}

void loop(){}



美しくはないけど、割込をマトリクス状にしてしまったら解りやすいかと。
上の例では、PCINT0~3の割込を有効にしたり、取り消ししたり。
もっといい方法があればいいんだけども、ライブラリにするのもおっくう…

スポンサーサイト

カテゴリ:電子工作

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://nax9800.blog.fc2.com/tb.php/127-9f294d11
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad