タイマRJ2

タイマRJ2は、パルス出力、外部入力パルス幅、周期測定、内部カウントソースまたは外部パルスをカウントできる16ビットタイマです。動作モードには以下の5つがあります。

タイマモード 内部カウントソースをカウントするモードです。
パルス出力モード 内部カウントソースをカウントし、タイマのアンダーフローで極性を反転したパルスを出力するモードです。
イベントカウントモード 外部パルスをカウントするモードです。
パルス幅測定モード 外部入力のパルス幅を測定するモードです。
パルス周期測定モード 外部入力のパルス周期を測定するモードです。

 ここでは、以下の3つのモードについて実験を行っています

     T.タイマモード

     U.パルス出力モード

     V.パルス幅測定モード



T.タイマモード

 TRJMRレジスタのTCK0〜TCK2ビットにより選択されたカウントソースで、ダウンカウントするモードです。

(1)タイマRJモードレジスタ(TRJMR)

ビット シンボル ビ ッ ト 名 設定値
 7  TCKCUT タイマRJカウントソース遮断ビット   
 6  TCK2 タイマRJカウントソース選択ビット 000:f1(20MHz)
001:f8(2,5MHz)
010:fHOCO
011:f2(10MHz)
 5  TCK1
 4  TCK0
 3  TEDGPL TRJIOエッジ極性選択ビット 0:片エッジ
1:両エッジ
 2  TMOD2 タイマRJ動作モード選択ビット 000:タイマモード
001:パルス出力モード
010:イベントカウントモード
011:パルス幅測定モード
100:パルス周期測定モード
 1  TMOD1
 0  TMOD0
タイマーモード、カウントソースをf8(2.5MHz)で使う場合、TCK2(0)、TCK1(0)、TCK0(1)、TMOD2(0)、TMOD1(0)、TMOD0(0)

  trjmr = 0x10; (0001 0000)と設定します。

つまり、タイマRJのカウント値が、1/(2 500 000) = 0.04us = 40ns毎にカウントダウンしていくことになります。16ビットカウントレジスタ(TRJ)で設定した値を、タイマモードレジスタ(TRJMR)で設定した値に従って−1づつカウントダウンしていき、0000hになった後、次のカウントソースが入力されると、アンダーフローが発生し、次に設定した値に戻ります。例えば、ここで、

 カウントレジスタ trj = 60000−1 に設定すると、60000 × 40ns = 24ms 毎に繰り返してカウントダウンしていくことになります。

(2)タイマRJ割り込み制御レジスタ(TRJIR)

 タイマRJのカウントを使って割り込みをかける場合には、タイマRJ割り込み制御レジスタ(TRJIR)を設定する必要があります。

ビット シンボル ビ ッ ト 名 設定値
  7  TRJIE     タイマRJ割り込み許可ビット   0:割り込み禁止
 1:割り込み許可  
  6  TRJIF     タイマRJ割り込み要求フラグ  0:割り込み要求なし
 1:割り込み要求あり
  5    

 trjie_trjir = 1;   タイマRJ割り込み許可ビットを1にして割り込みを許可します。

 タイマRJ割り込み要求フラグは、タイマRJがアンダーフローしたときに1になります。
    trjif_trjir = 0; ・・・ 割り込み要求なし
    trjif_trjir = 1; ・・・ 割り込み要求あり

(3)割り込み優先レベルレジスタ(ILVLi)

 タイマRJ2の割り込み優先レベルレジスタは、ILVLBレジスタです。ビット1(ilvl1)、ビット0(ilvlb0)を以下のように設定します。

   ilvlb1    ilvlb0 割り込み優先レベル
     0      0    レベル0 禁止
     0      1    レベル1
     1      0    レベル2
     1      1    レベル2

割り込み優先レベル1に設定する場合は、以下のように設定します、

    ilvlb0 = 1;
    ilvlb1 = 0;
または、
    ilvlb.addr.bit.b0 = 1;
    ilvlb.addr.bit.b1 = 0;
または、
    ilvlb  = 0x01; という記述も可能です。

◎プログラム M12_RJ2_EM.c

