タイマーA割り込み
続いてタイマAを使って、今度は割り込みでのプログラムにしてみます。
割り込みなどについて、Tekurobo工作室
105.タイマー割込みで効率的な制御 を参照してください。
割り込みについて詳しく説明されています。
タイマAの割り込みについては、上記の設定を見れば難しくはないと思います。
割り込みを使ったタイマAによるLED点灯
割り込み
すでにやった上記の正確な時間稼ぎでは設定時間が来ると、
IRR1.BIT.IRRTA=0; が 1 となり
コレを監視すれば時間が来たのがわかりました。
割り込みでは 加えて
IENR1.BIT.IENTA=1 と 割り込み設定をすると
IRRTA=0 が 1となると同時に
タイマA割り込み関数 int_timera( ) が自動的に実行されます。
つまり設定時間ごとに実行される
割り込み関数 int_timera が設定時間ごとに呼び出され、今度はこの関数内でLED点灯処理をします。(今度はバイトアクセスを使用しました)
割り込み許可、禁止の EI DI を使用します(GDL用)
(小さな命令ですが、これを忘れると割り込みがかからないので、忘れないように!)
単にフラグ f をグローバル変数で作って、LEDを点灯させるたびに1、0を切り替えます。
このフラグfで 割り込み関数が呼び出されるたびに点灯させるLEDが切り替わる仕組み。
実験回路図
回路は IOポートでLEDを光らせると同じ回路を使います。
プログラム
TmrLed2_INT
/* タイマAの割り込み関数による LED点滅
設定時間毎に timera() が呼ばれる
毎回、点灯、消灯をフラグで切り替える
EI; //割り込み許可
*/
#include <3664.h>
int f; /* on,off フラグ */
void int_timera (void){
if(f==1){
IO.PDR1.BYTE=0X10; /* 0001 0000*/
f=0;
}else{
IO.PDR1.BYTE=0X20; /* 0010 0000*/
f=1;
}
IRR1.BIT.IRRTA=0;// 検知フラグを戻して再開
}
void main()
{
IO.PMR1.BYTE=0x00; /* 全て0にセットし、全ピンをポート使用に設定 0000 0000*/
IO.PCR1=0xFF; /* 全て1にセットし、出力に設定 1111 1111 */
/* PCRレジスタは IO.PCR1.BYTE 記述でない!*/
IO.PUCR1.BYTE=0x00; /* 全て0にセットし、プルアップなし*/
DI; /* =0xc0 */
TA.TMA.BYTE=0x09; /* 時計用クロック 時間0.5s 0000 1001 */
IRR1.BIT.IRRTA=0; /* タイマーA割込みフラグのリセット */
IENR1.BIT.IENTA=1; /* タイマーA割込みを利用可能にする */
EI;
f=1;
while (1) ;
}
実行結果
0.5秒ごとにLEDが1つずつピコピコと点灯します。
- twtter
- google+
- hatena