picbasic le 24c1024b harici eeprom okuma

Başlatan rohan, 17 Aralık 2009, 12:41:42

rohan

hekese kolay gelsin...
picbasic programıyla harici eepromun 65535 den sonraki adreslerine veri yazmanın veya okumanın bir yolu varmı?

ete

Harici eepromların adreslenmesi pic basic'e bağlı olmayıp tamamen eepromların kendi özelliklerine bağlıdır. Örnek olarak sizin verdiğiniz eepromun data sheetini incelerseniz,
24C1024b eeprom da 512 adet 256 bytlık (0-255) hafıza sayfası bulunmaktadır. Toplam 8 bitlik hafıza sayısı 131.072 adet dir.
Hafıza adreslemesi 0 dan başladığı için adresler 0 dan başlayıp 131.071'e kadar devam eder. 131.071 sayısı ikili sistemde 17 adet "1" den oluşan  17 bitlik bir sayıdır.
Data sheet'e bakarsanız, hafıza adresinin 17 bit olarak verildiğini ve bununda Po biti + 8bitlik adres- High byte + 8 Bitlik Adres-Low byte olarak toplam 17 bit şeklinde verildiğini görebilirsiniz.

Biliyorsunuz 16 bitlik sayı en büyük 65535 olmaktadır. Bunu 1 bit artırırsak sayı 131.071 olmaktadırki buda bu eepromun maksimum değeridir ve açıkladığım şekilde adresleniyor.
Toparlamak gerekirse 65536 dan küçük hafıza adreslerinde Po biti sıfır olacak, 65535 den büyük hafıza adreslerinde ise Po biti 1 olarak verilecektir.
Örnek bir komut dizimi vermek gerekir ise (mesela 72340 nolu adres için verelim)
72340 -65536=6804 =%00011010  10010100
Önce Device Adres:%10100000
Sonra MSB byte     :%00011010
Sonra LSB byte      :%10010100
işte eproma verilecek adres bilgisi bu şekilde olacaktır.
Tabiiki en sonda da data byte bilgisi verilecektir.

Belkide sorunuzu yanlış anladım. Sorunuzda 72340 adresini nasıl hesaplayacağız diye sordunuz belki.
Bunun için 1 word değişkeni 1 de byte değişkeni kullanabilirsiniz.
AdresA (Byte)
AdresB(Word) şeklinde tanımlanır ise
Adres değeriniz 65535 'e kadar ise direk AdresB değerini kullanırsınız.
65535'i aşan her değer için ;
AdresA=1 olur. bu hafızanın 65536 lık kısmını size verecektir. Dolayısıyla,
72340 için 72340-65536=6804 değeride AdresB değişkeninde yer alacaktır.
Bu bilgileri adreslemede kullanmak için şöyle bir yol takip edebilirsiniz.

AdresA=(AdresA & %00000001)+%10100000
AdresB.Byte1   (Bu adresin MSB si)
AdresB.Byte0   (Buda adresim LSB si )

Umarım anlaşılmıştır.

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

rohan

öncelikle ilginiz için teşekkür ederim...

ilk anlattıklarınaza göre
örneğin; 65536. adresten bilgi okumak için
aşağıda yazdığım komut doğru olurmu.
adres var word
adres=0

I2cread sda,scl,%10100110,adres[bilgi.byte1,bilgi.byte0]

dikkat ederseniz kontrol kodundaki Po yu set 1 yapıyorum ve adres bölümünü de 0 (sıfır)olarak giriyorum.

ete

Alıntı Yapörneğin; 65536. adresten bilgi okumak için
aşağıda yazdığım komut doğru olurmu.

I2cread sda,scl,%10100110,0[bilgi.byte1,bilgi.byte0]

dikkat ederseniz kontrol kodundaki Po yu set 1 yapıyorum ve adres bölümünü de 0 (sıfır)olarak giriyorum

