タイマー割込みで効率的な制御(タイマーA割り込み)

タイマーA の割り込みを使ったタイマー動作の実行

 

正確な時間間隔を測れるタイマーと割り込みによって

タイマーA の割り込み関数を、設定時間ごとに起動し、LEDを点灯させる

 


タイマー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つずつピコピコと点灯します。

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena