16X32 RGB Panel hakkında

Başlatan Mucit23, 10 Ekim 2014, 10:56:41

kantirici

Şu elemanın koduna biraz göz attım. Anladığım kadarıyla yapılan iş dataları uarttan alıp panele basmak. Yani pixel işlemleri, hesaplamaları yapılmıyor. 5.000.000 bps baudda uart kurulu ve direk DMA ile veriler alınıyor. Yine anlınan verileri porta DMA ile basılıyor.

Mucit23

O halde bilgisayar olmadan çalışmaz. Ben diyorum birseyler olmalı. Kendi kendimi yiyordum.


Gerçekten bitleri analiz edip teker teker dışarı çıkarıp ayni anda paneli tarayıp pwm uygulamak mikrosilemcilere göre zor bir iş.


Arduino bu işi iyi yapıyor. Adafruit in kütüphanesi fena değil. Orada da hafıza organizasyonu nasıl dizayn etmişler onu anlamadım. O kodu çözebilen oldumu?


Pwm uygulama yöntemi benimkiyle aynı gibi ama hafıza organizasyonunu anlamadım.


Bu konuyu biraz geliştirsem iyi olacak.. Çünkü hafıza organizasyonu benim bitlerle ne kadar ugrasacağımı belirliyor.

kantirici

bence tam ihtiyacın olan şey. eğer panel tarama işlemini sende bu şekilde yaparsan alt tarafta sana çok zaman kalır. o esnada da ilgili işlemleri yaparsın.

gokhangokcen

belki biraz konu dışı olacak ama 2 bacak ile RGB led yapmışlar. Pek detaylı açıklaması yok. Ürün dedikleri gibi enerji sarfiyatı düşük. Bir kaç uygulamada kullandım. ama acil işler olduğu için inceleme fırsatım olmadı. Sizce nasıl çalışıyordur?

http://makroled.com/smart-led-nedir
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Mucit23

Alıntı yapılan: kantirici - 28 Nisan 2017, 08:36:54
bence tam ihtiyacın olan şey. eğer panel tarama işlemini sende bu şekilde yaparsan alt tarafta sana çok zaman kalır. o esnada da ilgili işlemleri yaparsın.

Koda biraz daha baktım ama sanırım tam olarak öyle çalışmıyor. Yani Veriler doğrudan uart'dan gelip ekrana gönderilmiyor. Dediğin gibi uart 5000000 bps ye ayarlı Yüksek hızda veri akışı olup DMA yardımıyla bu veriler uart'a ait bir buffer'a yazılıyor.

Program uart loop içerisinde gelen verileri ayrıştırıp frame buffere yazıyor. Fakat frame buffere yazılırken bir takım karışık işlemler yapılıyor. Muhtemelen benim Bit angle modulation için yaptığım bit ayrıştırma işlemleridir.

Donanımın ayrı bir kısmı ise Timer ile DMA'yı tetikleyip Timer+DMA+GPIO üçü birlikte çalışıp frame bufferin ilgili kısımlarını alıp ekrana gönderiyor.
Sanırım bitlerle ilgili işlemleri frame buffere yazarken yaptığı için ekranla ilgilenirken daha çok vakti oluyor.

Anlamadığım birkaç nokta var. GPIO'dan DMA ile veri gönderirken eş zamanlı olarak panele nasıl clock uyguluyor? Bu kısmı anlayamadım..


Mucit23

Aklıma yeni bir yöntem geldi. Biraz ram fazla gidecek ama kafamdaki seneryo canlanırsa oldukça hızlı çalışır

Mucit23

Bu panelleri kullanmak için güzel bir yöntem geliştirdim. Önceden RGB datalarını tek panel için 16x32 boyutunda ram'de 0x0RGB şeklinde 16 bit olarak tutup Daha sonra ekrana gönderirken bu RGB datalarını ayrıştırıp panele gönderiyordum. Bit Angle Modulation için gerekli olan Maskeleme ve bit manipülasyonları çok fazla vaktimi alıyordu.

Şuanki yöntemimde Göndereceğim RGB dataları için 4 farklı katman kullandım. 4 bit renk çözünürlüğü içi 4 katman.
1. katman ekrandaki tüm pixellere ait renk datalarının sadece 0. bitlerinin bilgisini tutuyor.
2. katman ekrandaki tüm pixellere ait renk datalarının 1. bitlerinin bilgisini tutuyor
3. katman aynı şekilde 2. bitleri
4. katman ise RGB renk datalarının 3. bitleri saklanıyor.

Bu katmanlarda saklanan renk dataları doğrudan panelin anlayacağı şekilde dizili olduğu için hangi katmanı göndereceksem eğer gönderirken hiçbir işlem yapmandan doğrudan hafızadan okuyup panele gönderiyorum. Bu şekilde çok fazla zaman kazandım.

RGB datalarını katmanlara yerleştirme işlemlerini ise Panele veri gönderirken değil diğer boş zamanlarda yaptığım için zaman sorunum olmuyor. Yani her bir Pixele ait RGB datalarını katmanlara yazarken bitlerine ayırıp o şekilde katmanlara yazıyorum. Bu şekilde pixel dataları panelin anlayacağı formata dönüşmüş oluyor.

Önceden Hafızadan pixel datası okuyup bunları ayrıştırıp panelin anlayacağı formata dönüştürmem yaklaşık 82uS sürerken şuanda 30uS sürüyor.
Üstelik DMA kulanmadım. DMA kullanırsam veri aktarımı dahada kısa sürecektir.

