M

LCD 'de Karakter Göremiyorum? Hatayı Buldum ama Sorunu Bulamadım :)

Başlatan mavikaplan, 20 Ekim 2012, 19:37:47

mavikaplan

Merhaba, saat uygulaması için bir program yazdım. Saat 16x2 LCD Displayde gözükmekte. Program PsPice 'daki devresinde düzgün bir şekilde çalışmakta. Ama devreyi gerçekte kurduğumda çalışmamaktaydı, program kodlarındaki WDT_OFF komutunu kaldırınca kodlar breadboard 'a kurduğum devredede çalıştı.

Peki neden WDT_OFF komutu varken LCD karakter göstermiyorda bu komutu kaldırınca düzgün bir şekilde çalışıyor?

greatgonzo

wdt yani watch dog timer , programın kısır döngünye girip kilitlenmesini engellemek için bir sigortadır. Yapılan her işlem için zaman sayar. Eğer işlem bitmeden zaman dolarsa reset atar. Sizin  proramınızda da wdt taşması, işlemin sonuclanmasından hızlı olduğu için reset atıyor ve her yeni başlamada o noktada gerçekleşiyor. Muhtemelen lcd bir yana tüm  programınız çalışmıyor. Proteus ta simüle ettiyseniz çalışabilir çünkü gerçekle simülasyon arasında en belirgin fark zamanlamadır.

Çözüm olarak ya yaptığınız gibi WDT off olacak yada WDT taşma zamanını ona göre ayarlamalısınız.

mavikaplan

Ama sizin dediğinize göre WDT_OFF komutu eklediğimde programın sorunsuz bir şekilde çalışması lazım ama tam tersi bir durum var. WDT_OFF komutunu kaldırınca program devre üzerinde düzgün bir şekilde çalışabiliyor.

PsPice için fark etmiyor, WDT_OFF komutunu kullansamda, kullanmasamda PsPice 'de devre çalışıyor.

greatgonzo

Gayet ilginç bir durum. Şu olabilir siz wdt off ibaresini kaldırdığınız varsayılan bir değerle çalıştırılıyor olabilir. Yani bu sigorta ayarını kullanma zorunluluğunuz vardır ama siz yazmadığınızda derleyici otomatik olarak bir değer ekler ve bu değer sizin lcd de yazıları görmeniz için yeterli geliyordur. Bu noktadan sonra wdt reset atıp başa dönüyordur. Yani bir sorun olmalı ki wdt off dediğinizde tamamen kirtleniyor ve hiçbirşey görmüyorsunuz. Programı incelemek lazım.

Mantıken ben böyle düşünüyorum.  Yine hocalarımız bir yorum getirirler elbet.  WDT senin için önemliyse bence onun yapısını öğren .

mavikaplan

Yardımınız için teşekkür ederim :), WDT 'dan bir problem oluşturmuyormuş. Low Voltage Program (LVP) 'nin enable olması problem oluşturuyormuş.
Program başında şu kodu denediğimde program devre üzerinde çalışmıyordu:

#config
__config _WDT_OFF
#endconfig

Ancak şu kodu yazınca çalışmaya başladı:

#config
__config _WDT_OFF & _LVP_OFF
#endconfig


Yukaridaki kodlardan görüldüğü üzere sadece WDT_OFF yaptığımda USBPIC Programı LVP 'yi otomatik olarak ENABLE yapıyordu. WDT_OFF 'a ek olarak LVP_OFF yazdığımda program devre üzerinde düzgün çalıştı.

LVP neden sorun oluşturuyor bir bilginiz var mı?

ete

İşlemcide LVP yani düşük voltaj (5v) programlama pini var ve bu pin seçenekli olarak giriş çıkış pini olarakda kullanılıyor. Lvp yi iptal etmez isen o pin programlama bacağı olarak kalıyor ve giriş çıkış işlevi görmüyor. Sen de lcd pinlerinden birini oraya bağladı isen lcd çalışmıyacaktır elbette.
Sebep ortada.
Ete

mavikaplan


sinancnc

benimde lcd çalışmadı acaba bende zaman taşması sorunu mu var ? deneyeceğim ben lcd çalışmasını birebir ete hocanın çalışmasından yaptım ama deneyeceğim değişiklik olursa yazarım...!
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

ete

Çalışmayan LCD lerde sorunu bulmak o kadar da zor bir şey değil. Sorunun yalnızca bir kaç sebeb dayanabilir. Bunları sıralarsak;
1. Besleme amaca uygun değildir yada LCD ye uygun besleme voltajı gelmiyordur.
2. İşlemci çalışmaz ise LCD de çalışmaz. Genelde işlemci çalışmadığı zaman LCD de görülecek durum şöyledir.
    Üst sıra kareleri siyah olarak görürsünüz. Bu LCD nin voltaj aldığını ancak gerekli kontrol komutlarını işlemciden alamadığını gösterir. İŞlemci çalışıyor ve LCD çalışmıyorsa yada kontrast uygun değilse genelde çift sıra halinde dolu kutucukları görürsünüz.
3. LCD de hiç bir şey gözükmüyor ise ya voltaj almıyordur yada bacakları ters bağlanmıştır. Yada en son ihtimal LCD bozulmuştur. Tabiiki işlemcinin çalıştığından emin olmanız gerekiyor.
Bu gibi durumlarda basit bir program işinizi kolaylaştırır.
Mesela 16F628 kullanarak; PortA.0 a seri 220 ohm üzerinden bir led bağlayarak programın çalıştığını anlamak üzere LED bir iki defa flash yaptırılır. Ardından LCD ye komut verilerek ekrana bir şeyler yazdırılır.
Bu programı örnek olarak aşağıya koyuyorum.
LCD nin Data pinleri PortB.4 den başlıyor.
RS pini PORTB.2 de
E pini PortB.3 de bağlı olacak.
LCD nin 1 nolu pinine GND verilecek.
LCD nin 2 nolu pinine +5V verilecek.
Lcd nin 3 nolu pinine 10K lık trimpotun orta ucu bağlanacak. Trimpotun bir ucu +5V ta diğer uçtaki pin ise GND ye bağlı olacaktır. Bu trimpot ile LCD de kontrast ayarı yapılacaktır. Orta ucun GND ye yakın durması tercih edilir.
Hepsi bu kadar.
Ete
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

define OSC 4
CMCON=7

PORTB=0:TRISB=0
PORTA=0:TRISA=0

DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor

I      var byte
SYMBOL LED=PORTA.0

Pause 200
LCDOUT $FE,1
Pause 200

BASLA:
      For I=0 to 5
         led=1
         pause 200
         led=0
         pause 200
      endIF
     
      lcdout $FE,$80," LCD KONTROL "
      lcdout $FE,$C0," etepic.com  "
      pause 500
      goto basla
     


Powered by EzPortal