16X32 RGB Panel hakkında

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

kimlenbu

işinize yararsa şöyle bir şematik buldum :

http://www.ediy.com.my/Downloads/2014%2007/Arduino%20based%20RGB%20Matrix%20LED%20tester/Schematic%20for%2016x32%20RGB%20LED%20matrix%20panel.pdf

Dün biraz araştırdım, endüstriyel sistemlerde  PCI-express kart tasarlamışlar, görüntüyü DVI üzerinden alıp ethernet üzerinden çıkış kartına göndermişler. Çıkış kartı da 16x32'lik modülleri sürmüş, muhtemelen FPGA var üstünde.

MCU ile istenen bit derinliğinde tek modülü sürmek bile nanosaniye bazında toleranslara sahip. Kaskat bağlantıdaki modülleri sürmek zaten ihtimal dışı.

Gördüğüm kadarıyla sadece kartın çalışmasını anlamak için bir proje geliştirebilirsiniz. Ondan sonra ya senkron çalışan birden fazla MCU içeren bir tasarım yapacaksınız ya da fpga.

bmutlu

Merhaba Arkadaşlar yazdiklarinizi  okudum ve kullanilan entegrenin katalog bilgisinde bir bitin ötelenmesi için maksimum 25 MHz de ötelenir bu da bizi seri iletimde kısıtlıyor bundan daha hizli data ötelemesi yapamayız .
Ekranin taramasi 50Hz ve PWM i de 8bit olsun ve tarama 1/8 ve sütun sayisi 32 ise buna göre minimum data öteleme hizi -> 50 * 256 * 8 * 32 =  3276800 Hz maksimum 25 MHz kadar çikilabilinir .
Buna göre yukaridaki bilgiler dogrultusunda yazilim ve donanim kismi tasarlanmalidir ..

Mucit23

Frekans konusunda sıkıntı yok. Hiçbir zaman o kadar yüksek frekanslara çıkmak gerekmiyor. Yeterki işi organize bir şekilde yapalım.

Ben 74HC595 ile 8 Kanal 100Hz 8Bit çözünürlükte PWM ürettim.

Timeri kesmesini yaklaşık 40uS'ye kurdum. Her kesme oluştuğundan aşağıdaki kodları çalıştırıyorum
void Timer1_interrupt(void){
      static int Duty_Count, Bit_Count, temp=0;
 
      for(Bit_Count=0;Bit_Count<8;Bit_Count++)
      {
       if(Duty_Count<=Duty[Bit_Count])
         {
          temp |= ((uint8_t)1<<Bit_Count);
       }
         else
         {
          temp &= ~((uint8_t)1<<Bit_Count);
       }
    }
 
    for(Bit_Count=0;Bit_Count<8;Bit_Count++)
        {
       if(temp & 0x80)
             {
          GPIOB->BSRR=GPIO_Pin_0; //DATA=1
       }
             else
             {
          GPIOB->BRR=GPIO_Pin_0;  //DATA=0
       }
             temp=(uint8_t)temp<<1;
 
             GPIOB->BSRR=GPIO_Pin_1;    //CLK=1
             __asm {nop}
             GPIOB->BRR=GPIO_Pin_1;     //CLK=0
    }
      GPIOB->BSRR=GPIO_Pin_2;       //LATCH=1
      __asm {nop}
      GPIOB->BRR=GPIO_Pin_2;        //LATCH=1
 
        Duty_Count++;if(Duty_Count>255)Duty_Count=1;


Duty adında 8 elemanlı bir dizim var ve 0. eleman 74HC595'in 0. biti için Duty değeri, 7. eleman ise 7. Bitin Duty değeri. Çalışma videosu aşağıdaki gibi.

STM32F103 & 74HC595 ile Shift PWM

Yukarıdaki kodlar çok iyi çalışıyor. Keilde Optimizasyon Seviyesi 0 iken yukarıdaki kodların işlenmesi20uS sürerken Optimizasyon seviyesini 2 yaptığımda yaklaşık 6 uS süreye düşüyor. Kesme 40uS aralıklarla oluştuğu için kesme alt programı içerisinde epeyce bir vakit kalıyor.

Yukarıdaki kodda başka ne gibi optimizasyonlar yapılabilir? Bunu sormak istiyorum. Daha hızlı çalışabilirmi? Birkaç yerde bit kaydırma yapıyorum. Bunlar üzerinde optimizasyonlar yapılabilirmi?

Panel için 6 adet SPI datası yollanacağı zaman yukarıdaki kodda birkaç ekleme yapmam yeterli olacak.

Şuanda beni ençok düşündüren şey ekran için ayıracağım hafıza bölgesi. Bu çok önemli aslında. Panel için toplamda 16x32x3 =1536 byte Ram'e ihtiyacım var. Bu alanda RGB data dizilimleri nasıl yapılabilir?

Aklımda 2 yöntem var.
1-)Her pixel için gerekli olan renk bilgisini 3 ayrı 8 bitlik değişkende tutmak.
2-)Her pixel için tek bir 32 bit değişken tanımlayıp Renk bilgisini içerisinde 0x00RRGGBB şeklinde tutmak.