Şuanda Tek panel yani 16x32'de 12 bit Renk çözünürlüğü hiçbir sıkıntı olmadan çalışıyor. Hatta renk çözünürlüğünü 15bite'de çıkarabilirim.

Bundan sonra 16x32, 16x64 ve 16x96 deneyeceğim.

Mucit23

#142
Son yaptığım uygulama
https://www.youtube.com/watch?v=EQt0-ViSo8I

3 Adet 16x32 RGB Panel Bağladım. Çözünürlüğüm 16x96, Renk Derinliği ise 12bit yani 4K, Bu haliyle ekran güncelleme hızı yaklaşık 83Hz, Standart bir M3 işlemci videodaki sonucu rahatlıklar verir diye düşünüyorum

Çözünürlük olarak Daha Fazlasına İşlemci hızım yetmiyor. Fakat renk çözünürlüğü düşerse örneğin RGB 333 olsa panel sayımı iki katına çıkarabilirim sanırım. Eğer hiç PWM uygulamadan bana 7 renk yeter diyorsanız o halde kullanılacak olan işlemcinin RAM'ine bağlı olarak Ekran boyutunu baya arttırabiliriz. PWM uygulanmadan 7 renk olarak kullanılırsa 16x32 panel için 256 Byte alan gerekiyor. Renk çözünürlüğü arttıkça kullanılan ram alanı artıyor. Renk çözünürlüğü 4 bit olursa tek panel için 4x256=1Kbyte alan kullanılıyor.

Beni En çok sıkıntıya sokan kısım ekran için ayırdığım belirli bir ram alanını otomatik olarak çok çok hızlı bir şekilde clock sinyali ile birlikte panele yükleyecek bir donanım olmaması. Bazı paralel LCD interface donanımlarını inceledim ama yavaş çalışıyorlar. Bu sorunu mikroişlemcilerde çözersem Bu panellerde video bile oynatırım. Bu tür işleri yapan kartlarda bu yüzden FPGA kullanıyorlar.


HexfeT

#143
SPI donanımında her veri transferinde otomatik çıkış verecek bir GPIO tanımlanabiliyor olması lazım. 42Mbit hız yeterli olursa SPI+DMA+seri paralel çevirici kullanılabilir.
Raspberry Pi için yapılmış bazı TFT ekranlar benzer şekilde çalışıyor. İki adet 74HC4094 Panelin 16 bit paralel arayüzüne bağlanmış ve SPI ile sürülüyor. Şu an kurcaladığım 3.5" LCD bu şekilde.



Mucit23

Hexfet hocam hız yetermi emin değilim. SPI donanımı çok hızlı burada sıkıntı yok. Ufak bir hesap yapalım. Bana 8 bitlik bir Shift register yeterli oluyor. Çünkü Paralel 6 adet data çıkışım var. 6 Adet Data 1 adette clock sinyaline ihtiyacım var.

Tek panel için düşünürsek eğer Her satır için tek seferde 32Byte veri göndermem gerekiyor. Panel sayısı arttıkça tek seferde göndermem gereken veri boyutu artıyor.

Şuanda veri göndermek için basitçe bir for döngüsü kullanıyorum.

   for(i=0;i<32;i++)
   {
      Display_Write(frame_buffer[layeraddress+i]);
      CLK_Write(1);CLK_Write(0);
   }

Bu işlem yaklaşık 30uS sürüyor. Bunu SPI ile yaparsam bu süreden daha kısa sürmesi mümkünmüdür?

Birde Clock üretme işlemini anlamadım. O nasıl olacak?


Mucit23

@kantirici

İnceledim ama açıkçası işin içinden çıkamadım. iki adet DMA kullanmış, Biri LED datasını Panellere taşıyor diğeri ise Timer Counter Değerini prescaller isimli bir değişkene taşıyor. Fakat mantık ne çözemedim dediğim gibi. Gerçi PWM uygulanıyorsa pek fazla seçenek yok. Yöntem aynıdır. Önemli olan donanımı nasıl kullandığı.

Şuan gerçi PWM ile uğraşmıyorum. O konuda donanımım müsade ettiği kadar ilerledim. Şuan PWM'siz yani 7 renk üzerinde çalışıyorum. Büyük boyutlu ekranlarda süper sonuçlar elde ettim. Yakın zamanda yine bir video paylaşıcam

Mucit23

#147
Bu projede geldiğim son nokta. FFT alıp spektrum felan çizdirdim. Basit birkaç animasyon felan yaptırdım. Bu haliyle fazla bir iş yüküde yok.

https://www.youtube.com/watch?v=OiFWJM_rMwE&t=2s
7 Renk olduğu zaman standart 48Mhz üstü her mikroişlemci panelde hatırı sayılır bir hakimiyete sahip olabilir. Ama bu boyutlarda LED lere pwm uygulamak düşük hızlı mikroişlemcilerle çok zor. Ciddi anlamda donanım desteğine ihtiyaç oluyor çünkü bazı işlemleri koddan bağımsız olarak çok hızlı bir şekilde yapmak gerekiyor. Ama 7 renk olduğu zaman ekran dışında diğer işlerle uğraşmaya baya vakit kalıyor.



E-x8


miyago

Sayın HexFEt

Kullandığınız LCD ekranı Türkiye'den temin edebileceğimiz bir yer var mı?

iyi günler