16X32 RGB Panel hakkında

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

M_B

@Mucit23 hocam;
uygulamanızda bir gelişme var mı?  Şu an bende bu uygulama ile ilgileniyorum. P6 panel ve TF-C3U kartından temin ettim.
TF-C3U kartını test ve deneme yapmak icin kullanıyorum. P6 paneli STM ile çalıştırmak istiyorum.
Test aşamasında arduino mega ile adafruit.com sitesindeki uygulamaları çalıştırdım.  Kodlarını inceledim ama tam manasıyla anlayamadım.
Nerden ve nasıl başlamalıyım.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Durum en son gönderdiğim videodaki gibi. Hocam iş okul derken kafamı kaşıyacak vakit bulamıyorum :'( :'( Tam final haftasindayım okul beni gercekten yoruyor.

Vakit bulupta uğraşırım diye deney düzeneğini bile bozmamışım. Beni bekliyor.

Teknik olarak geldigim noktada ise durum şöyle.

Çözemedim daha dogrusu nasıl yapacağımı bilmediğim birkaç nokta var. Onceki mesajlarımda yazmıştım. Bunları çözersem devam edecegim.

Ama arduino kodundan mutlaka fikir almam lazım.  O kodu yazanlar bu işi cok iyi bir şekilde cozduklerini düşünüyorum.  Kodu gerçekten cok inceledim ama tam olarak hangi işlemler yapıldığını anlayamadım.  Aslinda arduino mega bendede var ama arduinoyu pek iyi bilmiyorum. Bi ara kodlari denemeyi düşündüm ama Arduino icin yazılmış kütüphaneyi derleyemedim. Bi sürü hata verdi. Pek uğraşmadan tekrar STM ye döndüm. En son zaten orada kaldi. Aslında ramazanda ugrasabilirim.  Yalnız arduino kodunun nasil çalıştığını anlamam lazım.  Siz bu konuda ilerleme kaydedebildinizmi?

M_B

@Mucit23 Hocam;
Arduino kodunu  inceliyorum.

// -------------------- Interrupt handler stuff --------------------

ISR(TIMER1_OVF_vect, ISR_BLOCK) { // ISR_BLOCK important -- see notes later
  activePanel->updateDisplay();   // Call refresh func for active display
  TIFR1 |= TOV1;                  // Clear Timer1 interrupt flag
}

Tarama ve renk geçişleri icin  timer interrup kullanmış.
updateDisplay() fonksiyonunda ilgi ceken kısımlar ise

#define CALLOVERHEAD 60   // Actual value measured = 56
#define LOOPTIME     200  // Actual value measured = 188

 t = (nRows > 8) ? LOOPTIME : (LOOPTIME * 2);
  duration = ((t + CALLOVERHEAD * 2) << plane) - CALLOVERHEAD;


Her bu fonksiyona geldikce Timer degeri değişiyor.
ptr = (uint8_t *)buffptr;

  ICR1      = duration; // Set interval for next interrupt
  TCNT1     = 0;        // Restart interrupt timer
  *oeport  &= ~oepin;   // Re-enable output
  *latport &= ~latpin;  // Latch down

Fonksiyonun devamında ise her clock palsinde verileri  PORTA ya gönderiyor.   PORTA da R1-R2, B1-B2 ve G1-G2 renk ucları var.
Renk olusumu icin  daha oncede verilen link iyice incelenmeli ve anlaşılmalı ordaki mantık kullanılmış
http://www.batsocks.co.uk/readme/art_bcm_3.htm

Eger Paneli standart bir kayan (8x32 Tek modul alt sutun harıc )yazı mantığı ile süreceksek kolay ilk uygulamayı arduino ile yaptım. ( Tek harf icin )
Üzerinde calışmalarım sürüyor.



İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Bende ilk fırsatta konsantre olup tekrardan konuya odaklanmayi düşünüyorum.  STM32 aynısını daha hızlı bir şekilde yapabilmem lazım. 

Acaba arduino kodunda veri yapısı nasıl? Yani veri paketlerini 6 ayrı data olarak nasıl panele gönderiyor.  Benim için en önemli kısım burası. Veri paketlerini hızlı bir şekilde göndermede problem yaşıyordum. Yani okadar hizli olmasi lazimki ornegin t sürede bütün verilerin 1. Biti panele yuklenirken t×8 sürede 8. Bit panele yüklenmesi gerekir.

Panelde 8 satır var her bir satır 2ms aktif olsa toplamda 16ms eder. Yani tazeleme frekansı 62.5hz olur.

işte seri olarak veri gonderirken toplamda  t×8 + tx7 + tx6 + t×5 + tx4 + tx3 + tx2 + tx1  süreleri 2ms yi aşaması gerekiyor.  İşte burada olay kopuyor.  Bunu hızlı bir şekilde yapabilecek bir algoritma henüz geliştirmedim. Arduinoda bu işleri nasıl halletmisler hala anlamadım.

iyildirim

Alıntı yapılan: Mucit23 - 07 Haziran 2015, 00:13:56
Acaba arduino kodunda veri yapısı nasıl? Yani veri paketlerini 6 ayrı data olarak nasıl panele gönderiyor.  Benim için en önemli kısım burası. Veri paketlerini hızlı bir şekilde göndermede problem yaşıyordum. Yani okadar hizli olmasi lazimki ornegin t sürede bütün verilerin 1. Biti panele yuklenirken t×8 sürede 8. Bit panele yüklenmesi gerekir.

Panelde 8 satır var her bir satır 2ms aktif olsa toplamda 16ms eder. Yani tazeleme frekansı 62.5hz olur.

işte seri olarak veri gonderirken toplamda  t×8 + tx7 + tx6 + t×5 + tx4 + tx3 + tx2 + tx1  süreleri 2ms yi aşaması gerekiyor.  İşte burada olay kopuyor.  Bunu hızlı bir şekilde yapabilecek bir algoritma henüz geliştirmedim. Arduinoda bu işleri nasıl halletmisler hala anlamadım.

Hocam olay veriyi paralel olarak gönderme de biter bence.

6 kata yakın hız artışı sağlar.
6 byte (6 kere 8bit) 48 bit seri göndermek yerine 8 byte(8 kere 6bit paralel) 8 bit seri göndermek.

Paralel gönderebilmek içinde verinin bellekte buna uygun olarak gönderilmeye hazır şekilde durması gerekir.

Bir önceki mesajımda bir kod örneği vardı. Bellekte,  yanlış hatırlamıyorsam satır öncelikli sıralı duran RGB verisini 6 kanal paralel olarak gönderilmeye hazır hale getiriyordu.
Bellekte 2 ayrı ledin(2 ayrı 16x16 paneller üzerindeki aynı ledler) 6 byte lık RGB verisi, bitleri karıştırılıp 6 bitlik 8 byte haline dönüştükten sonra geriye sadece 6 bitlik sıralı bir porttan veriyi seri gönderir gibi göndermek kalır.

Bi üst aşaması  parallel port, FSMC gibi donanımları kullanmak.

Mucit23

Alıntı yapılan: iyildirim - 07 Haziran 2015, 01:49:16
Hocam olay veriyi paralel olarak gönderme de biter bence.

6 kata yakın hız artışı sağlar.
6 byte (6 kere 8bit) 48 bit seri göndermek yerine 8 byte(8 kere 6bit paralel) 8 bit seri göndermek.

Paralel gönderebilmek içinde verinin bellekte buna uygun olarak gönderilmeye hazır şekilde durması gerekir.

Bir önceki mesajımda bir kod örneği vardı. Bellekte,  yanlış hatırlamıyorsam satır öncelikli sıralı duran RGB verisini 6 kanal paralel olarak gönderilmeye hazır hale getiriyordu.
Bellekte 2 ayrı ledin(2 ayrı 16x16 paneller üzerindeki aynı ledler) 6 byte lık RGB verisi, bitleri karıştırılıp 6 bitlik 8 byte haline dönüştükten sonra geriye sadece 6 bitlik sıralı bir porttan veriyi seri gönderir gibi göndermek kalır.

Bi üst aşaması  parallel port, FSMC gibi donanımları kullanmak.

@iyildirim cevap icin Teşekkürler.  Paralel veri gönderme aklıma gelmemişti.  Gerçekten işleri hizlandiracagina eminim. Tam olarak emin olmamakla birlikte arduinonunda paralel bir şekilde veri gönderdiğini düşünüyorum.  Çünkü veri gondermede doğrudan porta veri yazmışlar.

Fakat bu sistemde veri yapısını çok karmaşık bir hale sokuyor. Burada gercekten iyi bir organizasyon yapmak gerekiyor diye düşünüyorum 

iyildirim

@Mucit23,
Arduino kodunu incelemedim ama Port'a direk veri basılıyorsa veri paralel gönderiliyordur.

Veri yapısının karışıklığı gibi gibi bir şey çok da  önemli değil ki.
Siz verinizi aynı TFT ram'i gibi sıralı bir şekilde tutacaksınız. Veri değiştiğinde de bir kere konvert işlemi yapılacak o kadar. Ki işlem süresi bir kaç ms bile sürmez.
Geri kalan paralel basılmaya hazır hale getirilmiş veriyi-buffer ı 2 nin katları olarak ayarlanmış bir timer kesmesinde göndermek. Gereken  fazladan 2048 byte ram. 


M_B

PIC18F4550 ile ilgili ilk test yazım

#include "hardware.h"
#include "define.h"
#include "font.c"

#define DATAPORT PORTB

 char  i;
 char yy,aa,bb,cc,aaa,bbb,ccc;


char satir=0;
char Line=0;




void main() 
{

  ADCON1 |= 0x0F;         // AN pinleri dijital giriş/çıkış
  CMCON  |= 7;            // komparatörler disable edildi
  TRISA=0x00;
  TRISB=0x00;
  TRISC=0x00;
  TRISD=0x00;

 Latch_Pin_Direction  =0;
 OE_Pin_Direction     =0;
 Clk_Pin_Direction    =0;
 





  while(1) 
             {

                Display();

              }
} // main end.


void Display(void)
{ 
/***************************************/
     satir=0;
     PORTA=0x00;
     Write_data(satir);     // Satir -1
/***************************************/
      satir=satir+12;
      PORTA=0x01;
      Write_data(satir);     // Satir -2
/***************************************/
      satir=satir+12;
      PORTA=0x02;
      Write_data(satir);     // Satir -3
/***************************************/
      satir=satir+12;
      PORTA=0x03;
      Write_data(satir);     // Satir -4
 /***************************************/
       satir=satir+12;
       PORTA=0x04;
       Write_data(satir);     // Satir -5
/***************************************/
      satir=satir+12;
      PORTA=0x05;
       Write_data(satir);     // Satir -6
/***************************************/
      satir=satir+12;
      PORTA=0x06;
      Write_data(satir);     // Satir -7
/***************************************/
      satir=satir+12;
      PORTA=0x07;
      Write_data(satir);     // Satir -8
/***************************************/

}


/*****************************************************************/
 char Write_data(char Line)
{
char i=0;
char ii;
ii=Line+4;

      Latch_Pin = 0;
      OE_Pin = 0;

       for(Line;Line<ii;Line++)
                {


                     for(i=0;i<8;i++)
                         {
                          aa = (matrixbuff[Line]>>i)&(0x01);
                          bb = (matrixbuff[Line+4]>>i)&(0x01);
                          bb=bb<<1;
                          cc = (matrixbuff[Line+8]>>i)&(0x01);
                          cc=cc<<2;

                          aaa = (matrixbuff[Line+96]>>i)&(0x01);
                          aaa=aaa<<3;
                          bbb = (matrixbuff[Line+100]>>i)&(0x01);
                          bbb=bbb<<4;
                          ccc = (matrixbuff[Line+104]>>i)&(0x01);
                          ccc=ccc<<5;
                      
                          DATAPORT = aa|bb|cc|aaa|bbb|ccc;
                          Clk_Pin = 0;   // Clock Low
                          asm nop
                          Clk_Pin = 1;   // Clock high

                         }
                  }
                   Latch_Pin = 1;
                   OE_Pin = 1;
}
/*****************************************************************/
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Hocam ellerinize sağlık.  Devam edip geliştirmek lazım.  Kodlara biraz baktımda text fonksiyonlarini göremedim.  Acaba resimmi bastınız? Birde PWM işini nasıl yaptınız.

mesaj birleştirme:: 22 Haziran 2015, 12:50:41

Hocam ellerinize sağlık.  Devam edip geliştirmek lazım.  Kodlara biraz baktımda text fonksiyonlarini göremedim.  Acaba resimmi bastınız? Birde PWM işini nasıl yaptınız.

M_B

Hocam Henuz font falan tanımlamadım. Sadece Panelin calısmasını kavramak ıcın matrixbuff dizisinin icine cıkmasını istediğim goruntuyu kaydettim.
PWM  kullanmadım. Fırsat buldukca bir şeyler yapıyorum.   
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

oguztkn

Arkadaşlar belki konu dışı olabilir ama elimde resimlerde gözüken panel var gerilim verip data uçlarına rastgele elimle dokundum rgb olduğunu gördüm. Ama uçları hiçbir yerde bulamadım bu panelin uçlarını nasıl bulabilirim birde kendim sürebilirmiyim ?
Hayırlı Ramazanlar,İyi Çalışmalar...






Mucit23

Selamlar. Aradan baya vakit geçmiş. Daha önce hobi amaçlı bu panellerle uğraşıyordum ama daha farklı bir iş için uğraşıyorum.

Bu paneller hakkında biraz fikir alışverişi yapmak istiyorum.

Panellere PWM uygulamadan 7 farklı renk çıkarmak kolay bir işlem. Bunu standart bir mikroişlemci ile rahatlıkla yapılabiliyor. Biraz yüksek hızlı bir mikroişlemci ile Her Renk için 4 bit olmak üzere 12 bit pwm uyguladım ve 4096 farklı renk elde ettim tek bir panel için. Şöyle bir sıkıntım var. Bu PWM işlemlerini C de yaptığım zaman tek panel için sıkıntı olmasada panel sayısı arttıkça kod gecikmeleri bana engel olmaya başlıyor.

İnternette bazı videolar var aklım duruyor. İkiside STM32F4 ile yaptığını idda ediyor.
https://www.youtube.com/watch?v=Xtj6mlpqDPY
https://www.youtube.com/watch?v=4_Fv_DULgeM
İkinci video gerçekten çok iyi. Kodlar vs verilmiş inceliyorum ama panel kontrolü ile ilgili bir kısım pek göremedim? Nasıl bir yöntem izlemiş olabilirler sizce?

engineer

Merhaba, tarama konusunda aklıma takılan bir nokta var. 16x32 1/4 taramalı rgb bir panel üzerinden gidecek olursak, hatta işi biraz basitleştirelim, sadece R1,G1,B1 data hatlarını kullanarak üst 8 satıra birşeyler basmak istiyoruz diyelim. Göndereceğimiz her veri paketi 64bit uzunluğunda olacak (tek data hattı üzerinden R1, G1 yada B1) ve 4 kez tarama yaparak bu üst 8 satırı full basmış olacağız. Ancak bu şekilde dediğiniz gibi 7 renk elde edebiliyoruz, malum r,g, ve b nin karışımından. Burada OE'ye pwm uygulasak sadece parlaklık azalıp artmış olacak yine aynı 7 renk elde edeceğiz. Bu durumda satırdaki her pixel için tarama yapmak gerekecek. Yani ilk başta 1.satır 1. piksel R değeri için bir 64bit'lik paket gönderip oe'ye pwm uygulamak gerekecek, ardından G ve B içinde aynı adımlar gerçekleştirilecek. Daha sonra 2. pixel, 3. pixel ... 32. pixel için tek tek bu adımlar takip edilecek. Yani bir satır için totalde 3 x 32 =  96 kere tarama yapılacak. Siz her renk için 4bit kullanarak 12bit pwm uyguladım diyorsunuz aynı anda sanki tüm r,g,b ledler farklı değerlerde anahtarlanabilirmiş gibi. Bunu tam anlıyamadım? Benim yukarda kurduğum tarama senaryosu mu hatalı, siz tam olarak hangi adımları takip ediyorsunuz?

Mucit23

Hocam Bu konuda fikir alışverişi bulunabileceğim birilerini arıyorum. Farklı fikirler farklı çözümler demek.

ikinci videoda STM32F4 Discovery Kartı kullanılmış. Böyle bir performans gerçekten taktir edilecek bir durum. Ama nasıl yapmış anlamıyorum.
https://hackaday.com/tag/hub75/

Arkadaş Github'da kodlarını paylaşmış https://github.com/Frans-Willem/LEDMatrixHUB75

Buda Arkadaşın blog sayfası. http://fw.hardijzer.nl/?p=223

Hocam ben yaptığım uygulamada Her renk için 4 bit pwm uygulayabildim. PWM dediğim ise aslında temelinde "Bit Angle Modulation" tekniği. 4 bit PWM için 4 adet kesme oluşması yeterli oluyor.

Yaptığım işlemler sırası ile şöyle.
ABC 000 iken seçili satırlar 1 ve 9
Bu durumda R1, G1, B1 ve R2, G2, B2 girişlerinden bütün Pixeller için Renk bilgisinin 0. bitini gönderip T kadar bekliyorum.
T süre sonra Bütün pixeller için 1. biti gönderip 2T kadar bekliyorum.
2T süre sonunda 2. biti gönderip 4T kadar bekliyorum.
4T süre sonunda 3. biti gönderip 8T kadar bekliyorum. Bu şekilde 1 ve 9. satırdaki bütün ledlere 1 periyot boyunda PWM uygulamış oldum.

Sonra ABC 001 yapıp 2. ve 10 Satırları seçiyorum.
PWM işlemleri aynı şekilde devam ediyor.

Genel mantığım bu şekilde hocam. Birazdan tek panel için Test videosu ekleyeceği. Yüklenmesini bekliyorum.

Mucit23

#134
Benim yaptığım bu şekilde. Bazı yerlerde rastgele pixeller yanıyor. Onun çözümü basit ona uğraşmadım. Asıl sorun yazdığım programın kod gecikmelerinden çok etkilenmesi.
https://www.youtube.com/watch?v=L_1k1tvHRRk

Sadece iyi kod yazmak yeterli gelmiyor. Donanımda kullanmak gerekiyor. STM32F4 ile arkadaş DMA felan kullandım diyor ama nasıl kullanmış hafıza organizasyonunu nasıl yapmış Bit angle modulation işlemlerini nasıl yapmış. Koddan anlamak baya zor. 

Ekleme Gerçekte Titreme olmuyor Ekran Güncelleme hızı 83Hz