Ccs 18f4550 rotary encoder okuma yardım

Başlatan enteresan10, 19 Nisan 2020, 14:18:45

enteresan10

#define LCD_RS    PIN_D0
#define LCD_E     PIN_D2
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#include <18F4550.h>
#fuses NOMCLR
#fuses XT,nowdt
#use delay(clock=4000000)
#include <lcd1.c>
unsigned int8 Encoder, oldEncoder; 
int sayac, tmp;
void main()
{
       setup_comparator(NC_NC_NC_NC ); // disable comparators
               setup_vref(FALSE); 
               setup_adc_ports(NO_ANALOGS ); // disable analog inputs
               setup_adc(ADC_OFF ); // disable A2D
  lcd_init();
  output_b(0x00); 
  set_tris_b(0x03);
  Encoder = 0x03;   
  sayac = 0;  
  lcd_gotoxy(1, 1);                 
  lcd_putc("Sayac:");
              while(TRUE)
              {
           
               oldEncoder = Encoder;
               tmp = sayac;   
               lcd_gotoxy(1, 2);               
               printf(lcd_putc,"%d",tmp); 
               if (Encoder == oldEncoder) Encoder = input_b() & 0x03;
               if (input_state(PIN_B1) != input_state(PIN_B0))
               {
               if (input_state(PIN_B0) == input_state(PIN_B1)) if (sayac < 9999) sayac++;
               }
               if (input_state(PIN_B0) != input_state(PIN_B1))
               {
               if (input_state(PIN_B1) == input_state(PIN_B0)) if (sayac > 0) sayac--;
               }
             }
}
Arkadaşlar stabil çalışmıyor. Yardım edermisiniz lütfen...

fagus

Merhaba; benzer problemi kesme kullanarak çözmüştüm.Kodları duty cycle değerini ayarlamak için yazmıştım. İlgili kodları paylaştım. Kolay gelsin.

#int_ext
void encoder()
{
disable_interrupts(INT_EXT);
prev_duty=duty;
data_pos=input(data);
clock_pos=input(clock);


//-------Atlamaları önlemek için
//if(prev_data!=data_pos && prev_clock!=clock_pos)
// {
if(data_pos!=clock_pos && duty!=0)
  {duty=duty-1;
    if(duty>=prev_duty) {duty=prev_duty;}
  }
// }

//if(prev_data==data_pos && prev_clock==clock_pos)
//{
if(data_pos==clock_pos && duty!=200)
  {duty=duty+1;
    if(duty<=prev_duty) {duty=prev_duty;}
  }
//}
//-----------------------------------------------

delay_ms(1);
prev_data=data_pos;
prev_clock=clock_pos;
enable_interrupts(INT_EXT);
}

kudretuzuner

Merhaba,
Bu yazılım dilini bilmiyorum ama bu "#fuses NOMCLR" galiba MCLR pinini kullanılmıyor anlamına geliyorsa bana sorarsanız MCLR pinini TRIS ayarlarında giriş ayarlayıp 10k direnç ile +5 volta bağlayın.Ayrıca 18F4550 nin dataşitine bakarsanız bu MCLR pinin nasıl resetleneceğine dair de değişik bir bağlantı şekli vardır.Kolay gelsin.
Amatör

10f200.h

Dış kesme kullanırsanız daha stabil çalışacaktır.

enteresan10