Taramalı keypad yöntemi programı kasıyor

Başlatan makine_terbiyecisi, 20 Nisan 2016, 19:00:01

makine_terbiyecisi

merhaba arkadaşlar...
Ben dc motor ile hız kontrolü yapacağım..
Keypad ile hız bilgisi alacağım..

Keypadı taramalı yöntem ile taradığımda program çok kasılıyor..
hatta proteus zaman sayacı bile yavaşlıyor..

#int_ext
void pulse_counter(){ // Dis kesme
   pulse++;
}

#int_timer0
void timer(){
   set_timer0(SETT); // Timer. Zaman saymak icin
   flag=0;
   //output_low(pin_e0);
   if(tt>0){
      tt--;
   }
   else{
      //output_high(pin_e0);
      //delay_ms(1000);
      flag=1;
      disable_interrupts (global);
      disable_interrupts(int_timer0);
      disable_interrupts(int_ext);
      tt=100;
   }
}

//************ ANA FONKSIYON *********************
void main(){
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);   // Kullanilmayan birimler
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   set_tris_a(0xFF);
   set_tris_b(0b00000011); // b0-b1 cikis, digerleri giris
   set_tris_c(0b11110000); // c1,c2 cikis
   set_tris_d(0x00); // komple cikis
   set_tris_e(0x00);
   
   output_a(0x00);  //A pinleri sifirla
   output_b(0x00); // B pinleri sifirla
   output_c(0x00); // C pinleri sifirla
   output_d(0x00); // D pinleri sifirla
   output_e(0x00);
   
   setup_CCP1(CCP_PWM); // PWM modulu timer2 zamanlayicisini kullanir.
   setup_CCP2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_16,255,1);
   set_pwm1_duty(0); // PWM1 cikis gorev cevrimi-SAAT TERSI
   set_pwm2_duty(0); // PWM2 cikis gorev cevrimi-SAAT YONU
   
   
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_timer0);
   enable_interrupts(GLOBAL);
   set_timer0(SETT);
   ext_int_edge(H_TO_L);
   
   lcd_init(); // lcd hazirlaniyor
   lcd_gotoxy(1,1);
   printf(lcd_putc,"\fONCE *'A BAS!");
   
    while(TRUE){     
      deger=keypad_tara(); // Keypad tara
      hiz_bilgisi(deger); // Keypad sayilarini basamakli sayiya cevir

      if(flag){ // timer0 kesmesi olustuysa flag=1 ise
        devir=((float)pulse/encoder)*60; //Enkoder devir hesabi
         if(input(pin_b1)){ //Yon Kontrolu
            lcd_clear2();
            printf(lcd_putc,"mHiz=+%.0f rpm",devir);
            //printf(lcd_putc,"pulse: %d",pulse);
         }else{
            lcd_clear2();
            printf(lcd_putc,"mHiz=-%.0f rpm",devir);
            //printf(lcd_putc,"pulse: %d",pulse);
         }
         enable_interrupts(INT_EXT);
         enable_interrupts(INT_timer0);
         enable_interrupts(GLOBAL);
         ext_int_edge(H_TO_L);
         set_timer0(SETT);
         pulse=0;
         devir=0;
         tt=100;
         flag=0;
      }
   }

}

//*********** KEYPAD TARAMA FONKSIYONU    ************
keypad_tara(){
   tus=0;
   output_high(sat1);
   if(input(sut1)){ while(input(sut1)); tus=1; }
   if(input(sut2)){ while(input(sut2)); tus=2; }
   if(input(sut3)){ while(input(sut3)); tus=3; }
   output_low(sat1);
   
   output_high(sat2);
   if(input(sut1)){ while(input(sut1)); tus=4; }
   if(input(sut2)){ while(input(sut2)); tus=5; }
   if(input(sut3)){ while(input(sut3)); tus=6; }
   output_low(sat2);
   
   output_high(sat3);
   if(input(sut1)){ while(input(sut1)); tus=7; }
   if(input(sut2)){ while(input(sut2)); tus=8; }
   if(input(sut3)){ while(input(sut3)); tus=9; }
   output_low(sat3);
   
   output_high(sat4);
   if(input(sut1)){ while(input(sut1)); tus=14; }
   if(input(sut2)){ while(input(sut2)); tus=10; }
   if(input(sut3)){ while(input(sut3)); tus=15; }
   output_low(sat4);
  
   return tus;
}
# ÖĞRENELİM, ÖĞRETELİM #

