avatar_elektro77

I2C eprom kullanımı

Başlatan elektro77, 05 Kasım 2019, 09:28:39

elektro77

Merhabalar:
16f877 de donanımsal 12c eprom kullanmak istiyorum. Fakat sda ve scl pinlerim başka bir iş için dolu ve bu işi porte de yapmak istiyorum. Donanımsal komutlarla bu işi yapamayacağım anlamına geliyor.
Ete hocamın derslerinde sadece donanımsal 12c dersi verilmiş.
Hızın önemi yok.Sadece byte tipinde 32 adet veriyi donanımsal epromdaki 32 adet adrese yazıp okuyacağım.
aslında bu işi F877 dahili epromda yaptım ama çok fazla yazma ve okuma yaptığım için 1 milyon yazma sınırını aşıp bir süre sonra mcu yu bozmak istemiyorum.
porte de bu işi yapmak için nasıl bir yol izlemeliyim.

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

donanımsal eprom tabirini anlamadım. Derslerde her hangi bir pine bağlanabilen I2C eprom üzerinde durduğumu hatırlıyorum. Sonradan bu tür epromları Donanımsal I2C portundan da çalıştırmış idim.
Donanımsal tabiri genelde bu iş için ayrılmış standart port anlamına gelir. Bazı Pic işlemcilerde I2C donanımsal olarak bulunmaktadır. Registerler yardımı ile eprom yada hangi cihaz ise onunla bağlantı kurulup haberleşme yapılabilir.

I2CWRITE DataPin,ClockPin,Control,{Address,}[Value{,Value...}]{,Label}

bu yazma komutunun genel şeklidir. Datapin herhangi bir In/out pini, ClockPin herhangi bir In/out pini olabiliyor.
I2C sisteminde her cihazın bir Kontrol kodu bulunmaktadır. Control isimli değişken yerine bu kodu yazmak gerekir. Opsiyon olarak chaz içindeki belirli adreslere ulaşılacak ise Address de verilmesi gerekir. Verilmediği zaman default sıfır adresinden başlanır. Value denilen şeylerde o adrese yazılacak değerleri ifade ediyor. Tek bir Byte yazılabileceği gibi birden fazla byte aralarına virgül konularak da yazılabilmektedir.
Şayet cihazdan okuma yapulacak ise;
I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}

komutu kullanılıyor. sistem yine aynı.

Donanısal port kullanımı için ek ders notu yayınlamış idim. Oda aşağıdaki linkte yer alıyor.


https://etepic.com/index.php/topic,3172.msg30132.html#msg30132

Ete

elektro77

#2
Alıntı yapılan: ete - 05 Kasım 2019, 11:34:01I2CWRITE DataPin,ClockPin,Control,{Address,}[Value{,Value...}]{,Label}

I2C sisteminde her cihazın bir Kontrol kodu bulunmaktadır. Control isimli değişken yerine bu kodu yazmak gerekir.

Ete

Kontrol kodunu pek anlayamadım hocam. Ben 24c16 kullanacağım. bunun bir kodu mu var yani.
birde kod satırında "label" var bu nedir.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

I2C bir haberleşme protokolü dür. Yalnızca Epromlar değil bir çok cihaz bu sistem ile birbirleri ile yada işlemcilerle haberleşir. Bu protokolün en önemli özelliklerinden biri Data ve Clock hattına birden fazla chaz bağlanabilmesidir. Bağlanan her aletin bir gurup kodu vardır. Buna cihaz kodu denilmektedir. Epromlarda bu kod %1010xxxW şeklindedir. xxx yerine aynı hata bağlı birden fazla eprom için donanımsal adres biti gelir. W olan ise Okuma yapılırken 1 yazma yapılırken 0 yapılır ancak PBP da bu iş otomatik yapıldığı için bu biti sürekli 0(sıfır) kullanmak gerekir.
Tek eprom kullanılacak ise cihaz kodu olarak  %10100000 kullanılır.
Epromun pin dağılımına bakarsan orada A0-A1-A2 pinlerini göreceksin. Aynı hata bağlı 2 adet epromun var ise, ikincinin A0 pinine HIGH vererek diğerinden ayrır ve onu Cihaz kodunu ise %10100010 vererek hangisi ile haberleşecek ise onun cihaz kodunu kullanırsın.
Bütün I2C kullanan cihazların mutlaka bir Cihaz Kodu vardır. Cihaz kodunun son biti Okuma/Yazma biti olduğu için genellikle cihaz kodlarını 7 bit oalrak verirler. Şayet kod 7 bit ise sonuna bir sıfır eklmeyi unutmayın.