p1_7に接続した可変抵抗値のAD変換値を、RJ2タイマ割り込みを使って24ms毎にUART0でTeraTerm画面に表示させます。

 p1_7 ・・・AD変換値
 p1_4 ・・・UART0 TXD0
 p1_5 ・・・UART0 RXD0


1)メインファイル

 #include "sfr_r8m12a.h"
 #include "rj2_ctrl.h"
 int i,j,d;
 unsigned long cnt_rb;
 unsigned int rd[4];
 unsigned char str0[8];
 unsigned char str1[8];

 void main(void)
 {
  init();
  asm("FCLR I"); // interrupt disable
  uart0_init(); // UART0初期化
  timer_rj2_init(); // RJ2タイマ初期化
  asm("FSET I"); // interrupt inable
  CLK_ON();
  while(1){
  }
 }
 /**********************************************************/
 /* I/O 初期化関数 */
 void init(void)
 {
  int i;
  prc0 = 1; // プロテクトレジスタ解除
  hocoe = 1; // 高速オンチップオシレータ発振開始
  for(i=0;i<50;i++); // 発振安定まで待つ
  hscksel = 1; // 高速オンチップオシレータ選択ビットを1にする
  scksel = 1; // システム基準クロックを高速にする
  prc0 = 0; // プロテクトレジスタ禁止
  pd1 = 0x1f; // 0001 1111
 }
 /**********************************************************/
 /* UART0垂れ流し */
 /* p1_4:TXD0 p1_5:RXD0 に割り当てる */
 void uart0_init(void)
 {
  mstcr = 0x00; // モジュールスタンバ制御イレジスタを0にする
  pmh1 = 0x05; // p1_4をTXD0、p1_5をRXD0に割り当てる
  pmh1e = 0x00; // 〃
  u0mr = 0x05; // 8ビット長、パリティなし、ストップビットなし
  u0brg = 0x81; // uart0初期化 20MHZ/(9600*16)-1=0x81
  dfe_u0c0= 1; // ディジタルフィルタ許可
  te_u0c1 = 1; // 送信許可
  // re_u0c1 = 1; // 受信許可
  // ilvl9_addr.bit.b0=1;// UART0割り込みレベル1に設定
  // ilvl9_addr.bit.b1=0;//
  // u0rie = 1; // 受信割り込み許可
 }
 /* RJ2初期化 ON幅−OFF幅=1:1 */
 void timer_rj2_init(void)
 {
  msttrj = 0; // タイマRJ2スタンバイビット タイマJ2を有効にする
  trjmr = 0x10; // タイマRJモードレジスタ f8:2.5MHz( 400ns毎カウントダウン),タイマモードに設定
  trj = 2500−1;// 400ns × 2500 = 1ms
  ilvlb0 = 1; // 優先レベル1
  ilvlb1 = 0; //
  trjie_trjir=1; // タイマRJ割り込み制御レジスタ 割り込み許可ビット
 }
 /****** タイマRJ2 スタート ストップ ************/
 void CLK_ON(void)
 {
  tstart_trjcr = 1;// タイマースタート
 }

 void CLK_OFF(void)
 {
  tstart_trjcr = 0;// タイマーストップ
 }
 /* AN7端子AD変換関数 */
 int Get_AD7(void)
 {
  int data;
  p17sel0 = 0;// ポート1機能マッピングレジスタ1 AN7入力
  p17sel1 = 0;
  mstad = 0; // モジュールスタンバイ制御レジスタをアクティブ
  mstcr = 0x00;// モジュールスタンバイ制御レジスタをアクティブ
  admod = 0x03;// A/D動作 0x0b:繰り返しモード 0x03:単発モード f1(20MHz)
  adinsel = 0x81;// A/D入選択レジスタ AN7
  adcon0 = 0x01;// AD変換スタート
  while(adcon0 && 0x01); // A/D変換終了待ち(単発モード)
  data = ad1;
  return data;
 }
 /* UART0 */
 /* UART0 1文字受信関数 */
 int UART0_rx(void)
 {
  unsigned int data;
  char err;

  while(ri_u0c1 != 1);
  data = u0rb & 0x00ff;
  return data;
 }

 /* UART0 1文字送信関数 */
 int UART0_tx(char data)
 {
  while(ti_u0c1 != 1);// 送信バッファ空フラグ
  u0tbl = data;
 }

 /* UART0 文字列送信関数 */
 void UART0_tx_str(char *str)
 {
  while(*str != '\0'){
   UART0_tx(*str);
   str++;
  }
 }

 /* UART0 改行表示関数 */
 void CRLF(void)
 {
  UART0_tx(0x0a);
  UART0_tx(0x0d);
 }

 /******************************/
 /* 割り込みプログラム */
 /*******************************/
 #pragma interrupt intTRJ(vect=22)
 void intTRJ(void)
 {
  trjif_trjir = 0; // 割り込み制御レジスタの割り込み要求フラグをクリア
  cnt_rb++;
  if(cnt_rb>1000){
   cnt_rb=0;
   d=Get_AD7(); // AD変換値(AN7)入力
   for(i=0;i<4;i++){ // 0〜255を各桁に分解する
    rd[i] = d % 10;
    d = d / 10;
   }
   str1[5]='\r';
   str1[4]='\n';
   str1[3]=rd[0]+0x30;
   str1[2]=rd[1]+0x30;
   str1[1]=rd[2]+0x30;
   str1[0]=rd[3]+0x30;
   UART0_tx_str(str1); // 受信データをTeraTerm画面へ送信
  }
 }
 #pragma interrupt _uart0_receive(vect=18)// UART0受信割り込み関数
 void _uart0_receive(void)
 {
  unsigned char r_data;
  // r_data = u0rb & 0x00ff; // u0rb 受信バッファレジスタ下位8ビット
  // u0rif = 0;
 }

