えべす屋工房

色々なモノを作ります

ロータリーエンコーダ別のコード

ロータリーエンコーダを使用した入力の別のプログラムコード見付けたので真似して書いてみました。今回の事でロータリーエンコーダの事が前回より理解できました。

“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なので左回転だと判断出来ます。

こんな説明で分かるでしょうか^_^;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です