jrcapa

Merhaba. Sonsuz döngü içerisinde sanki sürekli tuşlara basılıyormuş gibi tarama yapıyorsunuz. Bunun yerine herhangi bir tuşa basıldığını anlayıp sonra tarama yapın ve hız bilgisini alın.

fahri-

Proteusta kasar. Sen devreyi pratik olarak yap. Gerçek ortamda kasma olmayacaktır.

makine_terbiyecisi

Alıntı yapılan: fahri- - 21 Nisan 2016, 09:27:39
Proteusta kasar. Sen devreyi pratik olarak yap. Gerçek ortamda kasma olmayacaktır.
taramalı keypad yapınca proteusdaki zaman yavaşlıyor. yani zaman çok yavaşlıyor. 1sn, 10sn gibi sürüyor..
Baskı devreye geçince aynı sorun devam eder mi ?
# ÖĞRENELİM, ÖĞRETELİM #

fahri-

Etmez. Hiç bir sıkıntı olmaz. Senin PC simülasyonu real time yapamıyor. Hızı yetmiyor. Ama gerçek devrede bu olay olmaz.

makine_terbiyecisi

Alıntı yapılan: fahri- - 22 Nisan 2016, 10:06:10
Etmez. Hiç bir sıkıntı olmaz. Senin PC simülasyonu real time yapamıyor. Hızı yetmiyor. Ama gerçek devrede bu olay olmaz.
Çok teşekkür ederim..
# ÖĞRENELİM, ÖĞRETELİM #

RaMu

Dirençlere çift tıkla,
MODEL TYPE yazan yerin karşısında DIGITAL i seç,
biraz daha hızlanır.

Isis de simulasyon zamanı yavaş çalışsa dahi,
gösterdiği zamanda gerçekte ne işi yapacaksa simulasyondada o işi yapar,
yani:
misal program çalışmaya başladıktan tam 1 saniye sonra bir ledin yanmasını sağlıyor olsun,
simulasyon, başlatıldıktan, gerçek zamana göre 10 dk sonra bile ancak led yakma işini simule edebiliyor olsa,
led yakıldığı anda, simulasyon zamanı 1 saniyeyi gösteriyor olur,
gerçekte ne kadar zaman geçtiğinin önemi yoktur,
kodun işlediği zaman simulasyon gösterge zamanıdır.

Isis bazen kasar, gerçekte denemekte fayda var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

makine_terbiyecisi

Alıntı yapılan: RaMu - 22 Nisan 2016, 19:46:47
Dirençlere çift tıkla,
MODEL TYPE yazan yerin karşısında DIGITAL i seç,
biraz daha hızlanır.

Isis de simulasyon zamanı yavaş çalışsa dahi,
gösterdiği zamanda gerçekte ne işi yapacaksa simulasyondada o işi yapar,
yani:
misal program çalışmaya başladıktan tam 1 saniye sonra bir ledin yanmasını sağlıyor olsun,
simulasyon, başlatıldıktan, gerçek zamana göre 10 dk sonra bile ancak led yakma işini simule edebiliyor olsa,
led yakıldığı anda, simulasyon zamanı 1 saniyeyi gösteriyor olur,
gerçekte ne kadar zaman geçtiğinin önemi yoktur,
kodun işlediği zaman simulasyon gösterge zamanıdır.

Isis bazen kasar, gerçekte denemekte fayda var.
Yanıtınız için teşekkür ederim..
Dediğinizi deneyeceğim..
# ÖĞRENELİM, ÖĞRETELİM #

int32

Ana döngünün her turunda deger=keypad_tara(); fonksiyonuyla tarama fonksiyonuna giriyorsunuz. Bu kadar hızlı bir taramaya gerek yok. 20ms'de 1 kere girmesi yeterli. Ana döngünün en başına 20ms'lik bir delay ekleyebilirsiniz.Yok eğer döngü çok hızlı olmalı diyorsanız, tarama fonksiyonunu;

int i;
if(++i > 100)
{
     deger=keypad_tara();
     i = 0;
}

gibi 100 turda bir kere girecek şekilde ayarlayabilirsiniz.