16X32 RGB Panel hakkında

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

RaMu

Yapacağımız işlemi 2 komut ile yapabilirsek 50MHz hızında
3 komut ile yapabilirsek 33 MHz hızında bu işlemi yapabiliriz anlamında söylemiş,
tabi her komutu 1 saykılda işleyebilen 100MHz hızında çalışabilen bir mcu örneği için.

Konuyu takip ediyorum.
Uygulanması gereken algoritma ortaya çıktıkça ve bende anlamaya başladıkça
yardımcı olmaya çalışırım.

Bakmadım ama böyle bir mux vardır, 30MHz nin sıkıntı olacağını sanmıyorum.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

Mucit hocam bana guldu ama Ramu hocam beni anlamis :) hocam yazin bende boyle bir calisma yapmak istiyorum ama once kayan yazi yapacagim. cunki suan icin bu is beni cok asan birsey gibi duruyor. birde etrafta kayan yazilar goruyorum proje istahim kabariyor. suan yazi kaydirma algotirmalarini kafamda dusunuyorum. yaza eger boyle bir proje yapabilirsem forumda yine paylasacagim ::)

RaMu

Gözünde büyütmene gerek yok, yazı beklemenede,
Mucit i takip et aynı anda sende yapmış olursun.

Şimdi burada kayan yazı konuşmayalım, konu baltalanmasın,
istersen konu aç oradan konuşuruz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

iyildirim

#33
@Mucit23,

Hocam 6 ayrı SPI modülü olan bir mcu olsa bile panelin tek bir clock girişi  var. Ayrıca anladığım kadarı ile satırlar içinde veri aynı anda gönderildiğinden 7 SPI gerekecek.

Kullanılan SPI hızına göre de SPI modülleri 50-200 ns gibi bir zamanlama ile bunları senkronlamak gerekir. Gerçi çok da zor bir iş değil. Ama yazılımsal SPI da rahatlıkla kullanılabilir görünüyor.

Asıl konu paneli sürebilmekten daha çok ara renkler için PWM nasıl uygulanabilir gibi.

Farklı renk elde etme için farklı yöntemler olabilir tabii.
Benim ilk aklıma gelen RGB ledlerin hepsini aynı anda ON yapıp  farklı zamanlarda OFF yapmak. Yada farklı zamanlarda söndürme işininin bir kısmı farklı tazeleme peryodlarına da bölünebilir.

Panelin her bir satırının renklerini tek bir satır tarama peryodunda oluşturma yolunu seçersek yanlışım yoksa 8 bit PWM 'i 50 hz üzeri tazeleme  frekanslarında bile elde etmek mümkün görünüyor.

Paneldeki her bir 16 led sütunu için bir SPI gerekiyor.  Satırlar içinde tek bir tane.
Buna göre  bir çevrim için aynı anda 2 adet 16*16 panel 3 renk ten 6 kanal sütunlar, artı 1 kanal da satırdan  toplam 7 ayrı kanaldan 16bit veri gönderilmesi gerekli.

50 Hz lik tazeleme frekansı kullanılırsa,  bir tazeleme peryodunda bir satırın piksellerine yani 16 piksele 1250us zaman düşer. 1/(50hz*16satır)
En kötü durumda satırdaki 16 pikselin herbirinin farklı renk değeri olur. Her bir piksel için 3 ayrı RGB değeri olacağından, maksimum 0-255 arası 48 farklı değer olur. İlk olarak hepsi beraberce ON yapılan ledlerin 48 farklı OFF zamanı olur.

Gecikmeler vs. lerden dolayı bir satırın piksellerine 1ms kalsa, 10mhz lik spi ile 16 bit veri 1ms de en az 500 kere gönderilebilir. Ki en fazla 48 defa veri göndermek yeterli olacak.

100mhz lik MCU da bir SPI çevrimi için yani 7 farklı verinini bitleri vs hesabı için yaklaşık 150 clock gibi bir zaman kalır. Buda  iki farklı lede  PWM değeri olarak ardışık değer atanmışsa geçerli.

MCU hızı yeterli olmazsa tazeleme frekansı 30hz, SPI 2Mhz seçilirse yaklaşık 250 kere 16 bit veri SPI dan basılabilir. 16 bitlik bir gönderim içinde  800 clock işlem zaman kalır.
Algoritma nasıl olur açıkçası düşünmedim. Timer ile sayma, kesme vs kullanılabilir. İlgili satırdaki 96 ledin hangisinin ilk önce ve ne zaman off yapılacağını belirlemek konusunu çözmek gerekir.

