LCD'ye görüntü gelmiyor.

Başlatan aristo, 01 Temmuz 2005, 12:49:08

aristo

Merhaba,

Belki çok basit bir çözümü vardır ama ben bulamadım. Aşağıda eeproma veri yazma ve veri okuma işi yapan bir program var. Proteusta devresini kurdum fakat bir türlü görüntü elde edemedim. Yardımcı olursanız sevinirim.

NOT: Programın %99u başka bir yerden alıntı olup, devre çizimi bana aittir.

'****************************************************************
'*  Name    : Eprom.BAS                                         *
'*  Author  :                                                   *
'*  Notice  :                                                   *
'*          :                                                   *
'*  Date    : 30/06/2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Define LCD_DREG   PORTD
Define LCD_DBIT   4
Define LCD_RSGREG PORTE
DEfine LCD_RSBIT  0
DEFINE LCD_EREG   PORTE
Define LCD_EBIT   1
DEFINE LCD_RWREG PORTE 
DEFINE LCD_RWBIT 2

SCL var PORTC.3 'clock pini
SDA var PORTC.4 'data pini

B0 var BYTE 'adres
B1 var byte 'data 1
B2 var Byte 'data 2

  ADCON1=7 ' tüm portlar dijital
  low PORTE.2
        
  pause 100
  
For B0 = 0 to 15 
    B1 = B0+100
    I2cwrite SDA,SCL,$A0,B0,[B1] ' datayı adrese yaz
    pause 10
Next B0

Loop:
For B0= 0 to 15 step 2
    i2cread SDA,SCL,$A0,B0,[B1,B2]   ' iki adres beraber okunuyor
    
   lcdout $fe,1,#B0,": ",#B1,"  ",#B1,#B2,"  "
     
    pause 1000
      
   next B0
    
    goto Loop
    
    end



ete

Bir önerim olacak dene ve sonucu bildir lütfen.

Programın başına port yönlendirme komutlarını koymayı unutmuşsun. aşağıdakileri ilave et.
TrisE=0
TrisD=0
TrisC=%00010000
ayrıca,
ADCON1=7 ' tüm portlar dijital
****  low PORTE.2 Bu satırı kaldır hiç bir fonksiyonu yok.*****
Bunun yerine
LCDOUT $FE,1 satırını koy.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

aristo

Öncelikle hızlı cevap için teşekkür ederim.

Dediğini yaptım  fakat değişen birşey olmadı. Yeni önerilerinizi bekliyorum.

ete

O halde ben devreyi bir kurayım sonra cevaplarım tekrar.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

Hatanı buldum. Küçük bir şey ama sonuca etkisi büyük.

Define LCD_RSGREG PORTE

bu satırı şöyle düzelt

Define LCD_RSREG PORTE

veya tüm programı aşağıdaki ile değiştir.
TrisC=%00010000
Trisd=0
TrisE=0


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		PORTe	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		1		'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTd   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG	PORTe	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	0		'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


SCL var PORTC.3 'clock pini 
SDA var PORTC.4 'data pini 

B0 var BYTE 'adres 
B1 var byte 'data 1 
B2 var Byte 'data 2 

  ADCON1=7 ' tüm portlar dijital 
  lcdout $FE,1 
        
  pause 100 
lcdout $fe,1," erol"
pause 2000  
For B0 = 0 to 15 
    B1 = B0+100 
    I2cwrite SDA,SCL,$A0,B0,[B1] ' datayı adrese yaz 
    pause 10 
Next B0 

Loop: 
For B0= 0 to 15 step 2 
    i2cread SDA,SCL,$A0,B0,[B1,B2]   ' iki adres beraber okunuyor 
    
   lcdout $fe,1,#B0,": ",#B1,"  ",#B1,#B2,"  " 
      
    pause 1000 
      
   next B0 
    
    goto Loop 
    
    end



Kolay Gelsin
Erol
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

aristo

İlgin ve yardımın çok teşekkür ederim. Şu anda sorunsuz bir şekilde çalışıyor.
Daha dikkatli olmakta fayda var :)

aristo

Bir dikkatsizlik daha..:)

Programın düzgün çalışması için adres değişkenin  word olarak tanımlanması gerekiyor. Gerçi arada bazen sapıtıp alakasız bir değer gösterdiği de oluyor.(110 yerine 85 göstermek gibi mesela). Sebebini bilmiyorum..

B0 var word 'adres
B1 var byte 'data 1
B2 var Byte 'data 2

ete

I2C tipi eepromlarda, Şayet yazılacak veya okunacak değişkeni Byte tipinde seçer isen adres değişkenide 8 bit olmalıdır. Şayet bilgi Word tipinde ise o zaman Adres de Word tipinde olmalıdır. Dolayısıyla söylediğin çok doğru değil.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Veli B.

Bana bir karışıklık var gibi geldi.Bu durumda, atıyorum 24c64 serisi bir eproma datayı byte olarak yazamıyacağım.Çünki byte olarak adrsleme yetmeyecek.Adresi word olarak verirsem de data word olmak zorunda. Bu ise kapasiteyi ikiye bölmek demek. Sanırım ben yanlış anladım...

picman

