Mesaj Panosundaki Titreme Problemi

Başlatan biteker, 20 Mayıs 2004, 20:40:26

biteker

Merhaba arkadaşlar ben 5x7 dot matrix display ler ile 30 karekterden oluşan bir mesaj panosu yaptım ama bazı sorunlarımlar var. dotmatrixlere aşağıdaki picbasic pro komutları ile veri yolluyorum bu kodlar ise aşağıda

KarakterSayisi=29    'Karkter sayısının bir eksiği
BitSayisi=209        'Toplam bit sayısının 1 eksiği
ShiftModu=1
hz=1
loop:
i=0
j=0
jj var byte
deneme var byte
BitHanesi=0
   for i=0 to 7
       jj=i
       for j=0 to KarakterSayisi
           read jj,deneme
           ShiftOut DATAPIN1,CLOCKPIN1,ShiftModu,[deneme]
           jj=jj+7
       next j
       
       b0=dcd BitHanesi

       ShiftOut DATAPIN,CLOCKPIN,ShiftModu,[b0]'126]
       
       if BitHanesi = 7 then
           BitHanesi=0
       else
           BitHanesi=BitHanesi+1
       endif
       'SEROUT2 so, baud, [#BitHanesi,13]
       high LATCH1
       high LATCH
           pause hz
       low LATCH1
       low LATCH
    next i

goto loop

bu kodları derleyip 16f877 microişlemcisne yükledim ve 20 mhz kristal ile çalıştırdım. dotmatrixlerde pic in dahili eepromuna kayıtlı veriler dot matrixde göründü yanlız karekter titreme yapıyor kullandığım dot matrixlerin geçikme zamanı 1ms pic in her bir kodu işleme zamanı ise 200us imiş döngüye baktığım zaman her seferinde aşağı yukarı 220 tane komut işliyor 200us x 220 =44ms yapıyor
benim sorum ise acaba dot matrixlerdeki titreme picin yavaş kalmasından yada dot matrixlerin çok hızlı olmasından mı kaynaklanıyor eğer böyleyse bu sorunu nasıl çözebilirim yada ben tamamiyle yanlışmı düşünüyorum

cevaplarınız için şimdiden teşekkürler

DumrulBey

Merhaba,

Verdiğin bilgilere göre ekran, aşağı yukarı saniyede 20 defa taranıyor. Normal bir insan gözü için 15 deseler de bunu, ellilere hatta yüzlere çıkarmak lazım. Zira uzaktan ekrana bakıp başımızı başka yene çevirdiğimiz sırada titreşim hissedilir.

Anladığım kadarıyla bahsettiğin problemde titreşim bakarken bile hissediliyor. Önerim tarama bölümünü ASM'de yazman. Büyük miktarda çevrim zamanı kazanırsın. Bir de sürücü olarak kullandığın tümdevre HC serisi gibi hızlı bir şey olsun. Belki mikrodeneyleyici hızlıdır da sürücü devren yetişemiyordur.

Devreni sürücü kısmını bize görsel yollardan örneklersen bir yanlışın varsa mutlaka arkadaşlar bildirir, yoksa önerilerimiz olabilir. Ayrıca HEX kodu bir yerlere yüklersen bazı simulasyon programları ile gerçek zamanlı benzeşim yapıp tarama frekansını hesaplarız. Tabi en iyisi sabit duran ekranda yanan herhangi bir lede giden çıkışı osilaskop veya frekansmetre ile ölçmek. Zira sahada çalışma zamanı hataları olabilir.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

dideco

Burada titremeye neden olan 2 etken olabilir:

1. displaylerine normal floresan ışığı altında bakıyorsan, ortaya çıkan stoboskop etkisi nedeniyle titreme artacaktır. YAni floresan lambalar da gözün algılamayacağı hızda (100 Hz) de yanıp sönmektedirler. 20 Hz tarama frekansı ile karışınca titreme belirgin hale gelebilir... (enterferans)

2. Zaten taramayı 20 Hz'de yapıyorsan bu da başka bir problem. Çünkü insan gözünde yorgunluğa ve ortamdaki ışığa bağlı olarak titreşimi algılama aralığında küçük kaymalar meydana gelebilir. Bu bazen 12 bazen de 18 Hz. olabilir. Ayrıca başın hareketi de titreşimi arttıracaktır. Başını sağa sola sallayarak bakarsan titreşimi daha kolay farkedersin (doppler etkisi)

