Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: makine_terbiyecisi - 20 Nisan 2016, 19:00:01

Başlık: Taramalı keypad yöntemi programı kasıyor
Gönderen: makine_terbiyecisi - 20 Nisan 2016, 19:00:01
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;
}
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: jrcapa - 20 Nisan 2016, 20:56:14
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.
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: fahri- - 21 Nisan 2016, 09:27:39
Proteusta kasar. Sen devreyi pratik olarak yap. Gerçek ortamda kasma olmayacaktır.
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: makine_terbiyecisi - 21 Nisan 2016, 17:11:15
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 ?
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: 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.
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: makine_terbiyecisi - 22 Nisan 2016, 17:08:41
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..
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: 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.
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: makine_terbiyecisi - 22 Nisan 2016, 20:12:55
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..
Başlık: Ynt: Taramalı keypad yöntemi programı kasıyor
Gönderen: int32 - 14 Ekim 2016, 10:22:23
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.