arkadaşlar bende de bi lcd sorunu var devreyi ve progranı proteusta deniyorum çalışıyor ama gerçek ortamda bifaaliyet yok lcd de acaba bu nedendir bütün bağlantıları defalarca kjontrol ettim lcd nin ayaklarınıda pic in ayaklarınıda bir türlü çalışmadı devrede birde buzzer var pic in çalışıp çalışmadığını anlamak için koydum buzzerden istediğim ses çıkarken lcd de görüntü yok şimdi bu sorun neden kaynaklanabilir elimdeki lcd nin arkasında 1602-01 yazıyor ayak bağlantıları da hd44780 işlemcili lcd ile uyumu sırasıyla vss vcc vo rs rw e ve data ucları var bu durumda lcd yi pbp da kontrol edebiliriz dimi çünki benim bildiğim pbp sadece hd44780 işlemcili lcd yi destekliyor.
TRISB=0 
TRISC=255
TRISD=0
PORTB=$0F
PORTC=0

 @ device pic16F877, XT_OSC, wdt_off, pwrt_on, protect_off 

DEFINE LCD_DREG                 PORTB     
DEFINE LCD_DBIT                     4                  
DEFINE LCD_EREG                 PORTD       
DEFINE LCD_EBIT                     2            
DEFINE LCD RWREG                PORTD        
DEFINE LCD_RWBIT                    1               
DEFINE LCD_RSREG                PORTD       
DEFINE LCD_RSBIT                    0                 
DEFINE LCD_BITS                     4                   
DEFINE LCD_LINES                    2      

           
        ADCON1=7
        
I var byte  
I=0        
Low PORTB.2                      
LCDOut $FE,1                     
pause 500    

 
                          
BASLA:
IF (PORTB.4=1) or PORTB.5=1 or PORTB.6=1 or PORTB.7=1 or PORTC.0=1 or PORTC.1=1 or PORTC.2=1 or PORTC.3=1 or PORTC.4=1 or PORTC.5=1 THEN
    LCDOut $FE,1
  else 
   
   lcdout "ERBAY SOGUTMA "
    lcdout $FE,$C0,"PAKGOLD16 CIHAZI"
    sound portc.6,[100,20]
 
endif
IF PORTB.4=1 THEN 
    LCDOUT "1. PIN AKTIF  " 
    PAUSE 500
    LCDOut $FE,1 
    PAUSE 500 
    PORTB.4=0
endif

IF PORTB.5=1 THEN
    LCDOUT "AYBP.ARIZA"
      PAUSE 500  
      LCDOut $FE,1 
      PAUSE 500
      PORTB.5=0
        
endif

IF PORTB.6=1 THEN
       LCDOUT "3. PIN AKTIF  " 
      PAUSE 500 
    LCDOut $FE,1 
      PAUSE 500 
      PORTB.6=0
      
endif

IF PORTB.7=1 THEN 
        LCDOUT "4. PIN AKTIF  " 
      PAUSE 500
      LCDOut $FE,1 
      PAUSE 500  
      PORTB.7=0 
endif

IF PORTC.0=1 THEN 
       LCDOUT "5. PIN AKTIF  " 
      PAUSE 500  
      LCDOut $FE,1 
      PAUSE 500 
      I=0     
endif

IF PORTC.1=1 THEN 
      LCDOUT "6. PIN AKTIF  " 
      PAUSE 500 
      LCDOut $FE,1 
      PAUSE 500
      I=0      
endif
IF PORTC.2=1 THEN
       LCDOUT "7. PIN AKTIF  " 
      PAUSE 500
      LCDOut $FE,1 
      PAUSE 500 
      I=0      
endif
IF PORTC.3=1 THEN 
    LCDOUT "8. PIN AKTIF  "
      PAUSE 500 
     LCDOut $FE,1 
      PAUSE 500
      I=0        
endif

IF PORTC.4=1 THEN 
    LCDOUT "9. PIN AKTIF  "
      PAUSE 500 
      LCDOut $FE,1 
      PAUSE 500
      I=0  
endif

IF PORTC.5=1 THEN 
    LCDOUT "10. PIN AKTIF  "
      PAUSE 500 
      LCDOut $FE,1 
      PAUSE 500
      I=0  
endiF
 
GOTO BASLA


end


program bu ama çalışmadı lütfen yardımcı olun saygılarım la
çalışmalarınızda başarılar .......
Bilgi paylaştıkça artar..

tnen

DEFINE LCD_DREG                 PORTB  yerine PORTD yaz ve trisd tanımlamasını kaldırmanı oneririm. Portb yi inputlar için kullanmışsın ve tanımlamada LCD nini data pinlerini PortB nin 4-5-6-7'ci pinleri olarak tanımlamışsın.

picman

:oops: evet aarkadaşım orda lcd tanımlamasında bi yanlışlık var aslında onu daha sonradan değiştirdim normalde orası doğruydu ama burada verirken tekrar eski haline getirmeyi unutmuşum neyse senin söylediğine göre data pinlerini portd ye bağlamalıyım ben burda portb ye bağladım ilk dört bitini lcd için diğer pinleri ise giriş olarak tanımladım burda bi karışıklık varmı proteusta bu şekilde çalışıyo. bide lcd nin açılması için bir zaman gecikmesine ihtiyaç olduğunu biliyorum ben programda 500ms olarak belirledim bu zaman yeterlimi yoksa daha büyük bi zamna mı gerekli
Bilgi paylaştıkça artar..