目次

ロータリーエンコーダ処理

 ロータリーエンコーダは、つまみを左右に
 回転して、値増減に利用。



 ロータリーエンコーダは、回転させると次のように
 A相、B相の出力でパルスを生成。



 時計回り、反時計回りでは、A相で見るとrising_edgeを
 検出し、そのときのB相の論理値で回転方向を検出する。

 マイコンで回転方向を検出するには、外部割込み、ピン変化
 割込みを使うのが一般的。

 タイマー割込みを利用し、チャタリングを除去する方式を
 採用する。

 タイマー割込みは、ワンチップマイコンでは大抵用意されて
 いるので、シフトレジスタの最下位に論理値を入力していき
 シフトレジスタの値で、rising_edgeかfalling_edgeを判断
 する。



 タイマー割込みで、rising_edgeを検出できるので、そのとき
 ポート値を変数に入れ、ゆっくり判断すればよい。

 AVRマイコンを利用したタイマー割込みは、次のようにフラグを
 設定するだけ。

ISR(TIMER0_COMPA_vect)
{
  pcflag = ON ;
}

 フラグで通知された側は、ポート値入力、変数シフト、変数マスク
 判定で処理できる。

    if ( pcflag == ON ) {
      /* clear flag */
      pcflag = OFF ;
      /* get switch state */
      cport = PINC & 0xff ;
      /* shift */
      rot_sft <<= 1 ;
      /* mask */
      rot_sft &= MASK03 ;
      /* set LSB */
      if ( rot_sft & 0x01 ) { rot_sft |= ON ; }
      /* update */
      if ( rot_sft == 1 ) {
        /* decrement */
        if ( (cport & 0x02) == 0 ) {
            freq -= step ;
        }
        /* increment */
        else {
          freq += step;
        }
      }
    }

 タイマー割込みは、チャタリング除去の時間を調整
 できるため、自分は多用する。

 シフトレジスタ利用で、1バイトの変数をひとつの
 スイッチの状態変化に割当てられる。4ビットごと
 にシフトレジスタを割当てると、1バイトで2個の
 スイッチの状態を検出できる。


目次

inserted by FC2 system