avatar_efeworld

24c32 problem

Başlatan efeworld, 06 Eylül 2015, 17:52:34

efeworld

fakat yasar kuskonmaz yazdırmak isteyince problem oluyor içiçe geçiyor harfler yazmak istediğim terimleri arttırmak istediğimde hep problemle karşılaşıyorum

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

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
i VAR BYTE
B0=0

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 100
b0=16
I2CWRITE SDA,SCL,$A0,B0,["PRSTUVYZ"]
PAUSE 100
b0=24
I2CWRITE SDA,SCL,$A0,B0,["etepic"]
PAUSE 100
B0=30
I2CWRITE SDA,SCL,$A0,B0,["YASAR KUSKONMAZ"]
PAUSE 100
LCDOUT $FE,1
FOR B0 =0 TO 15
I2CREAD SDA,SCL,$A0,B0,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
NEXT B0
i=0
b0=16
FOR i =0 TO 7
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i
lcdout $fe,1

i=0
b0=24
FOR i =0 TO 5
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i
LCDOUT $FE,1

i=0
b0=30
FOR i =0 TO 15
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i

ete

Bana kalırsa doğru okuyorsun ama ekranda bir birinin üzerine basıyorsun okuduklarını. Ekran formatını iyi öğren kim nereye oturuyor anlamaya çalış. Ekrana bastığın karekterler sığmaz ise sonraki satırlara taşarlar. Öyle bir surum var gibi. Tam anlamak için simulasyonu lazım.
Mesela neden birinci sırayı 6 cı karektereen başlatıyorsun. Oraya 16 karekter yazacaksın 2x16 ekran kullanıyorsan 6 adedi başka yerlere fidecek demektir.
Ekranı incele bence yada tek tek ekrana bastır görürsün ne okuduğunu.

Ete

efeworld

Hocan ilk satırı 6.karekterden okumaya başlamıyor $06 yapınca okudukları karakterleri sırasıyla ekrana yazsın diye o formatta yaptım diğer satırları ise lcdout $fe,$co+i şeklinde yaptım.her satır eklemesi yaptığımda değişik sorunlar çıkıyor karşıma ben istiyorumki 4 kbaytlık epromu yazı karakterleri yada sayılarla doldurayım ama birtürlü olmuyor.

ete

Anlayamadığım bir sebepten dolayı isisde yer alan 24C32A isimli eprom hatalı çalışıyor.
30 nolu adrese ;
I2CWRITE SDA,SCL,$A0,B0,["YASAR KUSKONMAZ"]
şeklinde yaz dediğin zaman "YA" karekterlerini 30 ve 31 nolu adreslere yazıyor. Ama gerisini 32 den devam edeceğine gidiyor 16 dan itibaren yazıyor. Doğru çalışmasını sağlamak için şöye bir yöntem uyguluyorum doğru çalışıyor.
B0=30
I2CWRITE SDA,SCL,$A0,B0,["YA"]
b0=32
I2CWRITE SDA,SCL,$A0,B0,["SAR KUSKONMAZERO"]

Sonuçta ya karekterleri tek tek alıp adres bilgisinide sırası ile vererek kayıt etmek yada yukarıda verdiğim yöntemi kullanman gerekiyor.
Bu sorun mutlaka simulasyon hatası olsa gerek. Yada eprom uyuşmazlığı olabilir.

Ete

efeworld

Hocam bizim için verdiğiniz zahmetlerden dolayı çok teşekkür ederim Allah razı olsun

efeworld

hocam simülasyon kullanmadım devreyi tamamen kurdum breadboard a ama yine harfler iç içe giriyor tekrar bakarmısınız hocam teşekkürler


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

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
i VAR BYTE
B0=0

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 100
b0=16
I2CWRITE SDA,SCL,$A0,B0,["PRSTUVYZ"]
PAUSE 100
b0=24
I2CWRITE SDA,SCL,$A0,B0,["etepic"]
PAUSE 100
B0=30
I2CWRITE SDA,SCL,$A0,B0,["YASAR KUSKONMAZ "]
LCDOUT $FE,1
FOR B0 =0 TO 15
I2CREAD SDA,SCL,$A0,B0,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
NEXT B0
i=0
b0=16
FOR i =0 TO 7
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i
lcdout $fe,1

i=0
b0=24
FOR i =0 TO 5
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i
LCDOUT $FE,1

i=0
b0=30
FOR i =0 TO 15
I2CREAD SDA,SCL,$A0,B0+i,[B1]

