はじめに
ATtiny13の外部割込みメモです。
主に備忘録となっていますが、できるだけわかりやすくまとめたいと思いますのでよかったらどうぞです。
ATtiny13の外部割り込みは【INT0】【PCINT0~5】の2種あります。前者は割り込みの条件を詳細に設定でき、スリープ状態の復帰にも使用することが可能です。後者はPINの状態変化のみによる外部割込みが可能です。パワーダウンのような深いスリープ状態の解除にはINT0のみの状態変化割り込みしか使用できません。
外部割込み【INT0】
概要
INT0の外部割込みに関連するレジスタは以下の3つになります。
- MCU制御レジスタ (MCU Control Register) MCUCR
― | PUB | SE | SM1 | SM0 | ― | ISC01 | ISC00 |
ISC01 | ISC00 | INT0割り込み発生条件 |
0 | 0 | LOWレベル |
0 | 1 | 状態変化 |
1 | 0 | 立下り |
1 | 1 | 立ち上がり |
- 一般割り込み許可レジスタ (General Interrupt Mask Register) GIMSK
― | INT0 | PCIE | ― | ― | ― | ― | ― |
- 一般割り込み要求フラグ レジスタ (General Interrupt Flag Register) GIFR
― | INT0 | PCIE | ― | ― | ― | ― | ― |
使用手順としてはMCUCRで外部割込みの設定を行い、GIMSKでINT0の外部割込みの許可を行います。
外部割込みが起きるとGIFRの外部割込み0要求フラグ(INTF0)がセットされます。もし、外部割込みのハンドラで処理を行う場合は外部割込みルーチン処理後0になります。フラグのみで処理を行う場合は手動でフラグを0に戻す必要があります。
外部割込み0を呼び出すハンドラは以下のように記述します。
1 |
ISR(INT0_vect){/*割り込み処理*/} |
プログラム例
【回路】INT0とGNDの間にスイッチ接続。PB0にLED接続。
■例1)ピン変化割り込みフラグを使用したフラグ処理のみでの割り込み使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <avr/interrupt.h> #include <avr/io.h> bool state=0; uint16_t cnt=0; void setup() { DDRB = 0b00000001;//PB0のみ出力設定 PORTB = 0b00000010;//PB1プルアップ設定 PCMSK |= 0b00000010;//PCINT1のピン変化割り込み許可 } void loop() { switch(state){ case 0: if(bit_is_set(GIFR,PCIF)){//ピン変化フラグ分岐 cnt=10000;//チャタリング対策 state=1; } break; case 1: cnt--; if(cnt==0){ PORTB ^= 0b00000001;//PIN0反転 GIFR |= 0b00100000;//ピン変化フラグクリア state=0; } break; } } |
■例2) 外部割込みハンドラによる割り込み処理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <avr/interrupt.h> volatile byte state=0; int16_t cnt; ISR(INT0_vect){ state=1; } void sw_up(){//スイッチ状態変化関数 switch(state){ case 0: break; case 1: cnt=1000; state=2; break; case 2: cnt--; if(cnt==0){ PORTB ^= 0b00000001; state=0; } } } void setup(){ DDRB |= 0b00000001;//PB0出力 PORTB |= 0b00000010;//PB1プルアップ MCUCR &= ~0b00000011;// LOWレベル検知 GIMSK |= (1<<6);//INT0割り込み許可 sei(); // 割り込み許可 } void loop() { sw_up(); } |
おわりに
今回はATtiny13の外部割込み機能についてまとめてきました。INT0のみの使用でしたが、ピン状態変化割り込みであれば、PCMSKで設定を行えばINT0以外の他のピンでも割り込み可能です。
ルーチン動作と外部割込みによるイベント動作のみの機能であれば、割り込み処理のみでメインループがブランクなプログラムも珍しくないので、割り込み動作については知っていて損はないと思います。
では、今回はここまでです。
ではでは~
コメント