Matris-tuş takımı devresinde hata

_MeRKeZ_

Üye
Katılım
30 May 2011
Mesajlar
44
Puanları
1
Yaş
31
Merhaba arkadaşlar


Tuş takımı ve matristen oluşan devremde, bastığım tuşa göre matriste harf çıkmasını istiyorum. Fakat yapmak istediğim projeden dolayı bu harfleri bir diziye kaydetip daha sonra sırayla gösterilmelerini istiyorum. Bir miktar ilerleme katettim ama şu anda ‘gerçek zamanlı çalışamama’ hatası alıyorum.
Aşağıda, hangi tuşa basıldığını belirliyor ve o tuşa denk gelen harfi oluşturduğum diziye atıyorum
Kod:
void tustakimi_oku() // Fonksiyon ismi
{
   kontrol_3=0;
   y=1;
  
   output_d(0x00); // D portu çıkışı sıfırlanıyor


   output_high(pin_d4); // 1. satır lojik-1 yapılıyor
   if (input(pin_d0))   // 1. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=kontrol;
         yak_sondur();
      }


    else  if (input(pin_d1))   // 2. sütun okunuyor
      {
     
         delay_ms(20);
         kontrol_2++;
         tus=3+kontrol;
         yak_sondur();
     
      }
     
   else if (input(pin_d2))   // 3. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=6+kontrol;
         yak_sondur(); 
      }
 
     
   output_low(pin_d4); // 1. satır lojik-0 yapılıyor
   output_high(pin_d5); // 2. satır lojik-1 yapılıyor
   if (input(pin_d0))   // 1. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=9+kontrol;
         yak_sondur();
      }
     
   else if (input(pin_d1))   // 2. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=12+kontrol;
         yak_sondur();
      }
     
   else if (input(pin_d2))   // 3. sütun okunuyor
      {
     
         delay_ms(20);
         kontrol_2++;
         tus=15+kontrol;
         yak_sondur();
      }
 
   output_low(pin_d5); // 2. satır lojik-0 yapılıyor
   output_high(pin_d6); // 3. satır lojik-1 yapılıyor
  
   if (input(pin_d0))   // 1. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=18+kontrol;
         yak_sondur();
      }
     
   else if (input(pin_d1))   // 2. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=21+kontrol;
         yak_sondur();
      }
     
   else if (input(pin_d2))   // 3. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=24+kontrol;
         yak_sondur();
      }
    
 
   output_low(pin_d6); // 3. satır lojik-0 yapılıyor


   output_high(pin_d7); // 3. satır lojik-1 yapılıyor
   if (input(pin_d0))   // 1. sütun okunuyor
      {
         y=0;
        
         delay_ms(20);
         if(kontrol==0)
         {
            kontrol=1;
            output_e(0x01);
         }
         else if(kontrol==1)
         {
            kontrol=2;
            output_e(0x03);
         }
         else if(kontrol==2)
         {
            kontrol=0;
            output_e(0x00);
         }
           
      }
   else if (input(pin_d1))   // 2. sütun okunuyor
      {
         delay_ms(20);
         kontrol_2++;
         tus=27+kontrol;
         yak_sondur();
      }
   else if (input(pin_d2))   // 3. sütun okunuyor
      {
         delay_ms(20);
         y=0;
         output_high(pin_a5);
         delay_ms(500);
         output_low(pin_a5);
        
         kontrol_3=1;
      }
   output_low(pin_d7); // 3. satır lojik-0 yapılıyor
  
  
   if(y==1)
   {
      if(kontrol_2<18)
      {
         if(tus>14)
         {
            for(i=0;i<5;i++)
            {
               dizi[((kontrol_2-1)*5)+i]=metin_2[(tus*5)-75+i];
            }
         }
         else
         {
            for(i=0;i<5;i++)
            {
               dizi[((kontrol_2-1)*5)+i]=metin[(tus*5)+i];
            }
         }
              
      }
     
      else if(kontrol_2>=18)
      {
         if(tus>14)
         {
            for(i=0;i<5;i++)
            {
               dizi_2[((kontrol_2-1)*5)-85+i]=metin_2[(tus*5)-75+i];
            }
         }
         else
         {
            for(i=0;i<5;i++)
            {
               dizi_2[((kontrol_2-1)*5)-85+i]=metin[(tus*5)+i];
            }
         }
      }
   }
  
  
   if(kontrol_3==1)
      {
        delay_ms(20);
        yazdir_2();
      }
  
     
}


Bu kısımda deneme amaçlı sadece 0. Elemandan 5. Elemana kadar olan harflerin gösterilmesini istedim.


Kod:
void yazdir_2()
{
      for(tekrar=0;tekrar<100;tekrar++)
            {
               for(x=0;x<5;x++)
               {
                  deger= x%5;
                  output_c(sutunsec(deger));
                  output_b(dizi[x]);
               }
            }
           
            output_c(0x00);
}




Tanımlamalar
Kod:
   char metin[]=
{
   0x03,0x75,0x76,0x75,0X03 //A
   0x00,0X36,0X36,0x36,0X49 //B
   0x41,0x3E,0x3E,0x3E,0x5D //C
   0xE1,0xDE,0x9E,0xDE,0xED //Ç
   0x00,0x3E,0x3E,0xDD,0xE3 //D
   0x00,0xB6,0xB6,0xB6,0xBE //E
   0x00,0xF6,0xF6,0xF6,0xF6 //F
   0x00,0xBE,0xB6,0xB6,0x86 //G
   0x83,0xBA,0xAA,0xAA,0x8B //Ğ
   0x00,0xF7,0xF7,0xF7,0x00 //H
   0xFF,0xFF,0x00,0xFF,0xFF //I
   0xFF,0xFF,0x82,0xFF,0xFF //İ
   0xCF,0xBF,0xBF,0xBF,0xC0 //J
   0x00,0xEB,0xDD,0xBE,0xFF //K
   0x00,0xBF,0xBF,0xBF,0xBF //L
};


