Yüksek hızlı pic önerisi?

Başlatan Nedenler, 30 Temmuz 2013, 13:51:07

Nedenler

18F452 ile P10 panel kontrolü yapıyorum.
10Mhz x4PLL ile 10 MIPS hızında çalışıyor Pic.
Fakat panel yenilemelerinde gözle görülür bir kıpırdama oluyor. Bunun önüne geçmek için daha yüksek hızlarda çalışan, programda minimum değişiklikle kullanabileceğim ve Karaköy piyasasında rahat bulunabilecek bir pic önerisine ihtiyacım var. Microchip'in sitesinde maksimum 16 MIPS çalışan picler gördüm fakat kullanım/bulunabilirlikleri hakkında fikrim yok.

bymrz

pic18f25K22 yi bulabilirsin hocam muhtemelen. 64MHZ hızda çalışıyor... Ayrıca dahili osilatörlü(16x4)... Kristal maliyetinden de kurtarıyor... Hem de ucuz...

Mucit23

Hocam Bende P10 Panel kullanıyorum. 18F452 yi 40Mhz de çalıştırıyorum. Hızda hiçbir sıkıntı çekmiyorum şuanda. Sadece ilk başlarda Yazı kaydırma işlemlerinde biraz sıkıntı çektim ondada kaydırma mantığını değiştirerek aştım.

Ben şimdilik tek bir panel kullanıyorum. Ama 4-5 panele kadar sıkıntı olacağını sanmıyorum.

Paneli sürmek için nasıl bir mantık kullandınız? Paneli Nasıl Tarıyorsunuz? Panel Tarama süreniz nekadar? Donanımsal Spi kullanıyormusunuz? Bu kısımlar biraz önemli.

Nedenler

Ben kaydırma yapmıyorum. PLC'den gönderdiğim 0-99.99 aralığındaki değeri sabit olarak gösteriyorum saniyede 1 defa yenileyerek.

Büyük bir font dosyasına ihtiyaç duymadığım için kendim 11x7 boyutunda bu 10 rakamı, noktayı ve yüzde işaretini tanıtıp dizilerde sakladım.

Değerleri XX.X ya da X.XX şeklinde gösterdiğim için karakterlerin yerleri de sabit.

Gelen sayıyı basamaklarına ayırıp basamakların sayı değerlerine karşılık gelen karakter datasını 32 bitlik değerlere sırasıyla aktarıyorum. 16 satırın 32 bitlik 0 veya 1 değerleri böylece elimde oluyor. Ondan sonra da bu değerleri olması gereken bölgelere karşılık gelecek şekilde sırasıyla gönderiyorum.
Gönderme işlemini de normal bir pin çıkışını 0 veya 1 olarak ayarlamak suretiyle yapıyorum.

Sonuçta paneli taradığım her 1 saniyede abes olmamakla beraber çok hafif bir kıpırdama oluyor. Tabi bu kıpırdama yine de müşteri açısından kabul edilebilir bir şey değil.

Mucit23

Hızlı pice gerek yok. 40Mhz Yaptığınız işlem için Gayet yeterli bir hız. Titreme olmasının sebebi program mantığınızla ilgili sanırım.

Hocam Displayi şöyle sürün.

İlk Önce Kesinlikle Donanımsal Spi yi çalıştırın. Displaye Tek seferde 16Byte data yüklemeniz gerekiyor. Yazılımsal spi ile 16Byte datanın yüklenmesi 72us civarı sürüyor. Yazılımsal spi ile bu süre 600us yi geçiyor.

Display için işlemcinin  Raminde bir bölge ayırın. Burada bu ram bölgesini Kesme ile sürekli ekrana göndermeniz gerekecek. Siz bir işlem yapmak istediğinizde direk display için ayırdığınız ram bölgesinin ilgili alanına yazma yapacaksınız. Ekrana veri gönderme display tarama vs gibi işlemlerle uğraşmayın.

Ben Ram bölgesini ekranda şöyle paylaştırdım. 

resim
Resimden sanırım ekran yapısı anlaşılır.

Timer0 Kesmesi ile bu ram alanını ekrana yansıttım.

Kesme alt programım bu şekilde
void Timer0_int(){
set_timer0(133);                         //800us Gecikme için Timer kuruluyor..
switch (int_syc)   //Her 800us de Bir bir sonraki satıra Geç
{
case 0:
     output_low(PinOE);write_data(int_syc);
     output_low(PinA);output_low(PinB);output_high(PinOE);
     break;
case 1:
     output_low(PinOE);write_data(int_syc);
     output_high(PinA);output_low(PinB);output_high(PinOE);
     break;
case 2:
     output_low(PinOE);write_data(int_syc);
     output_low(PinA);output_high(PinB);output_high(PinOE);
     break;
case 3:
     output_low(PinOE);write_data(int_syc);
     output_high(PinA);output_high(PinB);output_high(PinOE);
     break;
}
int_syc++;if(int_syc>3)int_syc=0;
}


Burada ise Spi ile gönderme fonksiyonum var.  Her kesme oluştuğunda program buraya gelip ramin ilgili alanını ekrana gönderir.

void write_data(unsigned int8 row_adr)
{
   int8 i=0,j=0;
   int8 k=3;
   while(k!=255)                                   // Bu Döngü ileriye doğru sayarsa panel sağdan 
   {j=15-k;                                        // Sola Doğru yüklenir. 
     for (i=0;i<4;i++)                             // Satırlar dolduruluyor..
     {
       spi_write(display_ram[j][row_adr]);
       j-=4;
     }
     k--;
   }
   output_high(LATCH);
   delay_cycles(2);
   output_low(LATCH);
}


Mantık çok basit. Biraz inceleyerek işi çözebilirsin. Bundan sonra yukarıda verdiğim excell resmindeki tabloya göre ram alanında oynayarak ekranda istediğini yapabilirsin.
Ben böyle bir mantık kullandım. İyi çalışıyor.

Nedenler

Doğru söylüyorsun. Şu an oruç başıma vurmuş durumda kendime geleyim inceleyeceğim :)
Sağolun arkadaşlar.