LCDOUT $FE,$C0+i,B1
PAUSE 100
NEXT i

ete

#21
Bu epromun bir çok çeşidi mevcut tam olarak üzerinde ne yazıyor?
Data sheet incelemek lazım.Bir yerlerde bahsi geçiyordur mutlaka blok yazmaya pek müsaade etmiyor eprom.
Ete

edit: data sheete tekrar baktım. Bu epromda 32 byte lık page write modu var deniyor. Her seferinde 32 byte peş peşe yazabiliyor gibi anlıyorum. Ancak bu bilgi önce eprom içindeki ön hafızaya alınıyormuş sonra işlemci stop durumu ibraz ederse geçici hafızadakiler yazılıyormuş. Anlaşılan bu peşpeşe karekter yazdırma işlemi en azından bu eprom için uygun değil. Her byte'ın yaılmasından sonra adres değeri bir artırılmalı. Bunu arada yapıyor ama blok sonuna geldiği zaman yapamıyor. Data sheet diyorki 32 byte yazılırken şayet 32 byte2dan fazla bilgi yollanır ise adres bilgisinin sondaki 5 biti rollover yapılır yani yuvarlanır tekrar baştan başlatılır. Bu durumda eski adresin üzerine yazmaya başlanır der.
Aynen de öyle oluyor. 30 rakamının binary karşılığı %0001 1110 bakacak olursak en sondaki 5 bit page yazmada kullanılıyor. Hepsi 1 olduktan sonra adres bitleri yeniden sıfırlanıyor yalnızca 5 bit sıfırlandığı için 32 byte dan fazlası yeniden eski adresin üzerine yazılıyor. Biz yalnızca 16 byte yazabiliyoruz fazlası adres başlangıcına yazılıyor. Benzer biri durum var ama çözemedim açıkçası. Neden 32 byte ın tamamını yazamıyorum anlayamadım.

Bu sorunu aşmanın tek yolu page yazma işinden vaz geçip byte yazma yöntemini kullanmak. Aşağıdaki şekilde;
B0=30
for I=0 to 14
lookup I,["YASAR KUSKONMAZ"],b1
I2CWRITE SDA,SCL,KONT,B0+I,[b1] :pause 10
next


Ete


efeworld

#22
hocam eprom 24c32 ben problemi çözdüm galiba b0 değerine 16 nın katları şeklinde değerler vererek yazdırdğımız zaman sorun kalmadı ilginiz için sonsuz teşekkürler


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

SCL var portc.3
SDA var portc.4
B0 VAR WORD
BP VAR WORD
B1 VAR BYTE
i VAR BYTE
B0=0

I2CWRITE SDA,SCL,$A0,B0,["ABCDEFGHIiJKLMNO"]
pause 10
b0=16
I2CWRITE SDA,SCL,$A0,B0,["PRSTUVYZ        "]
PAUSE 10
b0=32
I2CWRITE SDA,SCL,$A0,B0,["ali kuskonmaz   "]
PAUSE 10
b0=48
I2CWRITE SDA,SCL,$A0,B0,["emrah akkose    "]
PAUSE 10
b0=64
I2CWRITE SDA,SCL,$A0,B0,["aysel kuskonmaz "]
PAUSE 10
b0=80
I2CWRITE SDA,SCL,$A0,B0,["suna kuskonmaz  "]
PAUSE 10
b0=96
I2CWRITE SDA,SCL,$A0,B0,["sendemi leyla   "]
PAUSE 10
b0=112
I2CWRITE SDA,SCL,$A0,B0,["vefasiz leyla   "]
PAUSE 10

  dongu:

lcdout $fe,1
FOR i =0 TO 15
I2CREAD SDA,SCL,$A0,B0+y,[B1]

LCDOUT $FE,$06,B1
PAUSE 100
y=y+1
NEXT i
goto dongu

efeworld

hocam bu seferde şöyle bir sorunum oldu bu entegrenin 4 kilobyte olduğu yazıyor datasheet de fakat 256.adresten sonra yazma işlemi yapmıyor en baştan okumaya devam ediyor.4096 tane verinin yazdırılması gerekmiyormu acaba.saygılar...

ete

Son adres 4095 olması gerekir.

Ete

efeworld

hatamı buldum hocam word yerine byte vermişim değişkene dolayısıyla 255 igeçemiyor teşekkür ederim

Powered by EzPortal