Çözüm önerilerim:

1. tarama frekansını bir şekilde arttırmalısın. Bu aynı anda daha çok paralel bilgi çıkarmak ile de olabilir. Eğer 50 Hz'in katları şeklinde yapabilirsen çok daha etkili olacak ve floresan lambaların olumsuz etkisini azaltacaktır. Benim tecrübelerim  taramanın en az 40 Hz'de olması şeklindedir. Eğer yapabilirsen 60-70 Hz  bence en ideal ve her koşulda en sorunsuz olanııdır. Bu tarama frekansları kaç display modülü kullandığın ile ilgilidir. Eğer 2-3 display olsaydı 20 Hz bile çoğu zaman farkedilmeyebilirdi. Ama çok sayıda display modülü olduğuna göre gözün görüş alanı da daha geniş kullanılacağı için titreme daha kolayca algılanıyor malesefki. Bunun göz retinasındaki reseptör hücre katmanlarından (renk ve ışık algısı-rod ve koni)) sonra gelen görüntüdeki  kenar keskinliğinin sağlanmasına neden olan yan sinir bağlantıları ile yakından ilgisi var.

2. Bilgisayar monitörlerinde olduğu gibi taramayı "interlaced" yapabilirsin. Yani sırayla değil, satırları veya sütunları iç içe geçmiş sırayla tarayabilirsin. Bu da titremeyi oldukça azaltacaktır. Yine bir şekilde göz retinasını da aldatacaktır.

Ek önemli Bilgiler:
Bu arada tarama frekansını arttırdığında kulandığın LED ler ile ilgili bazı sorunlar ile karşılaşma olasılığın çok yüksek. Aktive ettiğin LED ler dışında diğerlerinin de sönük olarak yandığını göreceksin. Bunun nedeni LED lerin bir diyot gibi davranmalarının yanı sıra iç kapasiteleri ile de ilgilidir. LED in bir ideal diyot, seri ve paralel bağlı bir kapasitör ve direnç ile pilden oluştuğunu hatırlatırım) Ayrıca LED'ler yüksek voltaja dayanıklı bir diyot gibi davranmayıp yaklaşık 5-6 volt civarlarında sızdırmaya başlarlar. Bunların sonucu olarak iki farklı sorun ortaya çıkar ve çözümü aşağıdadır.

1. Eğer ledleri beslediğin sürücü katı 5 volttan daha yüksek bir gerilim ile besleniyorsa ortak tarama sütunları sürücülerine seri bir diyot bağlamalısın. Böylece tarama sırasında dolaylı olarak ters bağlanan led grupları 5V üstü potansiyel farklarında sızdırıp diğer ledleri istenmeyen şekilde yakmazlar. Hızlı diyot olması tercih edilmelidir.
2. LEd kapasitesi kaynaklı ve ledlerin aniden sönmemesi veya üzerlerindeki yükü diğer ledleri yakacak şekilde aktarmasını engellemek amacıyla her ortak sütunu taradıktan sonra devrenin yapısına bağlı değişen bir sürede (50 mikrosaniye ile 10 milisaniya arası olabilir) satır ve sütun sürücülerini tamamen kapalı duruma getirmelisin. Böylece taranan ledler tamamen sönecektir, veya üzerlerinde depolanmış yük diğer ledleri yakamayacaktır.

Bir başka ama nispeten önemsiz bir konu da tarama frekansı arttıkça LED ler daha sönük yanacaktır. Çünkü iç kapasite doluncaya kadar LED tam parlaklığına ulaşamaz.

Bu soruna da birkaç  farklı çözüm önerisi getirilebilir:
1. LEDleri süren devre sabit akım mantığı ile beslenmelidir. Böylece tarama hızına bağlı sorunlar nispeten ortadan kalkar. Devre biraz kalabalık olur.

2. LED'ler e düşük dirençler bağlanır. Böylece tarama sırasında ortalama akım normal değerlerde tutulur. Sakıncası: Eğer tarama bir şekilde durursa hattan geçen yüksek akım LEDlere zarar verir veya ömrünü kısaltır. Genellikle daha basit olması nedeniyle tercih edilen yöntem budur.

