目次
前
次
ロータリーエンコーダ処理
ロータリーエンコーダは、つまみを左右に
回転して、値増減に利用。
ロータリーエンコーダは、回転させると次のように
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個の
スイッチの状態を検出できる。
目次
前
次