2)ヘッダーファイル

 /****************************************/
 /* rj2_ctrl.h */
 /****************************************/
 #define CLOCK 20000
 /*======================================*/
 /* プロトタイプ宣言 */
 /*======================================*/

 void init(void);
 void timer_rj2_init(void);
 void uart0_init(void);

 void CLK_ON(void); // タイマRJ2 スタート 関数
 void CLK_OFF(void); // タイマRJ2 ストップ関数
 int Get_AD7(void);

 int UART0_tx(char data);/* 1文字送信関数 */
 int UART0_rx(void); /* 1文字受信関数 */
 void UART0_tx_str(char *str);/* 文字列送信関数 */
 void CRLF(void); /* 改行表示関数 */






プロジェクトファイルのダウンロード













U.パルス出力モード

 ここでは、パルス出力モードを取り扱ってみます。タイマRJ2は、他のタイマとは異なり、パルス出力する場合は、常にON幅−OFF幅の比率は1:1しか出力できません。 パルス出力する場合の端子(TRJO)はp1_6またはp3_7のどちらか1つのみを使うことになります。今回扱うパルス出力に関するレジスタは以下の通りです。

(1)ポート機能マッピングレジスタ(PMH1)

ポート1_6を使う場合は、ポート1機能マッピングレジスタ(PMH1)のポートp1_6機能選択ビット(P16SEL0、P16SEL1)を以下のように設定します。
    p16sel0 = 0;
    p16sel1 = 1;

    または、pmh1 = 0x20; 

    これで、p1_6がタイマRJ2のパルス出力モードのTRJO端子になります。
ポート3_7を使う場合は、ポート3機能マッピングレジスタ(PMH3)のポートp3_7機能選択ビット(P37SEL0、P37SEL1)を以下のように設定します。
    p37sel0 = 0;
    p37sel1 = 1;
   
    または、pmh3 = 0x80;


    これで、p3_7がタイマRJ2のパルス出力モードのTRJO端子になります。

(2)タイマRJモードレジスタ(TRJMR)

 T.タイマーモードの項で載せたタイマRJモードレジスタ(TRJMR)と同じ内容ですが、ここでは、パルス出力モードをカウントソースf1(20MHz)で行うので、設定値は次のようになります。

    trjmr = 0x01; ・・・(0000 0001)

 つまり、ここではRJカウントソースをf1(20MHz)に設定していますので、タイマRJのカウント値が、1/20 000 000 = 0.05us = 50ns毎にカウントダウンしていくことになります。


