ロータリーエンコーダーを使う
2003年2月22日更新
ロータリーエンコーダーをH8/3664Fタイニーに接続しカウント値を アップダウンさせるが 以前発表したのは単純にエンコーダーのノブを回転すると1ステップずつ UP/DWNしたが 今回はエンコーダーのノブの回すスピードが遅い時は今までと同じように1ステップづつUP/DWNするが ノブの回転速度を上げる事で10ステップづつUP/DWNするようにプログラムを変更した 原理はタイマー割り込みを利用しエンコーダーの切り替えタイミングが約30mS以下の時は10ステップUP/DWNするようにしました。
動作原理は時計回り(CW)で説明しますが エンコーダーを回転すると最初にA相がONし次にB相がONし次にA相がOFFしB相がOFFする事で1ステップしますが エンコーダーのノブの回す速度を1ステップの切り替えタイミングが30mS以下の時はタイマー割り込みをかけ 10ステップづつ変化するようにしています 従ってノブをゆっくり回転すれば1ステップ変化し早く回転すれば10ステップ変化します、これはエンコーダーを使用しマイコンにデータを書き込む時1バイト(255)位のデータを書き込む時は1ステップ変化で問題無いのですが 2バイト(65535)になるとデータを書き込む時に一苦労です その為ノブを早く回転する事で10ステップ変化する為書き込みが速く出来楽になります。
キースイッチでUP/DWN
今回ロータリーエンコーダー と同じようにマイコンにデータを書き込む時 星野さんが作ったH8-514BFのボードのキーSW P14を押し続ける事で2秒間は0.5Sごとに4ステップUPしその後P14を押し続ける間は32mS毎に1ステップ変化します。 又P15を押す事でDWNしますこれはタイマー割り込みを利用し キーSWを押し続けた時 最初の2秒間は0.5秒おきにUP又はDWNしその後32mS毎に1ステップUP又はDWNします、従って5秒押し続ける事で約100ステップ(=97.75=4+(1000/32)x3)変化しますこれもマイコンにデータの書き込みの時便利です、今回プログラム変更しキーボードを押し続ける事で4ステップ後UP/DWNし32mS事に100ステップUP/DWN後1ステップ11ステップずつ変化します。
プログラムの応用
今回作成したプログラムはマイコンに組み込み データの書き込みをする事が出来ますC言語なのでプログラムを他のCPUに移植
する事で応用範囲が広がると思います。
回路
回路はポート5がLCDの表示に接続し ポート1の上位4ビットP1-4〜P1-7を入力し P1-4、P1-5をKEY SWのUP/DWN P1-6,P1-7をロータリーエンコーダーに接続しました。
プログラムはこちら イエローソフトのプログラムソース
回路図
基本動作のためのプログラム ENCOD.Cのプログラム関数
ロータリーエンコーダー読み込み関数
/* ロータリーエンコーダー読み込み */
void encod(){
TMA = 0x1b; タイマーの割り込みを31mSに設定
if(USRF0_1==0){
if(SW_A == 0 && SW_B == 1){
for(;;){
if(SW_B == 0 && USRF0_0==0){
cunt_t=cunt_t+10; USRF0_0=1;
}
if(SW_B == 1&& SW_A==1){
USRF0_0=0;break;
}
}
}
if(SW_B == 0 && SW_A == 1){
for(;;){
if(SW_A == 0 && USRF0_0==0){
cunt_t=cunt_t-10;USRF0_0=1;
}
if(SW_B == 1&& SW_A==1){
USRF0_0=0;break;
}
}
}
}
if(USRF0_1==1){
if(SW_A == 0 && SW_B == 1){
for(;;){
if(SW_B == 0 && USRF0_0==0){
cunt_t++; USRF0_0=1;
}
if(SW_B == 1&& SW_A==1){
USRF0_0=0;break;
}
}
}
if(SW_B == 0 && SW_A == 1){
for(;;){
if(SW_A == 0 && USRF0_0==0){
cunt_t--;USRF0_0=1;
}
if(SW_B == 1&& SW_A==1){
USRF0_0=0;break;
}
}
}
}
if(cunt_t<0)cunt_t=29999;
if(cunt_t>29999)cunt_t=0;
USRF0_1=0;
}
アップダウン関数
void up_dwn(){
TMA = 0x19; /* 0.5s */
i=0;USRF0_2=0;
if(SW_1 == 0){
for(;;){
if(SW_1== 0 && USRF0_1 == 1){
cunt_t++; USRF0_1 = 0; i++;
if(i>3){
TMA =0x1b; /* 0.03125s */
i=5;
}
}
if(cunt_t>29999)cunt_t=0;
lcd_dsp();
if(SW_1 == 1)break;
}
}
if(SW_2 == 0){
for(;;){
if(SW_2== 0 && USRF0_1 == 1){
cunt_t--;USRF0_1 =0; i++;
if(i>3){
TMA =0x1b; /* 0.03125s */
i=5;
}
}
if(cunt_t<0)cunt_t=29999;
lcd_dsp();
if(SW_2 == 1)break;
}
}
}