Birinci yöntemde kesme içerisinde veri ayıklamanın birazdaha hızlı çalışacağını düşünüyorum.
diğer ikinci yöntemde ise hafıza yapısı daha düzenli olacak gibi. Fakat kesme alt programı içerisinde verileri ayıklamak biraz uğraştırıcı olacak.

Bu konuda ne düşünürsünüz? 

Karamel

#48
hocam beni yanlis anlamazsaniz birsey soylemek istiyorum. ise hesap yapamadan bodozlama daliyorsunuz ve diger buyuklerimizi dinlemeyip kendi secimlerinizi(dogru yada yanlis) dogru olarak goruyorsunuz. ben yasca sizden kucugum. siz benden elbetteki daha tecrubelisinizdir ama once hesap yapmalisiniz. once matematik sonra uygulama olmasi gerekir..?

ekran modulunuzun nasil calistigini onceki mesajlardan tam olarak anlayamadim ama sonucta asagida yazdigim seylerin her halukarda yapilmasinin gerekli olmasi lazim.

ekran modulumuz 32*16 yani her satirda 96 ledimiz ve 16 satirimiz var. 96 ledimizi spidan basip(artik modulunuz nasil calisiyorsa) bunu pwm leyip(bu sekil 0x00RRGGBB anladigim kadari ile 4 level pwm uretmeniz lazim) sonrada aynilarini diger satirlarada yapmaniz gerekli.

en basta 16 adet ledi karasimsegin hizlisi ve tek tarafa dogru gideni seklinde tarayip gozun algilayamadigi minimum tarama frekansini bulmaniz lazim. bu konuda herhangi birsey okumadim. yada burada hocalarimiza danismadim ama kesin burada bu konuyu bilen hocalarimiz vardir. bir danisin derim.

minimum frekansi bulduktan sonra onuda 4 e bolmeniz gerekiyor ki her satirin pwm i uretilebilsin. bu islemin sonucunda olusan degeri sizin pwm isleyen ve spi yapan kodlarinizin asmamasi gerekiyor. yaptiginiz is bence cokta kolay bir is değil. 72 mhz lik microcontroller bir adet ekran modulunu anca surebilecek. o yuzden yukarida dedigim gibi bence once hesap kitap yapin.

mesaj birleştirme:: 17 Ekim 2014, 22:58:41

mesela hocam. yukarida ledleri 100 hz de surdum demissiniz. ekrandaki 16 satir ledleri 100 hz de tarayacaksaniz spi ve pwm ureten kodlariniz icin su kadar zamaniniz kalacak.

1/100 = 10 msn (tum ekran i bir kez tarama hizi.)

10 msn / 16 = 625 mikro sn (1 satir.)

625 / 4 = 156 mikro saniye (tek pwm.)


