Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: berkay_91 - 03 Temmuz 2015, 00:20:18

Başlık: sağlam bir rotary encoder programı arıyorum
Gönderen: berkay_91 - 03 Temmuz 2015, 00:20:18
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?

(http://s10.postimg.cc/5z14lyy39/rotary.jpg) (http://postimg.cc/image/5z14lyy39/)
Başlık: Ynt: sağlam bir rotary encoder programı arıyorum
Gönderen: esensoy - 03 Temmuz 2015, 00:37:24
debounce için kondansatör ekliyor musunuz? 100 nF mesela?
Başlık: Ynt: sağlam bir rotary encoder programı arıyorum
Gönderen: mehmet - 03 Temmuz 2015, 01:57:55
Pin kesmesinden vazgeçip, timer kesmesi ile okumak daha
uygun olacaktır. Ayrıca üç uç 10K ile pull-up ve 100nF ile gnd ye...
Başlık: Ynt: sağlam bir rotary encoder programı arıyorum
Gönderen: berkay_91 - 03 Temmuz 2015, 11:22:40
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;
}