16X32 RGB Panel hakkında

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

Mucit23

Hocam açıkçası ben hep 1. yöntem üzerinde kafa yormuştum. 74HC595 ile yaptığım kod örneğinin temelinde de aynı yöntem var. Açıkças PWM frekansı çok yüksek çıkıyor. Yani ben 100Hz lerde dolaşırken 62,5Hz yatay tarama frekansında ve 8 Bit renk çözünürlüğünde dediğiniz gibi 2ms/256dan pwm frekansı tam olarak 128 khz çıkar. Shift Register'lardan bu denli bir yüksek frekans çıkarmak harbiden zor iş olsa gerek. Bu yöntem üzerinde çalışmaya devam edersem büyük ihtimal Cortex M4 ile çalışmam gerekecek. Bu frekansta pwm alabilmek için SR lere çok yüksek frekanslarda clock uygulamam gerekir. Hesabını bile yapamadım şimdi. Tırstım valla. :-X

Bellek organizasyonu dediğiniz gibi problem değil. Şu Yatay tarama ile PWM frekansı işini birlikte yapabilirsem bellek organizasyonunuda yaparım. O işi planlandım.

Ben hiç OE pinini hesaba katmadım. Açıkçası Arduino'nun kodlarını doğru düzgün incelememiştim. Benim test ettiğim 1. yöntemle yaptıklarını düşünüyordum.

2. Yöntemi Anlayamadım. OE pini tüm SR ler için ortak. Burada OE'den PWM uygulanarak LED'lere nasıl PWM uygulanıyor? Bunu birazcık daha ayrıntılı anlatabilirmisiniz?



iyildirim

2 yöntem dediğimiz yöntemi yanılmıyorsam  @hasankara hocam detaylıca anlatmıştı.

Burada 2ms yi 8 bit karşılığı 8 eşit zamana bölüyoruz. 7. bit için OE ye %100 duty 0.bit için 1/128 duty uyguluyoruz. 2ms yi 256 yerine 8 e böldüğümüz için işlem gücü de 32 kat azalmış oluyor.  Tabii bu 8 eşit zaman da her bir ledin duty değerini, zamana karşılık gelen bitle and leyip ledi yakıp yakmamaya karar da veriyoruz. Ledlerin duty değeri 255 olsa bile ledler yaklaşık normalin 1/4 kadar parlak yanabiliyor. 

FSMC konularına pek bakmadım.
Clock ve latch puls larını uygun şekilde üretmenin bir yolu varmı bakmak lazım.
Olabiliyorsa 1 yöntem LS682 gibi bir TTL + 595 ile uygulanabilirse adeta FPGA tadında bir şey çıkar.

Mucit23

Biraz anladım ama bana çok karışık geliyor. Sizce FPGA lı kartlar bu işi nasıl yapiyor?
Gercekten SR ler ile 128Khz pwm üretmem gerekse ne kadar bir hıza ihtiyacım olur? Clock frekansım ne olur?

iyildirim

FPGA ın avantajı paralel işlem yapabilmesi. Birkaç clock da SR lerin 6 pininde de + satır pinlerinde de pulslar hazır olabiliyordur sanırım.

SR lerin hızı 128kHz PWM üretmeye rahat rahat yeter.
Panelin sağı solu ayrı sürülüyordu. Ve aynı anda iki satır sürülecek. Yani 1/128K zamanda 32 bit aktarmak gerek. 4Mhz gibi birşey çıkar.
Sıkıntı duty yi lede atanan duty ile karşılaştırıp üstelik bunu 6 ayrı pin için 6 kere yapıp, üstüne birde satırlar için pinleri de set etmekte. 
6*4 = 24M karşılaştırma işlemi gerekir. 100Mips işlemci ile bir işleme max 4 clock kalıyor. Karşılaştırma yaptığımız için en az 2 adet dallanma komutu gerekir. Ki dallanma komutları da en az 2 clock harcıyor.