Umarım gözden kaçırdığım bir nokta yoktur.

Mucit23

Hocam satır için SPI gerekmiyor. Onun için doğrudan GPIO lar ile 3 bit(A B C) binary sayım yapılıyor. Bu sayede 1-8  9-16 arası satırlar taranıyor. Bana 6 adet SPI yeterli

Dediğiniz gibi software pwm mantıklı olabilir. Çünkü tek clock darbesinde 6 adet SPI datası yollayabilirim. Olsa zaten mutlaka öyle yaparım. FPGA da öyle yapıyordur muhtemelen.
Fakat donanımsal tek bir SPI kullanırsam 10Mhz'in üstünde clock uygulayabilirim. Hata P10 panellerle uğraşırken 745hc595 19Mhz'e yakın bir sinyalde clock basmıştım.
Hangisi hızlı çalışır bilmiyorum. Deneyip tecrübe edip görmek lazım.


iyildirim


SPI hızı çok önemli değil hocam.

1536 ledin her biri için 8 bitlik Duty bilgisi olacak.
Tazeleme hızı 50 Hz olsun. 16 Satır var. 
Anlatmaya çalıştığım yöntemde her bir satırı 1/800 sn de 1+ 48 kez yenilemek gerekecek. Ama 8 bit duty istediğimiz için bu değeri 256 gibi düşünmek lazım.

Bir satırda 96 led var.
Çevrim başında ledleri yaktık.
Bir de duty sayacımız olmalı.
Duty sayacı her bir ledin duty değerinden büyük olduğunda ledleri söndüreceğiz. 
Tam bu noktada 96 karşılaştırma yapıp SDO için kullandığımız pine 0-1 atayacağız. Bunun da 1250 us / 256 gibi bir sürede yapılmasını hedefliyoruz.
SPI lar donanımsa olsa bile SPI ye verilecek verinin hesabı gerekli. İşlem gücü burada gerekiyor.

Bu yüzden SPI hızı yüksek olamayacak. Yüksek olmasının yararı da yok zaten.

Sürme tekniğinde dediğin gibi aynı anda iki satır taranıyorsa kontrol edilmesi gereken led puty değeri sayısı 192 olacak. 50 hz tazeleme de 100mhz lik işlemcide 96 led için 4-5 clock süre kalır..
FPGA kullanma nedeni bu..

8 bit duty okuyup, zaten registerde olan duty sayaca ile karşılatırıp, bir pine (ki aslında farklı 6 pin) 0 yada 1 yazmaktan bahsediyoruz. Bunu da 5 clock da yapacağız. Duty sayacı çevrim boyunca sabit olsa bile Atomic bit set-reset, bitbanding vs. yoksa read modify-write ile imkansız gibi. İşlemci hızı da, seçimi de bilginin bellekte nasıl organize edildiği de önemli.

Olduğu kadar deyip yine de bi denemeli  derim. Tazeleme frekansı ne çıkacak bakmak görmek lazım. Olmadı duty 7 bite düşürülür vs.

Mucit23

Şimdi düşünüyorumda donanımsal spi mux ile felan olmaz bu sistem. 6 adet spi data girişi var ve 6 sına birden aynı anda data basılması gerekir. Çünkü clock'lar ortak.

Eğer mux ile SPI data hattını gezdirseydim diğer SPI data hatları boştayken ya lojik 0, yada lojik1 alacaktı. Dolayısıyla Shift Registerlere istenmeyen değerler yüklenecekti. Clock ortak olduğu için tek bir shift registere data yollanırken diğerlerinin veri alması engellenemez. Donanımsal SPI mantığını çürütmüş olduk.

Anlaşılan aklın yolu bir. Koları sıvamak lazım.

İşin güzeli 74595 ile tek kanaldan 8 bit pwm oluşturdum. Fakat donanımsal spi ile yaptım. STM32'de şöyle bir durumla karşılaştım. SPI bufferine veri yükledikten sonra TXE flagını kontrol ederek buffer boşalmışmı boşalmamışmı kontrol edip latch sinyali yolluyordum.
SPI'da Bufferin daha yarısı boşalmamışken flag'dan buffer boşaldı sinyali alıyordum. Pek çözümleyemedim durumu.