(3)タイマRJカウントレジスタ(TRJ)

 16ビットレジスタです。このタイマRJカウントレジスタ(TRJ)で設定した値を、タイマモードレジスタ(TRJMR)で設定した値に従って−1づつカントダウンしていき、0になった次に設定した値に戻ります。例えば、ここで、

    trj = 1000; と設定すると

 1000 * (1/20 000 000) = 50us毎にカウントがクリアされるので、1周期100usのパルスが出力されることになります。

(4)タイマRJ制御レジスタ(TRJCR)

ビット シンボル ビ ッ ト 名 設定値
  7         
  6      
  5  TUNDF  タイマRJアンダフローフラグ  0:アンダフローなし
 1:アンダフローあり
  4  TEDGF  有効エッジ判定フラグ  0:有効エッジなし
 1:有効エッジあり
  3    
  2  TSTOP  タイマRJカウント強制停止ビット   1:カウント強制停止
  1  TCSTF  タイマRJカウントステータスフラグ  0:カウント停止
 1:カウント中
  0  TSTART  タイマRJカウント開始ビット  0:カウント停止
 1:カウント開始

 ここでは、関係するのはTSTARTビットとTCSTFビットのみです。

    tstart_trjcr = 1; ・・・ タイマスタートします

    tstart_trjcr = 0; ・・・ タイマ停止します


カウント開始ビットを1にすると、50ns毎に−1づつカウントダウンしていきます。 タイマRJカウントステータスフラグTCSTFは、TSTARTビットに1を書いたときのみに同期して1になります。


(5)タイマRJ I/O制御レジスタ(TRJIOC)

ビット シンボル ビ ッ ト 名 設定値
  7  TIOGT1     TRJIOカウント制御ビット    00:常にイベントをカウント
 01:INTのH期間のみイベントをカウント
 10:TRJISRレジスタのRCCPSELビット
    で指定したタイマRC出力信号の期間
    イベントをカウント
 11:指定禁止  
  6  TIOGT0   
  5  TIPF1   TRJIO入力フィルタ選択ビット  00:フィルタなし
 01:フィルタあり、f1でサンプリング
 10:フィルタあり、f8でサンプリング
 11:フィルタあり、f32でサンプリング
  4  TIPF0 
  3  予約ビット  0
  2    予約ビット  0
  1  TOPCR   TRJIO出力制御ビット   0:TRJIO出力許可(トグル出力開始)
 1:TRJIO出力禁止(トグル出力停止)
  0  TEDGSEL   入出力極性切り替えビット   動作モードで異なる(別表)

    入出力極性切り替え(TEDGSEL)ビット

動作モード 機  能
 パルス出力モード  0:Hから出力開始
 1:Lから出力開始
 イベントカウンタモード  0:立ち上がりエッジでカウント
 1:立ち下がりエッジでカウント
 パルス幅測定モード  0:Lレベル幅を測定
 1:Hレベル幅を測定
 パルス周期測定モード  0:測定パルスの立ち上がりから
   立ち上がり間測定
 1:測定パルスの立ち下がりから
   立ち下がり間測定   

リセット後の値は、trjioc = 0x00です。