2ms ye karşılık tazeleme frekansı da 60 hz gibi çıkar. Ve Tazeleme frekansı bu kadar yüksek iken bu işi mcu ile yapmak ek donanım olmadan mümkün görünmüyor.

Mplab da döngüyü simule ettiğimde, bir ledin duty sini karşılaştırıp SR pinine atanması işi için 5 clock harcadı. Ama döngü kontrolleri,  satır pinlerinin atanması gibi ek işlerden dolayı ortalaması 11 clock civarında oldu. Gerçi asm ye biraz el atıp iyileştirilmeler yapılabilir.
Kodu 16 bit için derlemiştim. Şu anda en hızlısı 70mips çalışabildiğine göre tazeleme frekansı max 15Hz gibi olabiliyor.
Ama işlemci sadece buna uğraşırsa.. Putpixel vs. işleri vs. ye zaman kalmıyor.

Pratikte bu tip bir paneli 16M renk sürmek ile 65K sürmek arasında bir fark olacağını sanmıyorum. Eğer şu an yaptığımız algoritma tartışması olmasaydı,  üretilecek bir iş olsaydı direkt 65K sürün uğraşmayın derdim.

Benim görebildiğim en azından karşılaştırma işlerini otomatiğe bağlamak gerektiği.
74LS682 den yardım alalım derken bunu kastediyordum. Led duty değerini ve duty sayacını 8+8, 16 pinden çıkarsak SR nin girişinde puls hazır olur. 6 led için duty gönderip clock, bunu 32 kere tekrarlayıp latch pulslerini aktif edince olur gibi.
Clock pulslerini de fsmc ile gönderebilseydik işi dma ye yıkabilirdik.  Belki belleği biraz bol kullanıp, araya clock, latch için birşeyler serpiştirip işin tamamı dma + fsmc ye de yıkılabilir.

Mucit23

#64
Bu işin hepsini  M3 ile yapmak çok zor bir iş olsa gerek. Stm32F429 ile felan yapabilirim belki ama anlamsız olur. Sanırım renk konusunda haklısınız 16M renk çıkarmak bilindik yöntemlerle mümkün değil.

65K renk üzerinde çalışma yapacağım. Buda bildiğim kadarıyla 16bit renk çözünürlüğü olur. Belki 565 formatı kullanılabilir.

Aslında 74LS682 iyi bir hız katabilir. 6 Adet kullanılsa her birinin çıkışı sırayla R1, G1, B1, R2, G2, B2 Pinlerine bağlansa olabilir. Ama 6x8 den 48 adet data pini, 8 adet de ortak sayaç çıkışı olsa sadece karşılaştırma için 56 adet I/O kullanımı söz konusu olur. Pek pratik bir yöntem değil.

Bu iki yöntemin dışındada farklı bir yöntem uygulanamaz sanırım. Biraz beyin jimlastiği yapmak lazım.



mesaj birleştirme:: 30 Ekim 2014, 10:59:09

Renk çözünürlüğü 18 Bit de olabilir her seferinde 256 döngü yerine 64 döngü kurarım

kantirici

Tabi şunada bakmak lazım paneldeki LED'lerin renk skalası ne? 16M renk ürettiniz ama panledeki LED buna cevap verebilecek mi? Bence bu kadar renk derinliği sunmazlar.

Kabil ATICI

O kadar renk derinliği sunsa bile sıradan bir insan gözü o kadarını algılayamaz.
ambar7

Mucit23

Haklısınız  ledler 24 bit renk çözünürlüğünü desteklemeyebilir. 18 bit renk çözünürlüğü bile bana cok hiz katacagini tahmin ediyorum.  Sadece aklıma takılan konu 2ms lik yatay tarama suresi içerisinde kac kez pwm palsi uygulamam gerektiği.

bmutlu