Bu arada da Sistemin uzun ömürlü olması bakımından LED lere ait datasheet dikkatle incelenmeli ve LED müsade edilen maksimum akım ve süre bilgileri öğrenilmeli ve bu sınırların dışına çıkılmamalıdır. Aksi takdirde başta çok parlak ve göz alıcı bir şekilde yanan ekran, birkaç ay sonra can sıkıcı bir şekilde solmaya, arızalanmaya başlayacaktır.
Bu belki küçük devrelerde önemsiz olabilir ama büyük ışıklı panolarda ne kadar can sıkıcı olacağını bilmem nasıl ifade edebilirim.

Sadece basit bir LED'li ekran tarama işleminin aslında ne kadar detayı olduğunu ve ne kadar da sorunu olduğunu belkide pek çoğumuz düşünmedi, farkında da olmadı. Ama hep söylüyorum, "profesyonellik detaylarda gizlidir".  (aslında burada söz edilmeyen daha pek çok küçük detay var ama... gürültü, baskı devre çizme tekniği, master-slave iletişim, sıcaklıktan etkilenme, besleme problemleri, şebeke voltajı değişikliğine bağlı problemler, kararlılık, nemden etkilenmeme vb...)
Eğer sorunların nedenlerini de bulabiliyor ve çözebiliyorsanız artık daha iyi projeler yapabilirsiniz demektir. Yukarıda saydıklarımın tümü birkaç yıl önce başıma geldi. Neyseki tedbirli davranıp büyük ışıklı pano montajı öncesi küçük prototipi üzerinde bu sorunları yaşayıp çözdüm, herşey bittikten sonra kabus yaşamadım.

Umarım bu bilgi paylaşımı ilgilenenlere yardımcı olur.

Herkese kolay gelsin

Salih

Konu şu anda beni ilgilendirmiyor ama Dideco arkadaşımıza
üşenmeden verdiği çok güzel bilgiler için teşekkür etmek istedim.
Kolay gelsin.

Veli B.

Sevgili Dideco,
Takdire şayan bilgiler için teşekkürler... :D  :D  :D

ise

dideco arkadaş söylecek bir şey bırakmamış ama program açısından bir önerim olacak. ledlerin yanma zamanını timerlara yükleyip interrupt olarak kullanırsa zamanlama işlemi daha iyi  olur. ram da display karekteri kadar bir yer işgal edip (30*5= 150byte ) gibi  oaradan dahili okuma yaptırırsa program daha hızlı çalışacak ve led yanma zamanına daha çok zaman kalacaktır

sezgin05

Dideco'ya teşekkürler...
Problemle ilgili bir küçük ayrıntıda benden:Taramada normal Shift Register yerine Latch özellikli bir Shift register kullanılabilir.Örneğin 74164 yerine 74595 gibi.Kolay gelsin.

aster

sevgili dideco,
bu yazının ana sayfada makale olarak bulunması sanırım daha faydalı olacaktır
ekliyeceğin ilaveler varsa yazını orada görmek isteriz
kabul edersen yazını aster@picproje.org 'a gönderebilirsin

biteker

cevap veren arkadaşlara teşekkür ederek başlamak istiyorum ilk önce

30 karakter için olan sorunu hz değişkenini 0 yaparak çözdüm yanlız bir 30 karekter daha ekleyip devreyi 60 karektere çıkardığımda yine aynı titreme problemi ile karşılaştım döngü 2 katına çıktığında bu sefer elimde azaltacağım bir değişkenim kalmamıştı ve arkadaşların verdiği çözüm önerilerini araştırmaya başladım ama aynı anda nasıl daha çok parelel bilgi çıkararak tarama frekansını artıracağımı bulamadım bu konu hakkında bana yardımcı olabilirecek arkadaşlar varmı acaba?

thief arkadaşımın verdiği cevaba gelince verileri ram a yükleyip oradan dahili okuma yapma fikri 30 karekter için uygun bir çözüm olmasına rağman 60 karakterlik bir devre için uygun görünmüyor çünkü 60x7=420 byte yapıyor 16f877 nin datasheet ini incelediğimde ise ram in 368 byte olduğunu gördüm birde thief arkadaşımın önerilerinden biri olan "ledlerin yanma zamanını timerlara yükleyip interrupt olarak kullanmak" konusunu araştırmaya başladım bu konu hakkında hiç bir teorik bilgim yok bu çalışma ile ilgili çıkan sonuçlarıda buraya bildiririm gene

