Pic16f877a ile LCD sürerken PORTC - PORTD farkı

Başlatan hakerten, 07 Ocak 2017, 19:21:06

hakerten

Arkadaşlar merhaba, 
PIC16F877A ile LCD süren bir devrem var. PORTC ile sorunsuz çalışıyor, ancak PORTD'den çalıştırmak istediğimde yazılar çıkmıyor.
PORTD'nin pinlerinin düzgün çalıştığından emin olmak için ayrı bir kodla PORTD'den LED yakmayı denedim, sorunsuz çalıştığını görüyorum.
Acaba PORTC ile PORTD arasında bu anlamda teknik bir fark olabilir mi?
PSPMODE'unu devredışı bırakmak için TRISE.4=0 de yaptım.  Bu konuda bana yardımcı olursanız sevinirim.
MPLAB'de PICBASIC ile yaptığım kod aşağıdadır :

@ __config _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF  
ADCON1=7
cmcon=7
OPTION_REG.7=0

DEFINE OSC 4
DEFINE LCD_DREG  PORTD 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT  4  'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG  PORTD 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT  3  'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTD 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1  'LCD RS bacağı Hangi Bite bağlı ? 
DEFINE LCD_RWREG  PORTD
DEFINE LCD_RWBIT 2
DEFINE LCD_BITS  4  'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2  'LCD Kaç sıra yazabiliyor
   
PORTD=0
TRISD=0
trise.4=0
low portD.2
LCDOUT $FE,1:PAUSE 500
             
BASLA : 

lcdout $fe,1,"   DENEME 1 "
lcdout $fe,$C0, "  DENEME 2"
PAUSE 500 
GOTO BASLA
END

Yardımlarınız için şimdiden çok teşekkürler.
Hakan

ete

PORTC ile PORTD arasında LCD kullanımı açısından hiç bir fark yoktur. Her iki port da da LCD nin sorunsuz çalışması gerekir. Sende neden farkediyor onu bilmem. Ancak LCD nin bir açılış prosedürü var ve sen buna uymamışsın.
LCD kendi içinde bir sürü registeri olan aktif bir elemandır ve ilk açılışta onu initalize denilen başlatma işlemine sokmak gerekir. Bunu yolu da BASLA satırından evvel mutlaka;
LCDOUT $FE,1 komutunu verip peşinden en azından 200 ms lik bir gecikme uygulamak gerekir. Bu komut LCD yi başlatır. İçindeki kendi registerleri yerli yerine yerleşir ve bu işlem yaklaşık 150 ms sürer. Bu nedenle biz 200 ms lik bir gecikme veriyoruz yada vermeliyizki LCD henüz açılmadan ona bir komut vermeyelim diye.
Sen LCD yi başlatmadan direk programda kullanmaya geçiyorsun ki bu Başlat satırından sonra LCD nin açılıyor olması anlamına gelir ve bu bazen başarılı bazen başarısız olabilir. Senin LCD tesadüfen çalışıyor anlayacağın.
Programını değiştirmeden sadece LOW PORTD.2 komutundan sonra LCDOUT $FE,1 :PAUSE 200 komutlarını ver ve her iki port için yeniden dene bakalım sonuç ne olacak.

Bu arada yeni dikkatimi çekti. BASLA satırından evvel ayrıca PAUSE 300 şeklinde bir ikinci gecikme daha ekle programa. Buda Pic in kendi registerlerini açılışta yerleştirmesi için gereken gecikmedir. Böylece pic bu gecikmeden sonra kullanılmaya hazır hale gelecektir. BASLA satırından sonra yer alan PAUSE 500 satırınıda LCD komutlarından sonrasına yazmanda fayda var.
BUndan sonra da END yerine GOTO BASLA komut satırını ekle.
Yada en iyisi ben yazdıklarını düzelteyim onları alıp yeniden kullan bakalım sonuç ne olacak.

Ete


hakerten

Ete hocam merhaba,

Sizin gönderdiğiniz kodu da yükleyip çalışmayınca, sorunun devre kartında ya da PIC'te olabileceğini düşündüm.  Breadboard üzerinde sıfırdan kurdum.  PIC'in portD'si bozulmuş sanıyorum, çünkü portC'si breadboard'da LCD'yi çalıştırdı. Breadboard'da yeni bir PIC'le denedim, portD de çalıştı.  Sonra da yeni PIC'i devre kartımda denedim, çalışmayınca, devre kartında da sorun olduğu sonucuna vardım.  Belki de eski PIC'in portD'sinin bozulmasına yol açan şey devre kartımdaki bir hata idi. Tek tek lehimleri ve bağlantıları kontrol ettim ancak sorunu bulamadım.  Belki de devre kartını baştan yapmam gerekebilir.  İlk devre kartım olduğu için sanıyorum lehimler ve bağlantı yolları biraz amatörce oldu.  Soğuk lehim problemi olabilir. Umarım sorunu çözebilirim.

Desteğiniz için teşekkür ederim.
iyi geceler.

Hakan

dexta64

#3
PORTD'de Parallel Slave Port Kapatılmalıdır. Yoksa LCD'de problem oluyor.
TRISE register'inin 4. biti 0 yapılmalı.
bit 4 PSPMODE: Parallel Slave Port Mode Select bit
1 = PORTD functions in Parallel Slave Port mode
0 = PORTD functions in general purpose I/O mode

Devre montaj durumuna geldiğinde muhakkak kısa devre kontrolü ölçü aletiyle yapılmalıdır.
Asit karışımı düzgün yapılamadığından arada erimeyen ve gözle görünmeyen kalıyor.

Powered by EzPortal