ロータリーエンコーダ別のコード
ロータリーエンコーダを使用した入力の別のプログラムコード見付けたので真似して書いてみました。今回の事でロータリーエンコーダの事が前回より理解できました。
“lcd4bit.h”はこちらの”lcd.h”をご参考ください。
#define F_CPU 1000000UL // 1MHz
/* LCD */
#define LCD_PORT PORTD
#define LCD_E 0b00000010
#define LCD_RS 0b00000001
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sfr_defs.h>
#include "lcd4bit.h"
volatile struct
{
int position;
int moved;
} Encoder;
int encoder(void)
{
if (bit_is_clear(PINB, PB0)) // AがLになった時
{
while (bit_is_clear(PINB, PB0)) // AがLの間ループ、Hになるまで待機
{}
if (bit_is_clear(PINB, PB1)) // BがLの場合(右回転)
return 1;
else
return -1;
}
return 0;
}
void lcd_re_pos(void)
{
int posnum = Encoder.position;
char str_pos[3];
int i;
if (Encoder.position < 0)
{
str_pos[0] = '-';
posnum = -(posnum); // 「-」があるとキャラクターコードとマッチしない
} else {
str_pos[0] = '+';
}
for (i = 3; i > 0; i--)
{
str_pos[i] = ((posnum) % 10) + 0x30; // 数値を数字に変換
posnum /= 10;
}
lcd_clear();
for (i = 0; i <= 3; i++)
{
lcd_data(str_pos[i]);
}
Encoder.moved = 0;
}
ISR(TIMER0_COMPA_vect)
{
// 5ms毎に実行
Encoder.moved = encoder();
Encoder.position += Encoder.moved;
if(Encoder.moved) lcd_re_pos();
}
int main(void)
{
/* LCD設定 */
DDRD = 0b11111111; // LCDピンに使用
PORTD = 0b00000000; // ポートD初期化
lcd_init();
/* ロータリーエンコーダ */
DDRB = 0b00000000;
PORTB = 0b00000011;
/* タイマー割り込み設定 */
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000101; // 1MHz/1024 = 約977Hz→約1kHz
OCR0A = 5; // 5msで割り込み
TIMSK0 = 0b00000010; // COMPA割り込み
lcd_str("Rotary Encoder");
lcd_pos(2,1);
lcd_str("Ver.1.0");
sei(); // 全体の割り込み許可
/* Replace with your application code */
while (1)
{
}
}
今回、bit_is_clear( )という関数を使用する為に<avr/sfr_defs.h>をインクルードしています。
if (bit_is_clear(PINB, PB0))
としておけばPB0のピンがLだった場合「真」になります。
19行目のencoder( )関数は右回転だった場合「1」を左回転だった場合「-1」を動いていない場合「0」を返します。
ロータリーエンコーダを回していない時はAもBもOFFなのでPB0とPB1はプルアップしている為Hになっています。1クリックする間にOFF→ON→OFFとなりONした時に各入力ピンがLになります。
1クリックする度にONとOFFを繰り返すと勘違いしていましたσ(^_^;)(カチッONカチッOFF…と)
AがLからHになったタイミングでBの状態を見ればどちらに回転したのか分かります。右回転の場合、「A-B」の関係は「H-H」→「L-H」→「L-L」→「H-L」→「H-H」…という順番になります。AがLからHになった時なので4番目の状態を確認します。4番目のBの状態はLなので右回転だと判断します。
左回転の場合、「H-H」→「H-L」→「L-L」→「L-H」→「H-H」…の順番になるので、AがLからHになった時、BがHなので左回転だと判断出来ます。
こんな説明で分かるでしょうか^_^;