18f4550 rotary encoder okuma

Başlatan kont, 11 Temmuz 2016, 13:30:08

kont

Arkadaşlar kolay gelsin 18f4550  ile rotary encoder okuma yapmak istiyorum yardımcı olabilirmisiniz. 16f877  ile yapan varsa buda gecerli yardımlarınızı varsa örnek çalışmanızı bekliyorum.

LukeSkywalker

char value;
char new_encoder;
char last_encoder;

   new_encoder = (PORTB & 0x03);      // keep only 2 bits
   if(new_encoder != last_encoder)      // if encoder has changed
   {
      if(new_encoder.F1 == last_encoder.F0) value++;
      else value--;

      last_encoder = new_encoder;   // save for next time
   }

kont

Kesme kullanılmadan encoder okuma 18f4550 yemi özel üstadım.

Bu arada çok teşekür ediyorum bugun deneyecem  bu kodları
İnşallah problem çıkartmaz :) Eyv.  üstadım

görkem

yazılımsal olarak encoder okunmuş  18f4550 ye özel değil

kont

Anladım hocam. Araştırma yaparken kesmeler ile yapıldığını ve 18f4550 de int0 int1 kullanıldığını gördüm

kont


kont

Calışmamın üzerine ekledim ve  bu hataları aldım.

görkem

#7
Ccs c de yazıyosanız hata alabilirsiniz mikroc de yazılmış kod o çünkü. Portb değişiklik kesmesi ile encoderi okuyabilirsiniz int bacakları yerine daha kullanışlı olur

Sigorta ayarlarının altına #byte portb=0x06 olarak yazarsanız portb yi kullanabilirsiniz
Direk kullanım yok ccs c de portb olarak.bir başka yoluda
Portb yazan yere output_b yazmak. 

Bir diğer hata ise new_encoder.f1 satırında ccs c de bit işlemleri direk yapılamaz onuda şu şekilde çözersin
#bit new_encoder.f1=new_encoder.0  sıfırıncı biti değişkene atamış oluyosun
Last_encoderi de aynı şekilde yapıcaksın.

kont

Çok uzun Zamandır ugrasıyorum bunun üzerinde görkem Hocam bana yardımcı olabilirsen cok sevinirim. Dediklerini dikkate alıp çalışma yapıcam çok teşekkür ederim hocam

görkem

Benim kullandığım encoder okuma kodu portb değişiklik kesmesi ile.
16f877a ya uyarlayabilirsin.
Örnekleri çok vardı aslında sitede de encoder okumayla ilgili  anlatım mevcut.   


#include<16f628a.h>
#fuses INTRC_IO,NOPROTECT,NOMCLR,PUT,NOWDT,NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(b)

#BYTE PORTB=0x06




unsigned int8 eski=0;
unsigned int8 yeni=0;
 
unsigned int8 yon=0;
unsigned int16 say=0;




#BIT B=yeni.7
#BIT A=eski.6

#INT_RB
void kesme()
{

yeni=PORTB & 0xc0;
yon=A ^ B;          //encoder yönünü belirlemek için a ile b xor lanır.
if(yon==0)
{
say++;
}
else
{
say--;
}


eski=PORTB & 0xc0;


clear_interrupt(INT_RB);


}



void main()
{


setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);

   
set_tris_a(0x00);
set_tris_b(0xc1);
output_a(0x00);
output_b(0x00);


eski=PORTB & 0xc0;


enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

while(true)
{

}
}





kont

Çok teşekkür ederim hocam Kodu  yazdım derledim hata almadım. Müsait olamadım için zamanım olamıyor. Hocam encoder in A ve B  fazlasını B portunda hangi girişlere  baglamam gerekiyor. 

görkem

A fazı rb6 ya B fazını rb7 ye bağlayın

kont

Lcd de puls leri  nasıl okuyacagım hocam ben yaptığımda birer birer artmıyor sürekli 128 snra 6448 yazıyor


kont

Say değişkenini göstermeye çalıştığımda 1 0 yazıyor surekli hangi değişkeni izlemeliyim

kont

#include <16F877A.h>
#FUSES NOWDT ,XT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT 
#use delay(clock=4000000)
#use fast_io(b)
                                         
#BYTE PORTB=0X06                         
#include "lcd_d.c" 
unsigned int8 eski=0;           
unsigned int8 yeni=0;

unsigned int8 yon=0;
unsigned int8 say=0;               

#BIT B=yeni.7
#BIT A=yeni.6               
                             
#INT_RB
void kesme()                             
{                           
yeni=PORTB &0xc0;
yon=A ^ B;           
if(yon==0)                                     
{say++;}
else{say--;}       
                             
eski=PORTB & 0xc0;
                                       
clear_interrupt(INT_RB);
}                                 
                                                       
void main()       
{
setup_psp(PSP_DISABLED);                     
     
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);   
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_adc(ADC_OFF);
set_tris_a(0xF0);                           
set_tris_b(0xc1);
output_a(0x00);               
output_b(0x00);                           

             
lcd_init ();
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

                                             
while(1)                           
{           
if(yon==0){
  lcd_gotoxy(1,1); 
printf(lcd_putc,"\encoder:%1d",say);} 
                                     
                                       
} }