char metin_2[]=
{
   0x00,0xFD,0xFB,0xFD,0x00 //M
   0x81,0xFB,0xF7,0xEF,0xC0 //N
   0xE3,0xDD,0xBE,0xDD,0xE3 //O
   0xC7,0xBA,0xBB,0xBA,0xC7 //Ö
   0x00,0xF6,0xF6,0xF6,0xF0 //P
   0x00,0xE6,0xD6,0xB0,0xFF //R
   0xD9,0xB6,0xB6,0xB6,0xCD //S
   0xD9,0xB6,0x96,0xB6,0xCD //Ş
   0xFE,0xFE,0x00,0xFE,0xFE //T
   0X00,0xBF,0xBF,0xBF,0x00 //U
   0x83,0xBE,0xBF,0xBE,0x83 //Ü
   0xE0,0xDF,0xBF,0xDF,0xE0 //V
   0xFE,0xFD,0x03,0xFD,0xFE //Y
   0x9E,0xAE,0xB6,0xBA,0xBC //Z
   0xFF,0xFF,0xFF,0xFF,0xFF //boşluk
  
};






char dizi[90];
char dizi_2[30];




Main kısmı


Kod:
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ışı
  
   set_tris_a(0x01);
   set_tris_b(0x00);   // B portu komple çıkış
   set_tris_c(0x00);   // B portu komple çıkış
   set_tris_d(0x0F);   // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş
  
   output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor


   while(1)  // Sonsuz döngü
   {
      tustakimi_oku();
   }
}




Benzetim (simülasyon) dosyasında da görüldüğü gibi devre düzgün bir şekilde çalışmıyor. Olağan şartlarda, herhangi bir harfe basıp akabinde kareye bastığımızda o harfin kaybolmaksızın gözükmesi gerekirdi. Sanırım bunun sebebi ISIS’in de belirttiği gibi “Aşırı cpu kullanımı dolayısıyla gerçek zamanlı çalışamama sorunu” %78 oranında RAM, %12 oranında ROM kullanıyorum. Sıkıntı bundan mı kaynaklanıyor? Eğer bundansa, nasıl düzeltebilirim? Ne önerirsiniz?


Teşekkürler
 
Pek yardımım dokunmayacak ama birşeyler söyleyeyim, öncelikle devreyi indirip denedim yazılım dilinden anlamadığım için program hakkında birşey söyleyemeyeceğim. Evet simülasyon cpu yu çok tüketiyor ama problem bundan kaynaklanmıyor bence yazılımda hata var, ayrıca cpu kullanımını %15 lere düşürmek için yapılması gerekeni söyleyeyim ki sizin devreniz için denedim, kullandığınız tüm dirençleri tektek digital yapın üzerine çift tıklayınca çıkan pencerede model type seçeneğinden ayarlayabilirsiniz.
 
deneme amaçlı yazdıgın kodda hiç delay vermemissin? Ne yazsa göremiyeceksin , önce deneme amaçlıda ki o beş harfi görelim , sonrası kolay. Ama kurdugun karakter mantıgının başarılı bir şekilde çalişması gerekir , doğru diye düşünüyorum
 
Pek yardımım dokunmayacak ama birşeyler söyleyeyim, öncelikle devreyi indirip denedim yazılım dilinden anlamadığım için program hakkında birşey söyleyemeyeceğim. Evet simülasyon cpu yu çok tüketiyor ama problem bundan kaynaklanmıyor bence yazılımda hata var, ayrıca cpu kullanımını %15 lere düşürmek için yapılması gerekeni söyleyeyim ki sizin devreniz için denedim, kullandığınız tüm dirençleri tektek digital yapın üzerine çift tıklayınca çıkan pencerede model type seçeneğinden ayarlayabilirsiniz.


Hocam o gerçek zamanlı çalışmama sorunu düzeldi. Peki bu sorun devre üzerinde normal dirençleri kullandığım zaman da gerçekleşir mi?


deneme amaçlı yazdıgın kodda hiç delay vermemissin? Ne yazsa göremiyeceksin , önce deneme amaçlıda ki o beş harfi görelim , sonrası kolay. Ama kurdugun karakter mantıgının başarılı bir şekilde çalişması gerekir , doğru diye düşünüyorum


delay derken?
 
dijital yapma isis için, normal devrede bir etkisi yoktur, problem olmaz fakat isiste çalışan devre normalde çalışır-çalışacak diye birşey veya tamtersi gibi birşey sözkonusu değildir, o yüzden isisle fazla zaman kaybetmeden gerçek devreyi kurup deneme yapmanız faydalı olur. Delay-gecikme-bekleme.
 
4MHZ de çalişan bir pic bir komutu 1 uS de işler.
Dolayısıyla 1us de sen 5 harfi yazdırsanda gözün bunu algılayamaz gölge gibi birşey görürsün.
Her harfi yazdırdıktan sonra delay_ms(1000); yazarsan 1000ms yani bir saniye bekleme alırsın.
Bu da senin harfi algılamanı sağlar.
 

Yeni mesajlar

Forum istatistikleri

Konular
128,217
Mesajlar
915,879
Kullanıcılar
449,998
Son üye
Muharrem_Arslan

Yeni konular

Geri
Üst