スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

avr、ATtiny2313の外部割込み

たまには役に立つ記事でも書いてみよう。

ATtiny2313の外部割込みについて。さっき色々やって成功したばかりなので正確ではない部分が幾らかあると思われます。


ATTiny2313以外のavrについてはデータシート等を参考にしてください。
WinAVRを使用している方はこのサイトも役立つかもしれません。
http://www11.ocn.ne.jp/~akibow/avr-libc-user-manual-1.4.3/group__avr__interrupts.html

追記(09/06/05):現在見れなくなっているようです。同じ内容のhtmlファイルは
C:\WinAVR-********\doc\avr-libc\avr-libc-user-manual\group_avr_interrupts.html
(********は20081205等。日付と思われます)に置かれているようです。


ATtiny2313ではportB(12~19番ピン)とportDの2,3番(6,7番ピン)で外部割込みが可能です。このうちportBはピンチェンジインタラプトのみ、portDの2,3番はピンチェンジインタラプト、posedge、negaedge、lolevelに対応しています。


まずは手っ取り早く使い方から。
portBのピンチェンジインタラプトを使用するにはGIMSKの5bit目(PCIE)をHiにする必要があります。
これがportBのピンチェンジインタラプト全体のエネーブルとなります。


つぎにPCMSKを設定します。portBのピンのうち、PCMSKのHiになっているビットに対応するピンのみがピンチェンジインタラプトを発行します。


最後にSREGの最上位ビットを立てる必要があります。これはタイマー割り込み等も含めた全ての割り込みの許可となります。


割り込み時に実行されるコードはWinAVRを用いてCで書くならば
SIGNAL(/*割り込みの種類*/){
 //ここに処理を記述
}
のようになります。portBの割り込みならばPCINT_vect,他の割り込みは
http://www11.ocn.ne.jp/~akibow/avr-libc-user-manual-1.4.3/group__avr__interrupts.html
を見て調べましょう。

追記(09/06/05):現在は割り込みに使う関数は"SIGNAL"ではなく"ISR"が推奨されているようです。


アセンブラで書くならば割り込みベクタを用いるとかの話ですがその辺はあまり知らないので割愛。



WinAVRを用いてCでコードを書くならば初期化等の部分は以下のようになります。
init_port,init_intをmain関数あたりで呼びましょう。SIGNALは割り込みがかかると勝手に呼ばれます。

init_port(){
 PORTB=0x00;//ポートB初期化。入力は0でハイインピーダンス、1でプルアップ。
 DDRB=0xf0;//ポートBの入出力設定。0で入力、1で出力。
         //PORTB,DDRBの値はどのピンを入力にするか等によって変えましょう。
}
init_int(){
 GIMSK=0x20;//ピンチェンジインタラプト許可
 PCMSK=0x0f;//PORTBの0~3のインタラプト許可。値は割り込みに使うピンによって変えましょう。
 sei();//インタラプト全体の許可。
}
SIGNAL(PCINT_vect){
 //割り込み時の処理
}


ピンチェンジインタラプトは入力ピンだけでなく出力ピンに対しても使用できるようです。その場合は内部の処理によりそのピンの出力が変化したとき割り込みがかかります。



PORTDの2,3番ピンの割り込みはMUCURを使って割り込みの種類を設定したりできるんだけど疲れたからまた今度にしよう。
スポンサーサイト
コメント
コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。