PIC18F452 ve harici eeprom okuma ve yazma sorunu

Başlatan transistor, 12 Şubat 2019, 17:03:33

transistor

Herkese merhabalar, 24C64A EEPROM ile deneme yapmaktayım. Pic'in dahili eeprom'unda problem yaşamazken harici eeprom'da karakterleri sorunlu okuyorum. Sırası falan karışık atladığım nokta nerede bilemedim.


DEFINE OSC 20 'hs osc 20mhz
DEFINE I2C_SLOW 1 'hızı düşür.

TRISC=%00011000 : PORTC=0

SDA VAR PORTC.4
SCL VAR PORTC.3

KONTROL CON $A0 'kontrol bitleri sabit
X VAR BYTE ' for döngüsü değişkeni
DELAY VAR BYTE 'eeprom'a mS cinsinden birim karakter yazma süresi
ADRS VAR WORD 'adres değişkeni
VERI VAR BYTE 'okunduktan sonra sırasıyla karakterleri saklayacağım geçici değişken
CLEAR

DELAY=10

'HARİCİ EEPROM'A VERİ AKTARILIYOR...

ADRS=0 'adres 0'dan başlıyor.
X=0
FOR X=0 TO 9
I2CWRITE SDA,SCL,KONTROL,ADRS,["TRANSISTOR"]
PAUSE DELAY
ADRS=ADRS+1 'adresi bir arttır.
NEXT X

START:

ADRS=0
X=0
FOR X=0 TO 9
I2CREAD SDA,SCL,KONTROL,ADRS,[VERI]
ADRS=ADRS+1

.
..
LCD'DE GÖSTERMEK İÇİN KODLAR...

PAUSE 500

GOTO START

END


Okumayı 2 byte olarak yaptım ve düşük byte'ı VERI değişkenine aktardım gene olmadı.

I2CREAD SDA,SCL,KONTROL,ADRS,[VERI.LOWBYTE]



ete

Eproma I2CWRITE SDA,SCL,KONTROL,ADRS,["TRANSISTOR"] yazdırmak için döngü kurmaya gerek yok.
Aksine bozuyorsun ilk yazdığını. Bu komut satırı Transistor yazısını bir kerede eproma yazar.
Tek tek yazmak istiyorsan bir lookup tablosu oluşturup karekterleri teker teker alıp adres kullanarak eproma döngü içinde yazdırman gerekir.

Yazma döngüsünü sil ve yerine tek satır yukarıdakini ver sonra okumaya çalış bakalım ne olacak.
Unutma Adres değeri değişkenle verilecektir. Direk rakam yazarsan çalışmaz!!!!.

Ete

transistor

Evet hocam haklısınız. Söylediğiniz gibi döngü olayını kaldırınca işlem tamamlanmış oldu. Peki hocam bu şekide yazı bir sefer de mesela ne kadar yazdırılabilir. Karakter uzadıkca neden taşma yapıyor. Aşağıda ki mesaj geliyor! Bu tasmayı engellemek için lookup tablosu mu kullanmam gerek.



Birde,

Unutma Adres değeri değişkenle verilecektir. Direk rakam yazarsan çalışmaz!!!!.

dediniz. Mesela,
adrs var word
adrs=0
adrs=adrs+1 gibi mi yoksa, 5. adrese A yazacaksam,

x var byte
x=5
I2CWRITE SDA,SCL,KONTROL,x,[$41]

ete

Sorunun cevabı hata mesajında saklı Buffer 16 word (32 byte) büyüklüğünde imiş ama sen 19 tane word yollamışsın.
Demekki ancak 32 karekter verebilirsin bu şekilde.
I2C komutunun bir parametreside ADRES dir yazılacak adresi belirtir yada okunacak adresi. Bunu direk rakam vererek değilde rakamı bir değişkene vererek vermen gerekiyor onu açıklamaya çalıştım.
Yani 130 nolu adrese bir bilgi yazmak istersek;
I2CWRITE SDA,SCL,KONTROL,130,[$41] şeklinde değil
ADR=130
I2CWRITE SDA,SCL,KONTROL,ADR,[$41] şeklinde vermen gerekiyor.
Zaten döngü ile işlem yaptığında mecburen adres değerin değişkenle gelecektir ben sadece hatırlatayım dedim.
Ete

transistor

Sizi anladım hocam ancak çalışması gerektiğini düşünerekten şöyle bir kod yazdığımda,

...
ADR=0 : X=0
FOR X=0 TO 10
LOOKUP X,["TRANSISTOR"],HARF
I2CWRITE SDA,SCL,KONTROL,ADR,[HARF]
PAUSE DELAY '10mS
ADR=ADR+1
NEXT X

START:

ADR=0 : X=0

FOR X=0 TO 10
I2CREAD SDA,SCL,KONTROL,ADR,[HARF]
ADR=ADR+1
...
NEXT X

PAUSE 500

GOTO BASLA

END


sadece t harfini okuyabiliyorum. Halbuki yanlış bir yer de olduğunu düşünmüyorum. Eeprom'un içerisine yazılan harfleri görmem mümkün mü proteus'da hocam?

ete

Protegus da simulasyonu çalıştır ve Pause tuşuna bas. Ekranda yukarıda bulunan DEBUG tuşuna tıkla açılan pencerede epromu bul ve ona tıkla böylece eprom içeriğini orada görebilirsin. ancak pause ile durdurduğunda görebilirsin sürekli kalmıyor. Ara ara durdurup ne yazıldığına bakabilirsin.

Kodun tamamını ve simulasyon devresinide koyarsan ancak bakabilirim. Değilse yazdıklarında bir kusur görmüyorum.
Ancak bazı tavsiyelerim olabilir. Aşağda yazdığın kodun bir parçası var.
ADR=0 : X=0 
FOR X=0 TO 10
LOOKUP X,["TRANSISTOR"],HARF
I2CWRITE SDA,SCL,KONTROL,ADR,[HARF]
PAUSE DELAY '10mS
ADR=ADR+1
NEXT X

X döngüsü zaten eprom adresleri aralığında kurulmuş. Birde ayrıca ADR değişkeni kullanmak sence mantıklımı.
Bu işlem şöyle yapılabilirdi.

FOR ADR=0 TO 10
LOOKUP ADR,["TRANSISTOR"],HARF
I2CWRITE SDA,SCL,KONTROL,ADR,[HARF]
PAUSE DELAY '10mS
NEXT



Ete

transistor

Çok sağolun hocam sorun, clear komutunda imiş. Bundan önce degişkenlere verdiğim değerleri temizlediği için sorun yaşıyor muşum. Dediğiniz yöntemi deneyeceğim teşekkürler.

ete

işte komple kod vermenin önemi burada yatıyor. Genelde kodun bir bölümüne odaklanıp onu etkiliyen diğer komutlar göz ardı ediliyor. Bakıyorsun herşey normal o halde sorunu dışarıda aramak lazım diyorsun ama kodun gerisi olmuyor. Buda benim sıkıntım işte dile getireyim dedim. Neyse sorunu hallettiğine sevindim.

Ete

transistor

Evet hocam, kodun tamamını paylaşmak gerekiyormuş. Bundan sonra sıkıntı yaşadığımda öyle yaparım. Böylece benim gibi sıkıntı yaşayan ve çözüm arayan sonraki arkadaşlara da faydalı olmuş olabiliriz.

Powered by EzPortal