◎プログラム timer_rj2.c

 p1_6にブザーを接続し、パルスを一定時間毎に出力します。確認のため、出力中にp1_7を点灯します。

  #include "sfr_r8m12a.h" /* R8C/M12A SFRの定義ファイル */
  void init(void);
  void timer(unsigned long timer_set);
  void CLK_ON(void);
  void CLK_OFF(void);

  void main(void)
  {
    unsigned char d;
    init();
    while(1){
      CLK_ON(); // ブザーON
      p1_7=1; // クロック確認用
      timer(4000);
      CLK_OFF(); // ブザーOFF
      p1_7=0; // クロック確認用
      timer(4000);
    }
  }
  /* I/O初期化関数 */
  void init(void)
  {
    int i;
    /**** 高速オンチップオシレータで動作する場合 ****/
    prc0 = 1; // プロテクトレジスタ解除
    hocoe = 1; // 高速オンチップオシレータ発振開始
    for(i=0;i<50;i++); //発振安定まで待つ
    hscksel =1; // 高速オンチップオシレータ選択ビットを1にする
    scksel =1; // システム基準クロックを高速にする
    prc0 = 0; // プロテクトレジスタ禁止
    pd1 = 0xc0; // ポートディレクションレジスタ出力ポート設定 1100 0000(p1_7,p1_6)
    p1 = 0x00;
  // pd3 = 0xff; // ポートディレクションレジスタ3全て出力ポート設定

    p16sel1 = 1; // P1_6をTRJ0端子にする
    p16sel0 = 0; // 〃
  // p37sel1 = 1; // P3_7をTRJ0端子にする
  // p37sel0 = 0; // 〃

    msttrj = 0; // タイマRJ2スタンバイビット タイマJ2を有効にする
    trjmr = 0x01; // タイマRJモードレジスタ 20MHz(50ns毎),パルス出力モードに設定(0000 0001)
  // trj = 49;
    trj=1000; // 50us TRJ x 1/20MHzの時間でON/OFFする.1周期100usのパルス
  }
  void timer(unsigned long timer_set)
  {
    int i;
    do{
      for(i=0;i<871;i++);
    }while(timer_set--);
  }

  void CLK_ON(void)
  {
    tstart_trjcr = 1; // タイマースタート
  }
  void CLK_OFF(void)
  {
    tstart_trjcr = 0; // タイマーストップ
  }


プロジェクトファイルのダウンロード













U.パルス幅測定モード

 タイマRJ2には、外部からのパルスをカウントする機能があります。パルスを入力するTRJIOとして使える端子は、p4_6、p1_7、p1_5のいずれかになります。外部パルスカウントモードには、イベントカウントモード、パルス周期カウントモード、パルス幅カウントモードの3つがありますが、パルス周期カウントモードの場合はカウントソースの2倍以上のパルスでなければ測定できないようなので、ここでは、パルス幅カウントモードを実験してみます。タイマRJカウントレジスタ(trj)は16ビットレジスタですので、レジスタの最大値は0xFFFF(65535)です。1msのパルス幅のカウント値は20000になるようですので、最大でも3.5ms程度のパルス幅を計るのが限界のようです。


(1)ポート機能選択レジスタ

ポート1_5を使う場合は、ポート1機能マッピングレジスタ(PMH1)のポートp1_5機能選択ビット(P15SEL0、P15SEL1)を以下のように設定します。
    p15sel0 = 0;
    p15sel1 = 1;

    これと併せて、ポート1機能マッピング拡張レジスタ(PMH1E)のP15SEL2を、
    p15sel2  = 0;

    これで、p1_5がタイマRJ2のパルスカウントモードのTRJIO端子になります。

ポート1_7を使う場合は、ポート1機能マッピングレジスタ(PMH1)のポートp1_7機能選択ビット(P17SEL0、P17SEL1)を以下のように設定します。
    p17sel0 = 0;
    p17sel1 = 1;


    これで、p1_7がタイマRJ2のパルスカウントモードのTRJIO端子になります。

ポート4_6を使う場合は、ポート4機能マッピングレジスタ(PML4)のポートp4_6機能選択ビット(P46SEL0、P46SEL1)を以下のように設定します。
    p46sel0 = 0;
    p46sel1 = 1;


    これと併せて、ポート4機能マッピング拡張レジスタ(PMH4E)のP46SEL2を、

    p46sel2  = 0;

    これで、p4_6がタイマRJ2のパルスカウントモードのTRJIO端子になります。


(2)タイマRJ I/O制御レジスタ(TRJIOC)

 タイマRJIO制御レジスタの入出力極性切り替えビット(TEDGSEL)をHレベルを測定するので、1に設定する。

    tedgsel_trjioc = 1;



(3)タイマRJモードレジスタ(TRJMR)

