enocder sayarken 5000 aşagıya dogru sayım yapıyor?

Başlatan ota, 08 Ocak 2019, 11:18:32

ota

aşağıda kodu verdigim projede encoder sayımında sıkıntı yaşıyorum enkoder 1 sayısından başlıyacagına 5000 den başlayıp aşagıya dogru sayım yapmaktadır.Enkoderi  PORTB kesmesi içinde sayıyorum.
KOD;
*******************************************KOD**********************************************************
#include <16F877A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
//**********************PORT YONLENDİRME***********************
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
//****************************************************************
#define dig_1 pin_a0
#define dig_2 pin_a1
#define dig_3 pin_a2
#define dig_4 pin_a3

#define sat1 pin_d0
#define sat2 pin_d1
#define sat3 pin_d2
#define sat4 pin_d3
#define sut1 pin_d4
#define sut2 pin_d5
#define sut3 pin_d6

#define in1 pin_b0
#define in2 pin_b1
#define ena pin_b2
#define enb pin_b3
#define encoder_a pin_b4
#define encoder_b pin_b5

unsigned int16 birler = 0 , onlar = 0 , yuzler = 0 , binler = 0 ;
unsigned int16 encoder_sayi = 0;
unsigned int16 state = 0;
unsigned int16 last_state = 0;
int16 tus_girilen = 0;
int eski_tus_girilen = 0;
int sayici = 0;
int encoder_mm = 0;
//****************ORTAK KATOT DİSPLAY İÇİN********************
const int digit[10] = { 0b01111111 , 0b00000110 , 0b10111011 , 0b10011111 , 0b11000110 , 0b11011101 ,0b11110101 , 0b00000111 , 0b11111111 , 0b11011111 };

#int_RB
void encoder_sayac()
{
   state = input_state(encoder_a);
   if (state != last_state)
   {
      if (input_state(encoder_b) != state)
      {
         encoder_sayi ++;
      }
      else
      {
         encoder_sayi --;
      }
   }
   last_state = state; 
}

void encoder_dur()
{
   output_high(ena);
   output_low(enb);
   output_low(in1);
   output_low(in2);
}

void encoder_git()
{
   
   if(tus_girilen >= encoder_mm)
   {
      output_high(ena);
      output_low(enb);
      output_low(in1);
      output_high(in2);
   }
   if(tus_girilen <= encoder_mm)
   {
      output_high(ena);
      output_low(enb);
      output_high(in1);
      output_low(in2);
   }
   if(tus_girilen == encoder_mm)
   {
      encoder_dur();
   }
}

void seven_segment()
{
      enable_interrupts(INT_RB);  // INT_EXT kesmesini aktif yapar
      enable_interrupts(GLOBAL);// Aktif edilen kesmelere izin ver
     
      output_a(0b00001000);
      output_c(digit[birler]);
      delay_ms(2);
      output_a(0b00000000);     
      output_a(0b00000100);
      output_c(digit[onlar]);
      delay_ms(2);
      output_a(0b00000000);     
      output_a(0b00000010);
      output_c(digit[yuzler]);
      delay_ms(2);
      output_a(0b00000000);     
      output_a(0b00000001);
      output_c(digit[binler]);
      delay_ms(2);
      output_a(0b00000000);
}

char tus_takim()
{
   sayici++;
   output_d(0x00);   
   output_high(sat1);
   if(input(sut1))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 1;
         sayici = 0;
      }
      while(input(sut1))
      {
         seven_segment();
      }
   }
   if(input(sut2))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 2;
         sayici = 0;
      }
      while(input(sut2))
      {
         seven_segment();
      }
   }
   if(input(sut3))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 3;
         sayici = 0;
      }
      while(input(sut3))
      {
         seven_segment();
      }
   }
   output_low(sat1);
   output_high(sat2);
   if(input(sut1))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 4;
         sayici = 0;
      }
      while(input(sut1))
      {
         seven_segment();
      }
   }
   if(input(sut2))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 5;
         sayici = 0;
      }
      while(input(sut2))
      {
         seven_segment();
      }
   }
   if(input(sut3))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 6;
         sayici = 0;
      }
      while(input(sut3))
      {
         seven_segment();
      }
   }
   output_low(sat2);
   output_high(sat3);
   if(input(sut1))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 7;
         sayici = 0;
      }
      while(input(sut1))
      {
         seven_segment();
      }
   }
   if(input(sut2))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 8;
         sayici = 0;
      }
      while(input(sut2))
      {
         seven_segment();
      }
   }
   if(input(sut3))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 9;
         sayici = 0;
      }
      while(input(sut3))
      {
         seven_segment();
      }
   }
   output_low(sat3);
   output_high(sat4);
   if(input(sut1))
   {
      delay_ms(5);
      tus_girilen = 0;
      sayici = 0;
      while(input(sut1))
      {
         seven_segment();
      }
   }
   if(input(sut2))
   {
      delay_ms(5);
      if(tus_girilen < 1000)
      {
         tus_girilen = tus_girilen *10 + 0;
         sayici = 0;
      }
      while(input(sut2))
      {
         seven_segment();seven_segment();
      } 
           
   }
   if(input(sut3))
   {
      delay_ms(5);
      sayici = 0;
      eski_tus_girilen = tus_girilen;
      encoder_git();
      while(input(sut3))
      {
         seven_segment();
      }   
   }
   output_low(sat4);   
   if(sayici >= 90)
   {
      tus_girilen = eski_tus_girilen;
   }
}