yani sizin spi yapan kodlariniz ve pwm icin calisan kodlariniz(32*16*3 kadar degisken icin cok zaman kaybeceklerdir) 156 mikro saniyeyi gecmemelidir. eger gecerse 100 hertz frekans duser.

RaMu

for(Bit_Count=0;Bit_Count<8;Bit_Count++)

Gibi kısa döngüleri açıp for kullanmadan yazarak
büyük ihtimalle (derleyici asmye nasıl çeviriyor bilmediğim için)
sadece bu döngünün 1 defa kullanılmasında dahi
1 kontrol ve 1 goto komutu tasarruf edilebilir.

Böyle yazıldığında
if(Duty_Count<=Duty[Bit_Count])

Duty[Bit_Count] kısmı Duty[0,1,...,7]
şeklinde tek tek elle girileceğinden yine daha hızlı çalışacak.

if(temp & 0x80)

yerine bit test komutu varsa daha hızlı çalışır.

Kaydırma başka komutla yapılabiliyorsa,
(misal ccscde var ve farklı hızlarda çalışıyorlar)
bazı komutlarla kaydırma diğerlerinden hızlı çalışabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

@Karamel

Senin şu yazdıklarını anlamakta gerçekten zorlanıyorum. Bundan önceki mesajlarındada durum böyleydi. Mesajını 3 defa okudum... Belkide farklı şeylerden bahsediyoruz. Benim PWM üretmede sıkıntım yok. PWM'in nasıl üretildiğini hesabının kitabının nasıl yapıldığını biliyorum elbette. Hiçbirşeye bodoslama daldığım yok!

İlk önce ekranın çalışmasını iyice bir anlayın yoksa farklı şeyleri konuşmaya devam ederiz. 4 Level PWM felan bu nedir böyle birşey yok.

Alıntı Yapen basta 16 adet ledi karasimsegin hizlisi ve tek tarafa dogru gideni seklinde tarayip gozun algilayamadigi minimum tarama frekansini bulmaniz lazim. bu konuda herhangi birsey okumadim. yada burada hocalarimiza danismadim ama kesin burada bu konuyu bilen hocalarimiz vardir. bir danisin derim.

Bu cümleyi bana tecrüme edermisin. Bu konuda birşey okumadım diyorsun? Neye dayanarak bunları yazıyorsun anlamıyorum.

16 Mhz lik arduino ekranda 4096 renk oluşturuyor. Benim 72Mhz lik mikrodenetleyicim bundan dahamı kötü olacak!!

Birde şunlar var.
Alıntı Yapmesela hocam. yukarida ledleri 100 hz de surdum demissiniz. ekrandaki 16 ledi 100 hz de tarayacaksaniz spi ve pwm ureten kodlariniz icin su kadar zamaniniz kalacak.

1/100 = 10 msn (tum ekran i bir kez tarama hizi.)

10 msn / 16 = 625 mikro sn (1 satir.)

625 / 4 = 156 mikro saniye (tek pwm.)

Bana bu hesabı açıklayın. Sizin bu tarama dediğiniz şey satır taramamı? Hani şu ABC pinleri vardı. Satır taraması yapıyorduk.. Daha ben o aşamaya gelmedim... Şuanda konumuz o değil...

Alıntı Yapekran modulunuzun nasil calistigini onceki mesajlardan tam olarak anlayamadim

İşin mantığını daha doğrusu panelin çalışmasını iyice anlayın öyle gelin tartışalım.

Ben ne yaptığımı çok iyi biliyorum Şuanda konumu ekranın Ram organizasyonu..

Karamel

1000000000000000
0100000000000000
0010000000000000
0001000000000000
0000100000000000
0000010000000000
0000001000000000
0000000100000000
0000000010000000
0000000001000000
0000000000100000
0000000000010000
0000000000001000
0000000000000100
0000000000000010
0000000000000001