birde 60 karakter kullandığımda 16f877 nin dahili hazızası yetmediğ için 24lc16b harici eepromunu kullandım ama bu 30 karakterde bile problem çıkartmayan programda titreme problemi yaptı sanırım 24lc16b dahili hafızadan daha yavaş sorunun kaynağı bu olmalı bu durumda bana en az dahili eeprom kadar hızlı olan bir bellek lazım yanlız microchipten inceleğim kadarı ile i2c protokonu kullanan bütün eepromlar aynı hızda sanırım başka bir protokol ve farklı bir eeprom kullanamak lazım bu konuda önerileri olan arkadaşlar varmı acaba? yada bir şekilde dahili hafıza bir karakter için tuttğum 7 byte lık yeri azaltmam lazım ben bir karalteri görüntülemek için 5 bitten oluşan 7 tane veriyi 74hc595 lerden yolluyorum dolayısıyla her bir karakterin her bir biti en fazla 31 oluyor (11111 = 31)  toplam bitlerin değeri ise en falza 31 x 7 = 217 oluyor benim aklıma gelen ise bir şekilde bu 7 biti birleştirip bazı flag larıda ekleyip bir byte lık bir veri elde edip (sanırım bir sıkıştırma algoritmasına benzeyecek) sonra bu veriyi çözerek 74hc595 lerden yollamak böyle bir algoritmayı bilen bir arkadaş varmı yada kodlanabilirliği konusundaki görüşleriniz neler? gerçi döngü içinde böyle bir veriyi çözmek pic i daha çok zorlayacak ama belki başka uygulamalarda kullanılabilir

son olarak devre şemasınıda mesajıma ekleyerek cevaplarınızı ve çözüm önerilerinizi bekliyorum şimdiden teşekkürler


DumrulBey

Merhaba,

Bence harici EEPROM'u metinleri yüklemek için kullanmalısın. Karakter bilgilerini ise dahili belleklere yerleştirmelisin. Sana cevap yazarken Thief arkadaşımızın önerdiği RAM'i kullanma fikri aklımdan geçmişti. Ne kullandığını tam olarak bilmediğim için önermedim. Ama dediği doğrudur çünkü RAM daha hızlı veri akışı sağlayacaktır. Dolayısıyla hız istiyorsan RAM tercih etmelisin ki, yeterli olmadığı durumlarda aynı harici EPROM bellekler gibi RAM belleklerde mevcuttur. Forumda arama yaparsan PIC ile SDRAM kullanımı hakkında örnekler bulabilirsin.

Ancak benim anlamadığım 368 bytelık alan niye yetmiyor? Zira burada 7 bitlik her sütun bir byte ediyorsa 368/5, aşağı yukarı 70 karakter ekran hafızası eder. Bu arada 7x5 noktalık ekran yerine 8x5 matris kullanabilirsin. Aslında en mantıklısı alfabeyi her karakter 5 bytelık diziler oluşturacak şekilde, noktalama işaretleriyle birlikte program başında EPROM'dan RAM'e yerleştirip (50x5 olsa 250 byte eder ki RAM yeter de aratar bile) çağrılacak bir alt program ile okuyacağın herhangi bir yerden (dahili/harici EPROM, PC veya MODEM) sadece metni alman, bellekten kaynaklanan hız problemlerini çözecektir.

Bilmem yanılıyor muyum? Diğer arkadaşlar, özellikle bu işi profesyonel yapmış olanlar ne düşünmekte? Ben bu tür ekranlar tasarlamadım ama bence tıpkı ses uygulamalarnda ve karakter ROM'larında olduğu gibi, veriyi küçük parçalar halinde değerlendirmek gerekir. Küçük parçalar, veri referans alınarak birleştirilip tekrarlardan olabildiğince tasarruf edilmez mi? Bence böyle basit bir konuda sıkıştırma algoritması falan da yazmaya gerek yok. Ayrıca XNHCX arkadaşımızın yeni güncellediği şu başlığı takip etmenizi tavsiye ederim:

Kayan Yazı ve Mesaj Projeleri: https://www.picproje.org/index.php/topic,621

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)