void main()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0X00); //a portu cıkıs
   set_tris_b(0xF0); //b portu cıkıs
   set_tris_c(0x00); //display
   set_tris_d(0xf0);
   output_b(0xF0);// B portu çıkışı ilk anda sıfırlanıyor
   output_low(dig_1);
   output_low(dig_2);
   output_low(dig_3);
   output_low(dig_4);
   encoder_sayi = 0;
   while(1)
   {
      enable_interrupts(INT_RB);  // INT_EXT kesmesini aktif yapar
      enable_interrupts(GLOBAL);// Aktif edilen kesmelere izin ver
      tus_takim();
      //***************************degerler hesaplanıyor*************************
      birler = (encoder_sayi  % 10);
      onlar = ((encoder_sayi / 10) %10);
      yuzler = ((encoder_sayi / 100) %10 );
      binler = (encoder_sayi / 1000 % 10);

      //*********************display'e yazdırılıyor************************         
      output_a(0b00001000);
      output_c(digit[birler]);
      delay_ms(2);
      output_a(0b00000000);
     
      output_a(0b00000100);
      output_c(digit[onlar]);
      delay_ms(2);
      output_a(0b00000000);
     
      output_a(0b00000010);
      output_c(digit[yuzler]);
      delay_ms(2);
      output_a(0b00000000);
     
      output_a(0b00000001);
      output_c(digit[binler]);
      delay_ms(2);

      output_a(0b00000000);     
   }
}

ete

Belliki yön hesabın yanlış. Çözümü kolay ancak neden 5000 den aşağı sayıyor orasını anlamadım.
if (input_state(encoder_b) != state)
      {
         encoder_sayi ++;
      }
      else
      {
         encoder_sayi --;
komut satırlarında
encoder_sayi ++; satırı ile encoder_sayi --; satırlarının yerlerini değiştir. Tekrar dene bakalım.
Ete

ota

enkoder şimdi dogru çalışıyor fakat motoru durduramıyorum nasıl yapabilirim?

#int_RB
void encoder_sayac()
{
   state = input_state(encoder_a);
   if (state != last_state)
   {
      if (input_state(encoder_b) != state)
      {
         encoder_sayi --;
      }
      else
      {
         encoder_sayi ++;
      }
   }
   last_state = state; 
}

void encoder_dur()
{
   output_high(ena);
   output_low(enb);
   output_low(in1);
   output_low(in2);
}

void encoder_git()
{
   
   if(tus_girilen <= encoder_sayi)
   {
      output_high(ena);
      output_low(enb);
      output_low(in1);
      output_high(in2);
   }
   if(tus_girilen >= encoder_sayi)
   {
      output_high(ena);
      output_low(enb);
      output_high(in1);
      output_low(in2);
   }
   if(tus_girilen == encoder_sayi)
   {
      encoder_dur();
   }
}

ete

Yeterli bilgi vermeden motoru nasıl durduracağım diye sormak yanlış. Neyle sürüyorsun bilmiyoruz. Ancak programınabakıp tahmine bulunmak gerekiyor.
Programa bakılırsa bir motor sürücü entegresi kullanıyorsun. Bu entegrenin enable girişleri ve bir de moora harket verdiren input girişleri var.
Genelde Enable girişleri Aktif LOW dur yani LOW yapınca motorun pasif olması gerekir. Buna yardımcı olmak için İnput girişlerinede LOW vermen gerekir.
output_low(enb);
output_low(in1);
output_low(in2);
bu üç komut satırının o motoru durdurması gerekir.

Ete

Powered by EzPortal