hocam ledleri boyle tarayin ve gozun algilayamadigi minimum frekansi bulun. anlamadiginiz diger kisimlari hocalarimiz anlatirlar. ben 18 ime yeni girdim ve  elektronikle  hobby olarak ilgileniyorum. yazdiklarim bazen yanlis oluyor. bazende kendimi anlatmayi beceremiyorum. yani sorun bende.....

Mucit23

@Karamel sen yapıyı dot matrix displayler ile karıştırıyorsun. Shift Register ile PWM üretmek için böyle birşey yapılmıyor. Yukarıda eklediğim videoda 8 adet led var. Orada da senin bahsettiğin şekilde bir tarama yok. 16 bit shift register olsa ondada dediğin olmayacaktı. Yani satırlardan ledlere renk bilgisi gönderilmiyor.

PWM nedir biliyormusun? Ben PWM frekansından bahsediyorum.

Yaşın veya elektronikle ne amaçla ilgilendiğin beni ilgilendirmez ama konuyu anlamadan etmeden yaptığın yorumlarla hem benim kafamı hemde okuyanların kafasını karıştırıyorsun. Yazdığın her mesajı 50 defa okuyup, acaba bu neyin hesabı? nasıl bu kadar zaman geçiyor? 156uS nasıl oluştu? gibi sorulara cevap aramaktan yaptığım işi unutuyorum.

Tekrar söylüyorum

1-Panelin yapısını, Tarama, Renk bilgisi gönderme gibi konuları iyice öğrenmeden,
2-PWM nedir? Shift Register ile PWM nasıl üretilir gibi konuların cevabını iyice öğrenmeden konu hakkında yorum yapmamanızı rica ediyorum.

El insaf yahu!!

Karamel

Hocam pwm nedir shift register nedir biliyorum. size bunu isterseniz Turkcede İngilizcede anlatirim eger isterseniz. neyse aslinda mesaj yazmayacaktimda pwm nedir bilmiyorsun diyince incildim vede yazma geregi duydum.ihtiyaciniz olursa ingilizce anlamadiginiz birseyler varsa ceviri falan yaparim size hocam. zaten elektroniktende matematiktende anladigim yok!! genel soruna yardim ederim bende.

İyi geceler hocam.

Mucit23

#54
Kırılıp darılmanı istemem ama bu konuda biraz anlayışlı olmanı istiyorum.  Panelin çalışmasını anlayıp kendi yazdığın mesajları tekrar okusan eğer bana hak vereceksin

mesaj birleştirme:: 18 Ekim 2014, 09:11:08

Alıntı yapılan: RaMu - 17 Ekim 2014, 23:00:12
for(Bit_Count=0;Bit_Count<8;Bit_Count++)

Gibi kısa döngüleri açıp for kullanmadan yazarak
büyük ihtimalle (derleyici asmye nasıl çeviriyor bilmediğim için)
sadece bu döngünün 1 defa kullanılmasında dahi
1 kontrol ve 1 goto komutu tasarruf edilebilir.

Böyle yazıldığında
if(Duty_Count<=Duty[Bit_Count])

Duty[Bit_Count] kısmı Duty[0,1,...,7]
şeklinde tek tek elle girileceğinden yine daha hızlı çalışacak.

if(temp & 0x80)

yerine bit test komutu varsa daha hızlı çalışır.

Kaydırma başka komutla yapılabiliyorsa,
(misal ccscde var ve farklı hızlarda çalışıyorlar)
bazı komutlarla kaydırma diğerlerinden hızlı çalışabilir.


hocam sizin mesaj kaynadı :)

Aslında sizin dediginiz gibi düşündüm.  Fakat program cok uzuyor. Gerçek panele geçince o döngülerin sayısı 32 felan olacak. Arm de bit test komutu yok yani öyle bir fonksiyon yok. Kendim yapmak zorundayım.  Daha iyi bir yöntemi varsa deneyebilirim. Bit kaydırma felan zaten carpma işlemi.  Bunun çok uzun süreceğini sanmam.

