ロータリーエンコーダーを使う

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;

             }

         }

}

 

 

TOPへ