前へ 目次 次へ
タイマWの割込み関数
 

タイマWの割込み関数void int_timerw (void)を用いて、 デューティー比が連続的に変わるプログラムを作ってみましょう。

タイマWの割込み関数の名前は、 ヘッダファイルでvoid int_timerw (void)と定義されています。 したがって、タイマW割込みがかかったときに、 どのような操作をするかをこの中で指定すれば良いわけです。

 
サンプルプログラム
 
/*
 タイマWの割込み関数を用いてPWM出力を連続的に変更(pwm03.c)
*/

#include<3664.h>

long i=0;

int main(void)
{

  DI;
  TW.TMRW.BYTE=0x4B;      /* FTIOB端子をPWM出力に設定 */
  TW.TCRW.BYTE=0xB6;      /* クロックとして、内部クロックの1/8を使用 FTIOBの初期値は1 */
  TW.TIERW.BYTE=0x72;     /* TSRWのIMFBによる割込みを利用 */
  TW.TCNT=0x0000;         /* TCNの初期化 */
  TW.GRA=4000;            /* 2mS */
  TW.GRB=0;
  TW.TMRW.BIT.CTS=1;      /* TCNTカウンタスタート */
  EI;
  while(1){
    ;
  }
  return(0);
}

void int_timerw(void)
{
  i++;
  TW.TSRW.BIT.IMFB=0;
  TW.GRB++;
  if(i==4000){
    i=0;
  TW.GRB=0;
  }
}

 
プログラム解説
 

ここで利用している機能の多くはPWM制御を行うで説明しています。 そちらも参考にしてください。


TW.TIERW.BYTE=0x72

ここでは、割込み関数を利用するために、 タイマインタラプトイネーブルレジスタW(TIERW)で、 TSRWのIMFBによる割込み可能に設定しました。

割込みのステータスは、 タイマステータスレジスタW(TSRW)で確認することができます。

タイマステータスレジスタW(TSRW)

ビットビット名機能
7OVFタイマオーバーフロー
TCNTがH'FFFFからH'0000にオーバーフローしたときに1
6 常に1
5
4
3IMFDGRDがアウトプットコンペアレジスタの場合:TCNTとGRDが一致したとき1
GRDがインプットキャプチャレジスタの場合:TCNTの値がGRDに転送されたとき1
2PWMCGRCがアウトプットコンペアレジスタの場合:TCNTとGRCが一致したとき1
GRCがインプットキャプチャレジスタの場合:TCNTの値がGRCに転送されたとき1
1IMFBGRBがアウトプットコンペアレジスタの場合:TCNTとGRBが一致したとき1
GRBがインプットキャプチャレジスタの場合:TCNTの値がGRBに転送されたとき1
0IMFAGRAがアウトプットコンペアレジスタの場合:TCNTとGRAが一致したとき1
GRAがインプットキャプチャレジスタの場合:TCNTの値がGRAに転送されたとき1


TW.TSRW.BIT.IMFB=0

TCNTとGRBが一致したときTW.TSRW.BIT.IMFBは1になり、 割込み関数が実行されます。 次の割込みのために、0にクリアしています。

 
やって見よう
 

  • タイマWの割込み関数void int_timerw (void)を用いて、 周期が2.5mS、 パルスのON時間が0.3mS-2.1mSの間(18段階、1秒ごとに角度が変化)で連続的に変わるプログラムを作ってみよう。
    こんなふうにやったらどうでしょう:1周期ごとにタイマWの割込みを行う設定にする (コンペアマッチのときでも可)。 回数を数え1秒に相当する回数に達したらデューティー比を変更。 2.1mSまでいったら、次は0.3mSに設定。
  • 左のLEDに周期が2.5mS、ON時間が0.3mSのパルス。 真中のLEDに周期が2.5mS、ON時間が1.2mSのパルス。 右のLEDに周期が2.5mS、ON時間が2.1mSのパルスを出力するプログラムを作って見ましょう。

 
2003/07/08(Tue)
AKI-H8/3664 QFP版のトップページへ
トップページへ
広告 万馬券 無料レンタルサーバー ブログ blog