Alıntı yapılan: Mucit23 - 30 Ekim 2014, 13:40:19
Haklısınız  ledler 24 bit renk çözünürlüğünü desteklemeyebilir. 18 bit renk çözünürlüğü bile bana cok hiz katacagini tahmin ediyorum.  Sadece aklıma takılan konu 2ms lik yatay tarama suresi içerisinde kac kez pwm palsi uygulamam gerektiği.

Mucit23

Yukarıdaki daha önce yazdığım kısmı anlayabildiniz mi? Burada biraz daha açık yazayım da anlaşılsın  dedim:

Ekranı saniyede tazelenmesi 50 defa olsun 1/50 -> 20 mSn olur

Displeyin yapısı gereği 8 de 1 seklinde sürülecek şekilde tasarlanmıştır sürme şeklinden anlaşılmaktadır (1/8 tarama (1,1/2,1/4,1/16 şeklindede tasarlananbilirler))

buradan -> 20/(1/8) -> 2,5 mSn bir satır ledin (32 ledin -> 4 adet 74hc595) tazelenme süresi..

Bu arada 8bit PWM yapılacaksa 256 değişik led tonu elde ederiz bir renk için .Displey bilgisinde de görüldüğü gibi RGB aynı anda gönderilmektedir.

Yukarıda elde edilen bir satır 2,5 mSn zamanında bu satır 256 defa taranmalıdır .Yani 2,5 mSn / 256 -> 9,765625 uSn bu bir taramanın süresi .

Ama biz bir satırda 32 bit göndermemiz  9,765625 / 32 -> 0,30517578125 uSn (3,2768 MHz) minimum saat frekansı ile sürülmeli (maksimum 25MHz ile sürülebilir).

Siz displeyi yukarıdaki bilgiler doğrultusunda sürülmelidir.

Buna göre bir devre kurulmalıdır. 6 bitlik bir çıkış (R1,G1,B1,R2,G2,B2) Saat ucu ve letch ve A,B,C ucu şeklinde bir tasarım yapilmalı ve buna göre bir donanım oluşturulmalıdır..


hasankara

Alıntı Yaphttps://www.picproje.org/index.php/topic,40249.msg301490.html#msg301490

pwm çoklama konusunda basit bir algoritmadan bahsetmiştim linkte.bu konuda önceki yazılanları pek okumadım belki çözüm olabilecek algoritmadan bahsedilmiş olabilir bir de ben bahsedeyim.

ekranda görüntülenecek olan görüntü, ekran sürücüsü tarafından ekranda 8 aşamada görüntülenir. her aşamada ekran parlaklığı 2 nin katları şeklinde artarak güncellenir. buna paralel olarak, her bir pikselin bir rengi için tayin edilmiş 8 bitlik olan parlaklık bilgisinin bitlerine göre her hücre için maskeleme yapılarak 8 aşama tamamlanır.

görüntünün tümünü referans alarak anlatmaya çalışırsam; 1 adet 8 bit parlaklık derinliği olan görüntüyü elde etmek için 8 adet tek ton görüntü elde ediyorsun. 8 adet tek ton görüntüyü ekranda gösterirken, her aşamada ekranın tümünün parlaklık katsayısını 2 nin katlarında arttırıyorsun. tek ton derken kast ettiğim led ya yanıyor yada sönüyor. 8 bit kafanı karıştırmasın, bir pikselde 3 adet renk var ancak her piksel değilde her ledi kendi içinde değerlendirmiş oluyoruz. sonuç olarak piksel bazlı bakıldığında 24 bit renk derinliği elde etmiş oluyoruz.

8 bitlik data ile 24 bit renk derinliği elte etmemizi, her pikselde 3 adet led kullanmış olmamıza bağlayabiliriz. bu metod yerine, her led için 8 adet led koyarak 8 kez görüntü oluşturmaktan sa parlaklık bilgisine göre parlaklıkları 2 nin katlarına göre değişkenlik gösteren bu 8 lede tek seferde uygulayarak ta tek görüntü ile parlaklıklı görüntü elde edebiliriz.