タイマRJ動作モード選択ビットをパルス幅測定モードにしますので、

    tmod2_trjmr = 0;     まとめて以下のように書いても同じです
    tmod1_trjmr = 1;  →  trjmr = 0x03; ・・・(0000 0011)
    tmod0_trjmr = 1;


(4)モジュールスタンバイ制御レジスタ(MSTCR)

 モジュールスタンバイ制御レジスタ(MSTCR)のタイマRJ2スタンバイビット(MSTTRJ)をアクティブにします。

    msttrj = 0; 
    または、
    
    mstcr = 0x00;


(5)タイマRJ制御レジスタ(TRJCR)

タイマRJ制御レジスタ(TRJCR)のタイマRJカウント強制停止ビット

    tstop_trjcr = 1; ・・・ カウンタ強制停止
    tstop_trjcr = 0; ・・・ カウンタ強制停止しない

アンダーフローフラグ

    tundf_trjcr = 0; ・・・ アンダーフローなし

    tundf_trjcr = 1; ・・・ アンダーフローあり


(6)タイマRJ割り込み制御レジスタ(TRJIR)
ビット シンボル ビ ッ ト 名 設定値
  7  TRJIE     タイマRJ割り込み許可ビット   0:割り込み禁止
 1:割り込み許可  
  6  TRJIF     タイマRJ割り込み要求フラグ  0:割り込み要求なし
 1:割り込み要求あり
  5    
  4      
  3    
  2       
  1      
  0      

 タイマRJ割り込み要求フラグは、タイマRJがアンダーフローしたとき、パルス周期測定モードで外部入力(TRJIO)の設定エッジが入力されたとき、パルス幅測定モードで外部入力(TRJIO)の有効幅の測定を完了したとき、1になります。

    trjif_trjir = 0; ・・・ 割り込み要求なし
    trjif_trjir = 1; ・・・ 割り込み要求あり


◎プログラム

 ここでは、R8C/M12ボードを2台使って、1台でパルスを発生させて、もう1台を接続してそのパルスを測定してLCDに表示させます。パルス発生は前節のタイマRB2のプログラムを使い、p1_3で出力し、それを他の1台のp4_6をTRJIO端子にして入力し、p1_0〜p1_5に接続したLCDにカウント数を表示させます。Hのパルス幅1msに対して20000の値が表示されるとのことです。今回は、1周期4ms、Hパルス幅3ms、Lパルス幅1msのパルスを発生させていますので、LCDの表示が60000と表示されることになります。

1)メイン関数 M12_RJ2_COUNT.c

#include "sfr_r8m12a.h"
#include "lcd_ctrl.h"
unsigned long cnt_rb;
unsigned long p_width;
unsigned long tm;

void main(void)
{
  unsigned int i;
  unsigned int ad;
  unsigned char rd[5];
  unsigned char str1[16];
  unsigned char str2[16];
  unsigned char d;
  int ret;
  init();
  lcd_init();
  rj2_init();

  lcd_clear();
  for(i=0;i<16;i++){
    str1[i]=' ';
    str2[i]=' ';
  }
  asm("FSET I");// 割り込み可
  while(1){
    ad=p_width;
    for(i=0;i<5;i++){ // 0〜255を各桁に分解する
      rd[i] = ad%10;
      ad = ad/10;
    }
    str2[0]='T';
    str2[1]='R';
    str2[2]='J';
    str2[3]=' ';
    str2[4]=' ';
    str2[5]='=';
    str2[6]=' ';
    str2[7]=rd[4]+0x30;
    str2[8]=rd[3]+0x30;
    str2[9]=rd[2]+0x30; // ASCIIコードに変換
    str2[10]=rd[1]+0x30;
    str2[11]=rd[0]+0x30;

    ad=tm; // 実時間に換算
    for(i=0;i<5;i++){ // 0〜255を各桁に分解する
      rd[i] = ad%10;
      ad = ad/10;
    }
    str1[0]='T';
    str1[1]='I';
    str1[2]='M';
    str1[3]='E';
    str1[4]=' ';
    str1[5]='=';
    str1[6]=' ';
    str1[7]=rd[4]+0x30;
    str1[8]=rd[3]+0x30;
    str1[9]=rd[2]+0x30; // ASCIIコードに変換
    str1[10]=rd[1]+0x30;
    str1[11]=rd[0]+0x30;
    str1[12]=' ';
    str1[13]='u';
    str1[14]='s';
    lcd_str(str1,1);
    lcd_str(str2,2);
    wait_us(1000);
  }
}
/* I/O初期化関数 */
void init(void)
{
  int i;
  /**** 高速オンチップオシレータで動作する場合 ****/
  prc0 = 1;// プロテクトレジスタ解除
  hocoe = 1;// 高速オンチップオシレータ発振開始
  for(i=0;i<50;i++);//発振安定まで待つ
  hscksel =1;// 高速オンチップオシレータ選択ビットを1にする
  scksel =1;// システム基準クロックを高速にする
  prc0 = 0;// プロテクトレジスタ禁止
  pd1 = 0x7f;// ポートディレクションレジスタ p0〜p6出力ポート設定
  p1 = 0x00;
  pd3 = 0xff;// ポートディレクションレジスタ3全て出力設定
  pd4 = 0x00;// ポートディレクションレジスタ4全て入力設定
  pml3= 0x80;
}

