sağlam bir rotary encoder programı arıyorum

Başlatan berkay_91, 03 Temmuz 2015, 00:20:18

berkay_91

nette rotary encoder la ilgili problem yaşıyan bir sürü insanın yazılarını okudum ama bende yaşadığım problemden kendimi kurtaramadım, gerek hazır bulduğum rotary encoder programlarında gerekse baştan kendi yazdıklarımda hep aynı sorun çıkıyor; herhangi bir yöne çevirirken sayılar ya atlıyarak artıyor veya azalıyor yada düzenli bir şekilde artarken ara ara azalıyor sonra tekrar artmaya devam ediyor, işlemci olarak atmega ailesini kullanıyorum, mantık aynı yükselen kenarları saydırıp interrupt kesmesinden bilgiyi alıyorum lcd ye basıyorum ama olmuyor işte...
elinizde düzgün çalışan bir rotary encoder programı varsa lütfen paylaşır mısınız?



esensoy

debounce için kondansatör ekliyor musunuz? 100 nF mesela?
En tehlikeli an "zafer" anıdır.

mehmet

Pin kesmesinden vazgeçip, timer kesmesi ile okumak daha
uygun olacaktır. Ayrıca üç uç 10K ile pull-up ve 100nF ile gnd ye...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

berkay_91

#3
sonunda oldu dediğiniz gibi kapasitör koydum ve sadece düşen kenarları saydırdım, resimdeki modülü kullandığım için pull-up dirençleri(10k) modülün altında var, yeni başlayanlar için; Atmega 8 için çalışan program altta, modülün CLK ve DT pinleri işlemcinin PINB0 ve PIND3(INT1) pinlerine bağlanacaktır, modülün SW pini boşta, besleme için ise GND ve 5 v

/*
 * rotary_encoder.c
 *
 * Created: 09.06.2014 20:47:46
 *  Author: BERKAY
 */ 

#define F_CPU 16000000UL
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"

volatile int enc = 10;

void initInterrupts(void);

ISR(INT1_vect){
	
    if (bit_is_set(PINB,0))
    enc++;
	
    else 
    enc--;
	
}



void initInterrupts(void){
	
	MCUCR=(1<<ISC11); // düşen kenar

	GICR=(1<<INT1);
	
	sei();
}

FILE lcd_str = FDEV_SETUP_STREAM(lcd_putc, NULL, _FDEV_SETUP_WRITE);

int main(void)
{
	DDRD=0xf7;
	
	initInterrupts();
    
    lcd_init(LCD_DISP_ON);
	
	stdout = stdin = &lcd_str;
	
	lcd_clrscr();

	lcd_gotoxy(2,0);
	lcd_puts("Encoder Test");

	while (1){
		
		lcd_gotoxy(0,1);
		printf("%3d",enc);
		
		_delay_ms(10);
	}
	return 0;
}