3. sayfadaki yorumumu biraz daha açmaya çalışayım. öncelikle, ben bu yorumu yazarken panele data gönderme (haberleşme) yöntemi farketmeksizin, sadece parlaklık işinin nasıl yapılabileceğinden bahsetmiştim.

tek renk görüntü oluşturabildiğimiz panelde parlaklıklı görüntü nasıl oluşturabiliriz?

standart kayan yazıları çoğu yerde görüyoruz, tek renk ten kastım tamda bu paneller aslında. diğer deyişle ekrana baktığımızda bir piksel için led ya max parlaklıkta yanıyordur yada yanmıyor dur. kafa karıştırabilecek bir noktada burası aslında matrix tarama metodu kullanılarak da tek renk görüntü elde edilebiliyor. ama nihayetinde tarama olduğu için max parlaklığı kısıtlayan bir faktör şeklinde her led ( 1/(tarama_adım_sayısı) ) duty oranında pwm lenmiş olur. illa ki tarama metodu kullanılacak diye bir şart yok her led için bir shift register çıkışı tayin edip matrix tarama yöntemini aradan çıkarabiliriz. 8x8 matrix için tarama metoduyla 1 tane 16bit lik shift register yeterli olabilirken, tarama metotsuz her led için çıkış tayin edilerek 4 tane 16bit shift register kullanılabilinir. tarama metodu için hem tam periyodik çalışma şekline hemde daha yoğun bir işlem gücü ne ihtiyaç duyabiliyoruz. tarama metotsuz yöntemde görüntü sabit olduğu sürece panel ile ilgili herhangi bir işlem yapmaya ihtiyaç yoktur ve periyodiklik önem arz etmez.

1 adet tek renkli görüntüyü elde etmek için; tarama metodu kullanıldığında tüm satırların tarama işlemi tamamlanmış olması gerekiyor. tarama metotsuz iken shift registerlere sadece bir kez bilgi yollandığında görüntü elde ediliyor tekrar belirteyim,bu yüzdende aynı bilgiyi defalarca yollamaya gerek kalmıyor.

tek renk görüntü oluşturmak için değinebileceğim diğer bir nokta her piksel için 3 led (r g b) kullanılması. aslında sürülme yöntemi olarak bu 3 ledin diğer tüm ledlerden farksız olarak değerlendirilebileceğini ve bunun sadece yazılımda ayırt edilebileceğini belirtmem de bu noktada oluşabilen kafa karışıklığını giderilebilmesi için yeterli olabileceğini düşünüyorum. elbette diğer ledlerde yapabileceğimiz gibi bir de ledleri rgb diye gruplandırarak 3 aşamadan oluşan ayrı bir tarama katmanı oluşturulabilir ancak bu metot işin içine girerse tüm görüntüler bide rgb için 3 kez daha taranması gerekir. özel ihtiyaçlar dışında bu metodun tercih edilmeyeceğini düşünüyorum.

bu arada tek renk görüntü elde etme metotlarından bahsetmişken şunuda belirtmiş olayım, kullanılacak panel hazır ise tek renk görüntü elde etme metodunu değiştirme gibi bir esnekliğiniz olmuyor çünkü bu kısmın kuralları, panel şeması ile birlikte belirlenmiş oluyor.

buraya kadar kısım sadece panelde tek renk görüntü elde edebilmek için bilmemiz gerekenlerdi. parlaklık oluşturma kısmını, tek renkli görüntü elde etme yöntemi üzerine kurulan bir katman gibi düşünebiliriz. alıntı yaptığım yorumumda bu üst katmanın oluşmasından bahsettim aslında. diğer bir öneri de tek renk görüntü oluşturmak ile tek renk görüntülerden parlaklıklı görüntü oluşturma yı birbirinden farklı işlemler olarak görmeye çalışın.