Doğru sayılır. Sayılır diyorum çünki Bilgi değişkeninde ne yerleşik onu belirtmemişsiniz yada ben anlamadım.

Önce adres bit değerlerini neden böyle verdiniz onu tartışalım.
%10100110 değerinde %101 değeri epromun cihaz koddur. Bu değişmez.
sonraki 2 bit sıfır olmak zorunda buda data sheet de belirlenmiş.
Sonraki bit A1 biti olup donanımsal adresleme için kullanılır. Aynı Data ve CLK hattına 2 adet eprom bağlayabilmenizi sağlar bu bit.
Şayet 2 eprom kullanıp birinin A1 bitini HIGH (pullup) diğerini LOW (pulldown) olarak bağlarsanız bu epromlardan istediğinizi kullanabilirsiniz.
A1 biti High olanı kullanmak için Adres bilgisinde A1 biti High yapılmalı, A1 biti LOW olanı kullanmak için ise Adres bilgisinde bu bit LOW olarak verilmelidir.
Aslında 17 bit adresleme çok zor değil. Olayı basic de sanki 17 bitlik değişken tanımlama mümkünmüş gibi düşünerek bir kez daha açıklayayım.
Şayet Basicde 17 bitlik bir değişken tanımlayabilse idik 65536 şöyle gözükecek idi;
Sayı= 1 00000000 00000000
en baştaki 1 değeri Po ın karşılığıdır.  O halde doğru cevap
I2CRead SDA,SCL,%10100010,0,[%00000000,%00000000, DATA]
şeklinde olacaktır. Bu şekilde düşünmüş iseniz cevabınız doğrudur.

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

rohan

hocam bilgi değişkeni word tipinde bir değişken olarak tanımlı. içindeki bilgide word tipinde bir sayı.gerekli görmediğim için yazmadım.

yalnız benim kullandığım eeprom da donanımsal adresleme olarak A1 ve A2 diye 2 bitlik adresleme bilgisi var.

DEVICE ADRESS: 1010 A2 A1 Po W/R olarak geçiyor.
burdada sizin bellirttiğiniz gibi ilk 3 bit (%101) eepromun cihaz kodudur.sonraki bit 0 olmak zorunda sonraki 2bit A2 ve A1 donanımsal adresleme bitleri, sonraki bit Po ve ensondaki de yazma okuma biti.

yaptığım devrede eepromun A2 pini GND ye bağlı A1 pini +5V a bağlı.
o yüzden eepromun adres bilgisini %10100100 şeklinde giriyorum.devrede aynı hata bağlı 2 tane 24c512 eeprom daha var.onlarında bacak bağlantıları ve adres bilgileri değişik tabi.

şunu da belirtmek istiyorum.
bağlı tüm eepromları okuyup yazabiliyorum.24c1024b yide
65535. adrese kadar okuyup yazabiliyorum.sonraki adreslerde (65536 ve üzeri) tıkandım.

sanırım aynı datasheete bakmıyoruz.
aşağıdaki adresten bakabilirsiniz.
http://pdf1.alldatasheet.com/datasheet-pdf/view/256851/ATMEL/AT24C1024B-PU.html

ete

Benim baktığımda tek adres bacağı (A1) vardı. Sorun değil senin eepromdan 4 adedi aynı hatta kullanılabilir. Herbirini ayrı adresleyerek tabiiki.

Sonuçta 65535 den sonrasını Po bitini 1 yaparak ve aradaki farkı da diğer byt'lara vererek şimdi okuma yapabilirsin. Deneyip sonucuda buraya yazarsan memnun olurum.  Nede olsa teorik bilgi verdik ve bilginin yerine oturması içinde denenmiş olması gerekir.

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

rohan

denemeleri yapıyorum.daha bir sonuca ulaşmadım ama ulaşınca yazacam.teşekkür ederim.

rohan

tamam hocam okumayı gerçekleştirdim.dediğin gibi adres bilgisindeki Po set 1 yapıldığında 65535 den sonraki adreslerede ulaşılıyor.yardımların için teşekkürler.gerekli açıklamalar aşağıda.