void rj2_init(void)
{
  msttrj = 0; // モジュールスタンバイ制御レジスタ タイマRJアクティブ
  p46sel0 = 1; // p4_6 TRJIO にする
  p46sel1 = 0; // 〃
  p46sel2 = 1; // 〃
  tck0_trjmr = 0;// カウントソースf1
  tck1_trjmr = 0;// 〃
  tck2_trjmr = 0;// 〃
  tmod2_trjmr = 0;// 010:イベントカウントモード タイマRJモードレジスタ
  tmod1_trjmr = 1;// 011:パルス幅        〃
  tmod0_trjmr = 1;// 100:パルス周期       〃
  tedgsel_trjioc = 1;// Hレベル測定
  trj = 0xffff;
  trjie_trjir = 1;// TRJ割り込み許可
  tstop_trjcr = 1;// カウンタ強制停止 再開
  tstop_trjcr = 0;// カウンタ停止しない カウンタclear再セット trj=ffffh
  tundf_trjcr = 0;// アンダーフローフラグなし
  trjif_trjir = 0;// 割り込み要求フラグなし
  ilvlb = 0x03; // 割り込みレベル2
  tstart_trjcr= 1;// タイマスタート
}


// RJ2割り込み関数
#pragma interrupt int_RJ2(vect = 22)
void int_RJ2(void)
{
  if(tundf_trjcr){// アンダーフローあり
    tundf_trjcr = 0;
  }
  if(tedgf_trjcr){// 有効エッジあり(立ち下がり検出)
    tedgf_trjcr =0;
    p_width =0xffff-trj;
    tm=p_width/20.0;
    tstart_trjcr = 0;//TRJ停止させてリセット
    trj =0xffff;
    tstart_trjcr = 1;// TRJ再開
  }
}


2)ヘッダーファイル lcd_ctrl.h

/***********************************************************************/
/* lcd_ctrl.h */
/***********************************************************************/
void init(void);
void rj2_init(void);

void lcd_init(void); /* LCD初期化関数 */
void lcd_clear(void); /* LCD画面クリアー */
void lcd_cursor_off(void); /* LCDカーソルoff */
void lcd_out(unsigned char,unsigned char); /* データ出力関数 */
void lcd_data(unsigned char); /* 一文字出力関数 */
void lcd_cmd(unsigned char cmd);/* コマンド出力関数 */
void lcd_str(unsigned char *str,unsigned char); /* 文字列出力関数 */
void wait_us(unsigned long usec);/* us単位のウエイト関数 */



3)LCD制御関数 lcd_ctrl.c

 以前使用したものと同じです。


実行画面

2台を接続して、上側のボードで1周期4ms、Hパルス幅3msを発生
させて、下側のボードのTRJIO端子に入力し、LCDに表示させている。


プロジェクトファイルのダウンロード

メニューに戻る