parlaklıklı görüntü elde etmek için ihtiyacımız olan diğer bir özellik de, tek renkli görüntünün oluşmasında kullanılan bütün ledlerin parlaklığını tek bir kanal dan ayarlayabilecek bir donanıma sahip olmamız. kısaca nasıl elde edebiliriz diye değinecek olursam; shift registerlerden oluşan panelin üzerindeki tüm shift registerlerin enable uçlarını birbirine bağladığımızda bu ortak nokta, görüntünün ortak parlaklığını ayarlayabilen kanalı ifade edebiliyor. bu kısımda belirtmem gereken önemli bir nokta ise; enable ucuna pwm sinyali uygulayarak tüm panelin ortak parlaklığını, sinyalin duty oranı ile ayarlayabiliyoruz ancak, ekran taraması olsun parlaklık oluşum tarama katmanı olsun tüm hepsinden çok daha hızlı bir frekansa sahip olması gerekir bu pwm sinyalinin. bu pwm sinyalinin diğer katmanarla senkron çalışmadığını varsayarak şunu söyleyebilirim, oransal olarak tahmini diğer tarama metotlarının en hızlısından en az 4 kat daha hızlı olmazsa en neticede oluşan görüntüde titreşimlere sebebiyet verebilecektir.

parlaklıklı görüntü elde etmek için iki temel ihtiyacı karşıladıktan sonra bu özellikleri kullanarak hedefimize ulaşmamızı sağlayacak katmanı tekrar açıklamaya çalışayım. ilk başta kullanıcıya sunulacak 24bit renk derinliğini 8 bit parlaklık derinliği olarak görmeliyiz. çünkü biz panel sürmek için her görüntüyü oluştururken piksel piksel değil led led oluşturacağız.



8 bit sayısal ortamda 2^8=256 durum ifade edebiliyor. yani her led 256 farklı parlaklık durumunu alabilmeli. sanal ortamda her led için 8 bit uzunluklu parlaklık değişkenleri belirlenir. 0ıncı tek renk görüntüyü oluşturmak için; her ledin kendi parlaklık değişkenlerinin 0ıncı bitleri kullanılarak elde edilir. 1inci tek renk görüntüyü oluşturmak için ise, yine her led için atanmış olan parlaklık değişkenlerinin 1inci bitleri kullanılarak elde edilir. bu şekilde 8 adet tek renk görüntü elde edilmiş olunur. 8 adet elde edilmiş olan tek renk görüntüler sırası ile panelde görüntülenir ve her tek renk görüntünün görüntülendiği sürece, tüm panelin parlaklığı ayarlanır. bu parlaklık ise 0ıncı görüntü süresinde 1 birim, 1inci görüntü süresinde 2 birim, 2inci görüntü süresinde 4 birim, 3üncü görüntü süresinde 16 birim ... 7. görüntüde 128 birim şiddetlerinde ayarlanır. böylece her led üzerinde, değişkenlerimize bağlı olarak 256 parlaklık seviyesini oluşturmuş oluruz.

Mucit23

Hocam anlatımınız için çok teşekkür ediyorum. Yöntemin anlaşılması gerçekten zor.

8 bit renk derinliği için 8 adet katman oluşturmak gerekiyor. Sırasıyla 8 adet döngü oluşturup bu katmanları ekrana veriyoruz. Panelin OE pininden Pwm uyguluyoruz. 1. Katmanı gönderdikten sonra duty oranımız 1, 8. Katmanda duty oranımız 128 oluyor. Bu sebebten dolayı max. parlaklık alamıyoruz.

Benim anlamadığım konu katman meselesi. Daha doğrusu tek renkli görüntü oluşturmak. Bunu Normal P10 larda biliyorum ama Burada RGB işin içine giriyor. Her bir led için duty değerlerimiz var.

Şimdi Panelde kaç adet led var ise okadar duty değişkenimiz olsun.Aslında bunu artık panel yöntemi nasıl olursa olsun 3 adet iki boyutlu dizi ile yapmayı düşünüyorum

