18f4550 LCD HIZ Sorunu

Başlatan Franisto, 19 Temmuz 2010, 02:11:29

Franisto

Merhaba arkadaşlar. 18F4550 ile lcd li usb klavye geliştiriken lcd ve kristal konusunda kafam karıştı.

örnek aldığım projede

    Xtal = 48										' Set the oscillator speed to 48MHz (using a 20MHz crystal)


komutu kullanılmış. proje usb klavye olarak çalışıyor. Sorunum projeye 2x16 lcd ekledeğim zaman isis; Controller received command wilst busy hatası veriyor.

Declare LCD_CommandUs 50000
Declare LCD_DataUs 200

komutlarını yüksek değerler ile girdiğim zaman sorun nispeten azalıyor. aslında isiste sorun hiç kalmıyor fakat projebord üzerinde deneme yaptığımda bazı 2x16 lcd ler (değişik marka) çalışmıyor.  öyle yada böyle tüm 2x16 larda çalışmalı. 4 mhz ile denediğim zaman sorun çıkmıyor fakat 20mhz kristal ile bazı lcdler başlamıyor.

umarım anlatabilmişimdir. fikir ve önerilerinizi bekliyorum.

radres

LCD sürelerinin tespitinde derleyicin 20Mhz'i dikkate alıyor 48Mhz olayını dikkate almıyorsa bu sorun oluyordur. Yanlış hesaplanan gecikme süreleride bazı LCD'ler için çalışma sınırları dahilinde olduğundan sorun olmuyor bazıları için ise sorun oluyordur. Örneğin devrenizi 48 MHZ kullanmadan (PLL ile yapılan  bu işi yapmayın). Direkt 20Mhz'de çalışacakmış gibi osilatör ayarını yapıp 20Mhz takarak deneyin. Eğer çalışırsa demekki yazdığınız programda derleyici sizin 20Mhz kristal ile PLL işlemiyle 48Mhz elde ettiğinizi görmüyor demektir.

muhittin_kaplan

4550 de USB için 48 Mhz gerekli. Bunu PLL kullanarak yapıyor. Eğer 20 Mhz Kullanıyorsazız PLLDIV oranını 5 secmeniz gerek. Belki Şu Olabilir. USB için 48 ,CPU için 4 Mhz de çalıştırabilirsiniz. Bunuda USB_CLOCK u PLL,CPU_CLOCK u OSC1 olarak ayarlamanı zgerek.(hiç denemedim)

esensoy

44780 uyumlu lcdlerde db7 bacağı lcd nin busy flag i olarak kullanılıyor,

lcd driverında komut gönderirken 7. pinin 0 olmasını bekleyecek şekilde modifikasyon yaparsanız osilatörden bağımsız olarak devreniz çalışacaktır.

detay bilgi için:
http://home.iae.nl/users/pouweha/lcd/lcd0.shtml
En tehlikeli an "zafer" anıdır.

Franisto

Alıntı yapılan: emresensoy - 19 Temmuz 2010, 15:25:40
44780 uyumlu lcdlerde db7 bacağı lcd nin busy flag i olarak kullanılıyor,

lcd driverında komut gönderirken 7. pinin 0 olmasını bekleyecek şekilde modifikasyon yaparsanız osilatörden bağımsız olarak devreniz çalışacaktır.

detay bilgi için:
http://home.iae.nl/users/pouweha/lcd/lcd0.shtml

tam olarak anlayamadım. kabaca db7 bacağını şase yapsak çalışırmı? biraz daha açıklarmısınız. teşekkürler.

radres

Hayır. Programında LCD'ye komut göndermeden önce 7. pinin sıfır olup olmadığını kontrol et diyor. Bu pin sıfır ise LCD'ye yeni komut gönderebilirsin. Genelde ya bu şekilde LCD'nin busy flag'i kontrol ediliyor ya da bu bayrak hiç kontrol edilmeden belli bir süre beklenip yeni komut gönderiliyor. Son söylediğim metotta işte bu bekleme süresini her LCD kontrollücüsüne uymayabiliyor.

Franisto

anladım sanırsam. den declarenin hemen ardından test için lcd ye data gönderiyordum gerçi araya delayms koydum yinede olmadı. sorun ilk çalışmada çıkıyor. eğer ilk başta bir şekilde çalşırsa sorun çıkmıyor.

şimdi ben lcd yi programda declare ettikten sonra if ile önce db7 bacağına bakıp 0 ise data gönderecem gibi bir şey anladım. akşam deneyeceğim.

teşekkürler.

radres

Birde devrene ilk enerji geldiğinde LCD direkt çalışacaksa yani programın böyle işliyorsa LCD'yi çalıştırmadadan önce programda biraz gecikme koy. Bazı güç kaynaklarının 5v'a ulaşma süresi yavaş olabiliyor buda LCD'nin reset devresi çalışmamasına dolayısıyla doğru çalışmamasına sebep olabiliyor. Bu nedenle PIC'e eneri gelince şöyle 1 sn bekletip programı öyle çalıştırırsan bile LCD'din daha sağlıklı çalışacaktır.

Franisto

önce programın başına, lcd yi declare ettikten sonra 1 sn delay koyarak programda geçikme sağladım. sorun ortadan kalktı. elimdeki tüm lcd ler çalışmaya başladı.

Sonrasında test amaçlı delayları kaldırarak programı ilk haline getirip derledim. tekrar denedim sorun çıkmadı. Şimdi nasıl oldu bu iş  :o

Neyse öyle yada böyle sorun çözüldü. programı başlamadan bekletme fikride çok hoşuma gitti. Teşekkürler.

esensoy

sonuçta lcd içinde de bir işlemci, bunun içinde koşan bir program ya da devreler dizisi var,
enerjilendiği anda önce kendine reset atıyor ve kullanıma hazır hale gelene kadar bir takım işlemler gerçekleştiriyor,
sen o 1sn beklemeyi koymadan evvel muhtemelen lcd hazır hale gelmeden veri göndermeye başlıyordun ve lcd komutları doğru işleyemiyordu,
bu durumu bekleme ile çözdün,
deneme yanılma ile 1sn yi de düşürebilirsin diye düşünüyorum,
selamlar.
En tehlikeli an "zafer" anıdır.

radres

Sorununun çözüldüğüne sevindim.