Aslında gerçek paneli bekliyorum. Gelsin hemen testlere başlayacağım.

Ram konusunu tekrardan üste cekmek istiyorum.  Hafıza organizasyonu nasıl yapılmalı


RaMu

#55
Uzun süre cevap yazamadım buraya,
şuan son durumuda merak ettiğim için yazayım istedim,
herhalde modül gelene kadar askıya aldın bu kısmı.

Ram konusundan önce panele yükleyeceğin datalar nereden gelecek?

STM32F103 kullanacaksın herhalde,
32 bit işlemci zaten,
değişkenleri 32 bit tanımlayıp
4 ayrı byte ınada farklı birer değişkenmiş gibi erişim olanağı sağlayabildiğini düşünüyorum,
komut setine bakmalıyız,
misal dspicde 16 bitlik değişkene byte modunda erişim var
stmdede vardır bu.

Program uzaması konusunda
yani seninde dediğin gibi
işlemem ufak bir hız katmak için
aynı rutini tekrar tekrar yazmak gerekiyor
gerekirse yapılır, zaten akla gelen en basit yöntem bu.

Ben rgb panelin nasıl çalıştığını halen tam olarak anlayabilmiş değilim,
hc595 kısmında problem yok zaten yazdıklarım onun içindi,
eğer modülü tam kavrarsam bu işi en hızlı yapacak algoritmalardan birini yazarım.

Aslında shift register için yaptığın bu işlem birebir spi oluyor,
yani hc595 in girişine mcunun spi çıkışını bağlasak ve
spi den 1 byte gönderip ardına hc595 için latch versek
tabiki en hızlısı bu olacak.
Şimdi senin rgb panel için bu hc595 örneğini
aynı anda 6 kanal yapman gerekiyormuş gibi olacak doğru anladıysam.



mesaj birleştirme:: 24 Ekim 2014, 10:15:35

Birde şu var misal 3 tane hc595 ile yukarıdaki örneğini genişlettiğimizi düşünelim,
bu sefer istediğin gibi 32 bitlik ram değişkenimizi var,
adı temp değil temp32 olsun,
örneğinde yaptığımız işlem şu şekilde olacak;
    for(Bit_Count=0;Bit_Count<8;Bit_Count++)
        {
//----------------------1---------------------------
       if(temp32 & 0x00 00 00 80)
             {
          GPIOB->BSRR=GPIO_Pin_0; //DATA=1
       }
             else
             {
          GPIOB->BRR=GPIO_Pin_0;  //DATA=0
       }
//---------------------------------------------------

//-------------------------------2--------------------
if(temp32 & 0x00 00 80 00)
             {
          GPIOB->BSRR=GPIO_Pin_1; //DATA=1
       }
             else
             {
          GPIOB->BRR=GPIO_Pin_1;  //DATA=0
       }

//----------------------------------------------------

//----------------------3-----------------------------
if(temp32 & 0x00 80 00 00)
             {
          GPIOB->BSRR=GPIO_Pin_2; //DATA=1
       }
             else
             {
          GPIOB->BRR=GPIO_Pin_2;  //DATA=0
       }
//-------------------------------------------------

       ve clock
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Tek clock da 6 spi datası. Bu yüzden fpga kullanılıyor.  Bu yüzden donanımsal spi olmuyor.  :)

Aslında ram organizasyonu üzerinde çalışıyorum ben. Bir iki fikrim var.

Sonuç olarak hedefledigim şey PutPixel(Xpos, Ypos, Color) Şeklinde bir fonksiyon oluşturmak.

RaMu

fpga yı çok gözünde büyütüyorsun,
ilk verdiğim örneklerden bir zaten fpganın yaptığı en önemli kısmı
mcuya kazandırıyor,
fpga da sonuçta logic entegre yapmak,
bunu dışarıdanda yapıp mcuya ekleyebilirsin,
naktın hız yetmiyor ya fpga ya geçeceksin
öyle kolay olmadığı için
fpga nın artısını alıp kendi logic entegrelerinle yapacaksın,
benim düşüncem bu.
(yapacaksın edeceksin derken emir kipi manasında değil
yanlış anlaşılmasın :)  )