RDuty[32][16]
GDuty[32][16]
BDuty[32][16]

Burada SR lere veri basırlırken 8 aşamada işlem tamalanıyor sanırım.

0. Aşamada örneğin 0,0 kordinatındaki led için düşünürsek RGB duty verilerinin 0. bitlerini 0,0 kordinatındaki ledlere gönderiyoruz.(Aslında bu işlem aynı esnada tüm ledlere yapılıyor) Ardından OE pininden 8 Bit pwm sinyalinden duty değerini 1 yapıp gönderiyoruz. Bu işlem ile 1. katman ekrana yüklenmiş oluyor. Ardından 2. katman için RGB duty değerinin 1. bitlerini 0,0 kordinatındaki ledlere gönderip Duty değerini 2 yapıyoruz.
3. katman için 2. bitleri 0,0 kordinatındaki ledlere gönderip duty oranımınız 4 yapıyoruz.
8.katmana geldiğimizde 7. biti 0,0 kordinatına gönderip duty oranını 128 yapıyoruz.

Eğer buraya kadar doğru anladıysam ne mutlu bana

Şimdi bu işlemi satır taramayla birlikte nasıl yapıyoruz onu anlamadım?

Dediğim gibi anlaşılması gerçekten zor bir yöntem hocam hakkınızı helal edin  :-[

hasankara

aslında kafa karışıklığına sebebiyet verecek bir deyim kullanmışım şimdi fark ettim. 0. tek renk görüntü değilde 0. tek parlaklıklı görüntü dersem sanırım metodu anlamana biraz daha yardımcı olabilirim. mesela bahsettiğim parlaklıklı görüntüyü elde etme metotlarını işin içine karıştırmadan da her piksel için 8 farklı renk elde edebilirsin. hiçbiri,yeşil,kırmızı,mavi,yeşil ve kırmızı, yeşil ve mavi, mavi ve kırmızı, hepsi şeklinde her led için ya yanar yada söner diyerek her piksel için 8 adet renk oluşturabilirsin. eğer verilerini piksel şeklinde tutuyorsan işe, bunları 3 e parçalayıp tüm ledleri birbirinden bağımsız sürebilmek ile başlayabilirsin.

1. aşama tek parlaklıklı görüntüyü oluşturabilmek. (her ledin parlaklığını kendi içinde değerlendiriyoruz.)
2. aşama 8 adet tek parlaklıklı görüntüleri kullanarak, 1 adet parlaklıklı görüntü oluşturabilmek.

bu iki aşamayı elinden geldiğince parçalı görmeye çalış.

biraz daha somut bir örnek vermeye çalışayım. tarama metodu kullanmadan bir  16x32 piksel li (16x32x3 led li) paneli tek parlaklıklı sürebildiğini düşünelim. 16satır 32 sütun piksel yani 16 satır 96 sütun led yada 48 satır 32 sütun gibi iki farklı boyut şeklinde düşünebilirsin. hatta illa 2 boyutlu düşünmek zorunda değilsin, 16 satır 32 sütun 3 derinlik led şeklindede düşünebilirsin. son da ki gibi gidelim.
unsigned int data_sur[16][3]; // her bir hücre 32 bit, bundan 16 tane var ve bu 16 int dende 3 tane daha var. sen shftreg_up isimli fonksiyonuna bu diziyi gösterdiğin zaman panelde tek parlaklıklı görüntü oluşuyor sanırım bu kadarını yapabiliyorsun. diğer bir deyişle sanaldaki değişkenlerinin her bir biti panel üzerinde bir led anlamını taşıyor.

unsigned char data_parl[32][16][3]; asıl parlaklık değerlerini bu değişkende saklıyorsun. bu 3 boyutlu bir dizi ama her bitinin bizim için anlam ifade etmesi dolayısı ile 4 boyutlu görelim.

örnek olarak 3üncü tek parlaklıklı görüntünün 2inci satırının 1inci sütunundaki pikselin ledlerinin yanık mı yoksa sönük mü durumunu, data_parl parlaklık matrisini kullanarak oluşturalım. bitcopy(var1,bit1,var2,bit2) diye bir makromuz var bu bir değişkenin bir bitinden başka bir değişkenin başka bir bitine değer kopyalıyor.
bitcopy(data_parl[1][2][0],3 , data_sur[2][0],1);
bitcopy(data_parl[1][2][1],3 , data_sur[2][1],1);
bitcopy(data_parl[1][2][2],3 , data_sur[2][2],1);

örnek olarak 3üncü tek parlaklıklı görüntünün 2inci satırının 30uncu sütunundaki pikselin ledlerinin yanık mı yoksa sönük mü durumunu, data_parl parlaklık matrisini kullanarak oluşturalım.
bitcopy(data_parl[30][2][0],3 , data_sur[2][0],30);
bitcopy(data_parl[30][2][1],3 , data_sur[2][1],30);
bitcopy(data_parl[30][2][2],3 , data_sur[2][2],30);

for döngüleriyle yazacak olursak;

seviye[8]={1,2,4,8,16,32,64,128};

for(s=0;s<7;s++){// parlaklıklı görüntü oluşur

   for(k=0;k<31;k++){// sütunlar yüklenir
      for(j=0;j<15;i++){// satırlar yüklenir
         for(i=0;i<2;i++){bitcopy(data_parl[k][j],s , data_sur[j],k);}// pikseller yüklenir
      }
   }

shftreg_up(data_sur); // s inci tek parlaklıklı görüntü shift registerlere yüklendi
panel_pwm(seviye); // panele s inci pwm seviyesi uygulandı.

delay();// eğer panele uygulanan pwm sinyali tekrar sonraki uygulanıncaya kadar en az 4 periyot tamamlayamaz ise biraz gecikme uygulanabilir.

}

Mucit23

Hocam teşekkürler. Şimdi biraz daha oturdu. Ben ilk yöntem üzerinde ufak bir deneme yapacağım. Çözünürlük zaten 6 bit olacak. Sonuç alamazsam eğer bahsettiğiniz yöntem üzerinde çalışma yapacağım. Tezgahı kurup lojik analyser ile bakayım hangi işlem ne kadar sürede tamamlanıyor. Ona göre kafamda hız hesabı yapabilirim.

Merak ediyorum. Acaba FPGA lı kartlardamı böyle bir yöntem kullanıyor acaba. Nasıl öğrenebiliriz bunu?

bmutlu

#73
Alıntı yapılan: hasankara - 31 Ekim 2014, 01:22:42

1. aşama tek parlaklıklı görüntüyü oluşturabilmek. (her ledin parlaklığını kendi içinde değerlendiriyoruz.)
2. aşama 8 adet tek parlaklıklı görüntüleri kullanarak, 1 adet parlaklıklı görüntü oluşturabilmek.


seviye[8]={1,2,4,8,16,32,64,128};


Seviye belirlemede 8 adet deger kullanıyorsunuz burada 8 bit (256) renk tonu nasıl elde ediyorsunuz ?

Bence her renk için 8 bit yani 1byte renk derinliği olacak ise bir piksel için 3 byte data tutulmalı ve buradan panel için 3 * 16 * 32 = 1536 byte bir ram bolgesine bilgi ram da saklanacak ise veya Rom (Eprom) da saklanacak ise 1526 byte ihtiyaç vardır .
Artık buradan yararlanarak bir algoritma ile bir pikseldeki 3 rengin verilerinden yararlanarak PWM dataları elde edilir her renk için ve sürülir.
Yukarıda bahsettiğim minimum sürme frekansını yukarıda hesaplamıştım ekranın tazelenme süreleri satırların PWM e bağlı olarak tazelenme zamanları.
Yukarıdaki konuşmalarda PWM işlemini OE ucu ile yapılma olayından bahsedilmiç . Bu işlem bu uçla yapılamaz çünkü bu uç ortak uç .
Ancak yapılabilmesi için her rengin OE ucu ayrı olması gerekir ..

Bir pikselin bir rengin PWM degeri elde etmek için ya lojik komparator ile çıkışın 1 veya 0 durumunu kontrol ederek donanımsal olarak yaparsın .
Yada bir dongü içinde bir sayıcı degeri 1 arttırılarak piksel değerinin datası ile karşılaştırma yapılarak büyük küçük durumuna göre 1 veya 0 durumu elde edilir.
bu bilgi ile PWM durumu elde edilmiş olur o pikselin rengi için..



mesaj birleştirme:: 31 Ekim 2014, 12:00:41

Alıntı yapılan: Mucit23 - 31 Ekim 2014, 11:54:03

Merak ediyorum. Acaba FPGA lı kartlardamı böyle bir yöntem kullanıyor acaba. Nasıl öğrenebiliriz bunu?

Yukarıda anlatılanlar donanımsal olarak bit bazında işlem yapılıyor (lojik komparator gibi) donanımsal işlemler çok hızlı olduğu için bu işlemler kısa sürede bitiyor..

hasankara

bu arada sayfada yazım şekli için kötü görünmüş bir kısım tekrar yazayım.
seviye[8]={1,2,4,8,16,32,64,128};

for(s=0;s<7;s++){// parlaklıklı görüntü oluşur

   for(k=0;k<31;k++){// sütunlar yüklenir
      for(j=0;j<15;i++){// satırlar yüklenir
         for(i=0;i<2;i++){bitcopy(data_parl[k][j][i],s , data_sur[j][i],k);}// pikseller yüklenir
      }
   }

shftreg_up(data_sur); // s inci tek parlaklıklı görüntü shift registerlere yüklendi
panel_pwm(seviye[s]); // panele s inci pwm seviyesi uygulandı.

delay();// eğer panele uygulanan pwm sinyali tekrar sonraki uygulanıncaya kadar en az 4 periyot tamamlayamaz ise biraz gecikme uygulanabilir.

}


bmutlu 8 bit renk tonu değil parlaklık tonu elde ediliyor. buda 3 renk led olduğunda 24 bit renk derinliği anlamına geliyor. parlaklık bilgileriyle zamana yayılarak farklı kombinasyonlarda her ledin parlama sürelerinin toplanması ile 256 farklı parlaklık kademesi elde ediliyor demek.

bu arada vermiş olduğum örnekte kullanabileceğimiz panelin sürülme metodunu da belirttim buna göre bir kod örneği oluşturdum. Ancak panel, tarama metodu ile sürülüyorsa benim yazdığım gibi tek solukta tek parlaklıklı görüntü oluşturulamayabilinir. shftreg_up(data_sur); bu satırda ki fonksiyon tüm tarama işlemlerini yapabilecek şekilde düzenlenebilir ancak diğer for döngüleri çok zaman alırsa tam periyodik bir tarama elde edilemeyebilir buda panelde oluşan görüntüde ilk taraması yapılan parçalar ile son taraması yapılan parçaların kendi aralarında genel bir parlaklık farkı oluşmasına sebep verir. bu, hesapta olmayan bir durum diğer deyişle problem dir. Bu problemi,  shftreg_up(data_sur); fonksiyonunu tam periyodik olarak işleme ile elde edebilirsin. aynı zamanda for(s=0;s<7;s++) döngüsünü de tam periyodik işleyebilmek gerekiyor. fpga olunca periyodiklik konusunda bir kuşku kalmıyor bu yüzden bu iş için fpga biçilmiş kaftan olarak görülebilinir. piksel yükleme for döngülerini tek cycle da bile halledebilmek gibi avantajları, ek arayışlardan kurtarabiliyor.