Matris-tuş takımı devresinde hata

Başlatan _MeRKeZ_, 22 Ocak 2013, 14:03:31

_MeRKeZ_

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
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.

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
   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ı

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


Benzetim dosyası

https://hotfile.com/dl/190172535/c015be9/benzetim_dosyas.rar.html