Label açıklaması şöyle. Her haberleşmede İki cihaz mutlaka her byte sonunda bir el sıkışması yapar. Buna ACK yada Acknowledge yani Doğruluk onayı alışverişi yapılır. Bunu detayı daha uzun ben basitçe anlatıyorum. Şayet herhangi bir şekilde Yollayan ACK (karşıdan onay) alamaz ise otomatikman Label de yazılı olan etiket adına atlar. Ben şimdiye kadar hiç label kullanmadım sende kullanma.

Ete

elektro77

#4
hocam
porte de epromm kullandım. Donanımsal olmayan kodlarla. Yani yukarıdaki gibi. Fakat ısıste daha playe basar bazmaz asağıdaki hataları veriyor. kodlarımın tamamı çok uzun ve karmaşık olduğu için buraya eklemedim. çünki kızacaksınız biliyorum.
ama bu hatalardan belki bir şey önerebileceğinizi düşündüm.
kullandığım eprom okuma yazma kodlarının bir kısmı ise söyle
SYMBOL DTA=PORTE.1
SYMBOL CLK=PORTE.0
UST CON  %10100000 
ALT CON  %10100010
basla:
gosub epromoku
GOSUB EKRAN_YAZ

IF MOTOR=1 THEN'program buraya geldiyse unıte ve motor seçilmiş demektir ve program buradayken aşağı tusuna basılırsa bılgı=13 olur ve motor 1 asağı doner
       M1SA=M1SA-SETPULS
       IF M1SA=256 THEN M1SA=0'BU KOD EKRANI 1 DE TUTAR 
       I2CWRITE DTA,CLK,ust,1,[M1SA]:PAUSE 10'1.UNİTE 1. MOTORUN SON DUruMUNU EPROMDA 1 NOLU ADRESE  KAYDET
       GOSUB EKRAN_YAZ      
    ENDIF

goto basla
epromoku:
I2CREAD DTA,CLK,ust,1,[M1SA]'1.ÜNİTE 1.MOTOR SON DURUMUNU EPROMDAN OKU
return

ısıs eprom okumada başlangıç bekleme süresinin ihlal edildiği hatasını veriyor.
birde eprom durma koşullu iken veri aktarılması güvensizdir hatası veriyor
bu hataları ısıste daha playe basar basmaz vermeye başlıyor. binlerce oluyor.

tüm yazılımı ve simülasyonu mailinize gönderdim hocam.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Programda kesme var ve sen bol miktarda PAUSE kullanmışsın. Bu şekilde o program sağlıklı çalışmaz.
Programı test ettim ve bende yalnızca 1 hata veriyor. I2CMEM timing hatası.
BU hatanın sebebi PORTE pinlerindeki Schimitt Trigger özelliği olsa gerek.
Eprom CLK ve DTA pinlerini başka bir porta verirsen bu hata ortadan kalkar.
Bir tavsiyemde şöyle olacak. I2C epromları okurken veya yazarken kesmeleri kapatmanı öneririm.

Ete

elektro77

#6
İlgilendiğiniz için teşekkür ederim.
 Hemen bir delay döngüsü yaparım.
ikincisi:
12c yazarken veya okurken Kesmeleri kapatmamı neden öneriyorsunuz ve bunu nasıl yapmalıyım hocam.
Örneğin okuma ve yazma işlemlerini return döngüsü içine alıp başınada: örneğin INTCON.5=0:INTCON.2=0 yazıp timer0 i kapatsam olurmu.
aynı şekilde Usart kesmesini de GIE=0 yazıp kapatırsam sorun olurmu.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Yalnızca Timer'ı kapatsan da olur dediğin şekilde.Tam haberleşirken programın kesmeye gitmesi haberleşmenin kesilmesine neden olabilir o yüzden kesmeyi kapatmanı öneriyorum. USART kesmesi sık çalışmadığı için kalabilir. Basic komutları bitmeden program kesmeye zaten gidemiyor. Ama hangi komutta nasıl davranıyr çok iyi bilmiyoruz bu nedenle önlem almakta yarar var.

Ete

Powered by EzPortal