PutPixel(Xpos, Ypos, Color) için,
Color diziye pointer olsun,
Xpos Ypos sadece başlangıç noktasını versin,
yoksa her pixel için tekrar tekrar fonksiyondan dönüp
Xpos Ypos girmek gerekir.
Neyse hız yetmezse böyle şeyler yapılabilir aslında.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Merhaba Arkadaşlar

Yatay tarama ile ilgili bir sıkıntı var. Sizin fikrinizi almak isterim.

Normalde yatay tarama ABC pinleri ile yapılıyor. Satır olarak 1-9, 2-10...8-16 şeklinde satırlar aktif oluyor. Satır tarama yaparken her bir satırı en az en fazla 2-3 ms aktif tutmak gerekiyor.  2ms aktif tutarsak yatay tarama frekansımız 500hz olur.

Örneğin 1-9. Satırları aktif ettik. Bundan sonra Shift Registerler aracılığıyla ledlere PWM uygulamak gerekiyor. İşte sorun burada başlıyor. Benim LED'lere uyguladığım PWM frekansı 100Hz. Dolayısıyla  ledlere uygulanan 1 peryotluk pwm palsinin süresi 10ms civarı olacak.

Yatay Tarama frekansı, ledlere uygulanan PWM frekansından küçük. Bu durumda örneğin 1-9 satırlar aktif iken LED lere pwm verilmeye başlanır. Daha 1. peryot tamamlanmadan diğer satıra geçilir.

Dün akşamdan beri bu konuyu düşünüyorum. FPGA lı kartlarda bu iş nasıl yapılmış olabilir?


iyildirim

Alıntı yapılan: Mucit23 - 29 Ekim 2014, 11:42:01

2ms aktif tutarsak yatay tarama frekansımız 500hz olur.
..............
Bundan sonra Shift Registerler aracılığıyla ledlere PWM uygulamak gerekiyor. İşte sorun burada başlıyor. Benim LED'lere uyguladığım PWM frekansı 100Hz. Dolayısıyla  ledlere uygulanan 1 peryotluk pwm palsinin süresi 10ms civarı olacak.

Shift reg. ile PWM uyguluyorsanız,  PWM frekansını SR lerin sürülme peryodundan ne şekilde bağımsız düşünebiliyorsunuz anlamadım.

Amac her bir ledin parlaklığını 8 bit çözünürlükte ayarlayabilmek değilmi. 
Şu ana kadar bahsedilen iki farklı yöntem var.

Birinde ledlerin mininum sürülme zamanı 2ms/256 ve OE sürekli aktif. SR sürülme yani PWM frekansı 128KHz .  Avantajı ledler tam parlak yanabilir dezavatajı işlem gücü..

Diğer yöntem Arduino ile uygulama örneği olan.. Ledlerin sürülme zamanları 2ms/8 ve kaçıncı bitte iseniz OE ye uyguladığınız duty o ve tabii OE ye uyguladığınız PWM peryodu 2ms/8 den den en az 10 kat daha az olacak.  SR ile sürülme frekansı 4KHz.  Avantajı daha az işlem gücü. Dezavatajı ise ledlerin parlaklığı en fazla diğerin yöntemin 1/4 ü olabilir.

Kod örneklerinden birinci yöntemi uygulamaya çalıştığınızı düşünmüştüm. Paylaştığınız örnek koddaki gibi yapacaksanız bellek organizasyonu vs. çok da önemli değil. Ancak DMA li falan paralel port, FSMC gibi donanım kullanabilecek olsaydık çok önemli olurdu.
FPGA in yerini tam tutmaz ama LS682-684 gibi bir comparator a duty ve clock bilgilerini FSMC ile gönderebilseydik bayağı iş görürdü. Latch, Clock sinyalleri nasıl üretilebilir kafa yormak lazım.