タイマ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に表示させている。
プロジェクトファイルのダウンロード
メニューに戻る