RaMu

Mux spi shift register istenmeyen tüyler kısmını anlayamadım,
bence olur, istediğin shift register a diğerlerini etkilemeden veri basılır gibi geliyor,
sen bağlantı şeklini söyle ben nasıl olacağını düşüneyim,
konsepti ispatlamaya yetecek basit bir örnek olsun.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Mux yapılsa böyle birşey olacak



ABC girişleri ile SPI_DATA nın hangi girişe bağanacağı seçilir. Mux'un diğer bacakları seçilmemiş iken Sürekli Lojik1 de veya lojik 0 da kalır. Shift'lere clock uygulandığında MuX'un çıkışlarındaki dataları içeri alırlar. Mux olsun olması bu engellenemez.

RaMu

Anladım.
ZAten spi_data yı misal 6 ya çoklamak
6 tane spi miz olduğu anlamına gelmez.

Benim aklıma şöyle bir yöntem geliyor
tabi donanımsal 6 tane spi si olan bir mcu kullanmak daha mantıklı,
spi ler 8 bit data gönderiyor diye düşünelim,
o zaman 6 tane 8 pinlik mcu portunu > 6 tane 8 bitlik
paralel in serial out shift register a bağlayacağız
mcu nun 48 çıkışı pinine göndermek istediğimiz değeri yazacağız
artık 6 tane shift register a aynı anda clock verdiğimizde
mcu nun 48 pininde halihazırda yüklenen 48 bitlik veriyi 6 tane spi datasına çevirmiş olacağız.


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

M_B

Merhabalar;
RBG ye veri gonderim mantığı altaki gibi olabilir.
Bir ara 24x24 RGB ile calısırken aklıma gelmış ve henuz uygulama fırsatı bulamamıstım.
Bir mcu da 5/6 tane Donanımsal SPI yoktur. Olacagını da sanmam.
Bu iş coklamayla falan olmaz.
Bir tane yazılımsal SPI olusturulacak veri hattı olarak ta PORTl'ardan herhangi bir port Ornegin PORTB gibi (B0....B7 )
Anlatmak istediğimi şekil ile göstereyim. 


Bu konudaki düşünceleriniz nedir ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

RaMu

Alıntı yapılan: M_B - 14 Ekim 2014, 08:12:02
Bir mcu da 5/6 tane Donanımsal SPI yoktur. Olacagını da sanmam.
Bu iş coklamayla falan olmaz.

Falanla olmaz derken?

Benim dediğim senin yaptığının paralel hali
yani R G B verisi MSB den LSB ye tamamen tek seferde
mcu nun üç portuna veriliyor, shift registerlar seriye döndürüyor,
kazanç ne,
senin yaptığında 8 bit R G B verisi göndermek için
mcu ya 8 defa gönderilecek veriyi biryerden okuyup porta yazman lazım
benim dediğimde 8 bit veriyi 1 defa okuyup porta yazman 8 defa clock uygulaman yeterli
asm de daha yazsan ve hiçbir döngü kullanmasan
deli dolu bir ram in olsa (bu mümkün değil)
movf    ramreg1,w
movwf  RGB_PORT
herbir bitte en az 2 komut çevrimi kaybetmiş olursun,
ki gerçekte veriyi program hafızasından alacağın için
bu en az 6-10 komut çevrimi alır, hemde herbir bit için buna birde x 8 diyeceksin...

http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1005
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Hocam donanımsal spi ile olmuyor. Mcu da  6 adet spi olsa bile panelde tek clock girisi var. Bu yüzden soft spi şart. 

Zaten 74595 ile şuanda 100hz 8 kanal 8bit pwm çıkarıyorum.  Sıkıntı yok. Bunun sayısı artacak sadece. Oda henüz yeterince optimizasyon yapmadım. 

RaMu

1den fazla donanımsal spi kullanmadım ama
bence 6 adet donanımsal spi aynı anda 6sından birden data yollayabiliyor olmalı,
(böyleyse tek clock u bağlarsın olur biter)
yoksa niye 6 tane donanımsal spi olsun
chip select ile hatta olmasını istediğimiz spi yi seçerdik olur biterdi,
bu konuyu kesin bilmiyorum ama umutlu olmak lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hasankara

https://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.