örnek okuma ve yazma aşağıdaki gibi
;-------------------------------------------------------------------
65535.adres ve altındaki adresler için:

örneğin 0. adrese yazma veya okuma yapılacaksa
yazma için örnek:
data var word
adres var word
adres=0
for i=1 to 2 step 2
    i2cwrite  sda,scl,$a0,adres[data.byte1,data.byte0]
    pause 10
next i
okuma için örnek:
data var word
adres var word
adres=0
for i=1  to 2 step 2
  i2cread  sda,scl,$a0,adres[data.byte1,data.byte0]
  pause 10
next i

not:1-Eepromun(at24c1024b-pu) 2.pini(A1) ve 3.pini(A2) GND ye bağlı olmalı.
2-Eeproma yazılacak data word tipindeyse adreste word tipinde          olmalı.
3-yukarıdaki yazma örneğinde "data" bilgisi word tipinde olduğu için yüksek baytı 0. adrese,düşük baytı da  1.adrese yazılır.
okuma örneğinde de yine 0. ve 1. adres okunur.
örneğin;
adres=65534 olsaydı ozaman 65534. ve 65535. adresten okuma veya yazma yapılmış olunurdu.

eğer "data" bilgisi byte tipinde tanımlanırsa (adres değişkeni de byte tipinde olmalı) o zaman sadece 0.adresten okuma veya yazma yapılır. 1.adreste hiçbir değişiklik olmaz.aşağıdaki gibi
data var byte
adres var byte
adres=0
i2cwrite  sda,scl,$a0,adres[data]
pause 10

data var byte
adres var byte
adres=0
i2cread  sda,scl,$a0,adres[data]
pause 10
;--------------------------------------------------------------------
65536.adres ve üstündeki adresler(en son adres 131071) için:

burda dikkat etmemiz gereken bir nokta var o da şu
örneğin 65536. adrese yazma veya okuma yapacaksak
adres=65536-65536=0 olmalı.bu bölümü kendiniz hesaplamalısınız.
adres=0 olmalı

yazma için örnek:
data var word
adres var word
adres=0
for i=1 to 2 step 2
   i2cwrite  sda,scl,$a2,adres[data.byte1,data.byte0]
   pause 10
next i
okuma için örnek:
data var word
adres var word
adres=0
for i=1 to 2 step 2
   i2cread  sda,scl,$a2,adres[data.byte1,data.byte0]
   pause 10
next i

burda "$a2"ye(device adress) ve adres değişkenine verilen değere(adres=0) dikkat edilmeli.sanki 0. ve 1. (data word tipinde)adresten okuma veya yazma yapılıyor gibi görünüyor ama aslında 65536. ve 65537. adresten okuma ve yazma yapılıyor.nedeni eepromun device adress bilgilerindeki "Po" set 1 yapılmıştır.burdaki Po eeproma bildirilen adresin 17. bitini temsil ederki buda
%1 00000000 00000000 =65536 denk gelir.
ilk 16 bit adres=0 dan geliyor, 17. bit Po dan geliyor.

bir örnek daha:
diyelimki 92547. adresten okuma yapmak istiyoruz.
adres=92547-65536=27011
adres=27011 olmalı

yazma için örnek:
data var word
adres var word
adres=27011
for i=1 to 2 step 2
   i2cwrite  sda,scl,$a2,adres[data.byte1,data.byte0]
   pause 10
next i
okuma için örnek:
data var word
adres var word
adres=27011
for i=1 to 2 step 2
   i2cread  sda,scl,$a2,adres[data.byte1,data.byte0]
   pause 10
next i
92547. ve 92548. adresten okuma ve yazma yapılır.


herkese kolay gelsin.

ete

Tebrikler.
Başarmak güzl şey.
İnsan sora sora dağları aşarmış. Aştın işte.

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