24C08A Uygulaması?

Başlatan mech, 07 Kasım 2007, 11:04:46

mech

Forumda aradım hiç örnek yok. Datasheet'te pek açıklayıcı değil,karışık.
Bu eepromda a2 ucu da kullanılmalı diyor. Yani nasıl kullanıcaz,yardımcı olursanız sevinirim...




bu p0,p1 nedir?
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

parda

I2C seri iletişim protokolü aynı fiziksel hat üzerinde birden fazla elemanla haberleşmeye olanak tanır. Bunun gerçekleşmesi için her elemanın bir adresi olmalıdır. Tabi bu adres her bir eleman için farklı olmalıdır. Hal böyle olunca üretici sabit bir adres veremez. Nedeni aynı hat uzerinde birden fazla kullanılabilsin diye. Orada gördüğün A0,A1,A2 elemanın adresinin 3 bitlik kısmıdır sen bu üç biti istediğin gibi değer vererek (1,0) elemanın adresini oluşturursun. Burdan çıkacak anlam aynı hatta bu entegreden en fazla 7 tane bağlaya bilirsin. Şimdi siz ben sadece bir tane kullanıcam derseniz pcb nizde nasıl kolayınıza geliyorsa bu bitleri adresleyin örneğin üçünüde GND ye bağlarsanız (sıfır vermiş olursunuz)
1010000R/W olur buna göre I2C rutinlerinizde bu adresi kullanırsınız.
Anlatabilmişimdir umarım
Kolay gelsin.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

mech

çok teşekkür ederim.Sorun halloldu.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Maxim

@mech ,
bir mahsuru yoksa I2C eeprom kullanımı için örnek kod verebilirmisin ?

slm

teknikelektronikci

benim bildigim kadariyla sirf eeprom kullanilacak ise a1 a2 uclari gnd ye baglanabilinir maxibost hocam hangi dilde örnek istiorsunuz acaba?

eger proton ise i2c kullanmak cok kolay cünkü hbusout komutu ile ayni hatta birden fazla i2c cihazi ve picin kendi sda scl pinelriyle haberlesme yapabilirisniz yani tipki hserout hpwm gibi normali =busout busin h li olani hbusout hbusin   koaly gelsin
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

Maxim

evet proton örnek lazım ,yani bir örnek görmek işe yarıyor hep ,
dediğin gibi kolayda gözüküyor ama keşke elimde bir eeprom olsada deneyebilseydim .
Hiç kullanma nasip olmadı bugüne kadar ,

picin hafızası yetmeyincemi kullanılır ? kayıtlı bilgilerin daha fazla kere kayıt edilebilmesi içinmi kullanılır ?

slm

parda

Yillar once bir 8051 ile I2C eprom projesinde kullandığım yazılımsal I2C kodrı bunlar birine faydası olur belki.
bu kod çalışır, sadeleştirme yapılabilir.
kullanımı
i2cwrite(0,13);    // 0 adresine 13 bilgisini yazar.
a=i2cread(0);  //a değişkenine 0 adresini okuyup yazar
#define data_bit(dt,x) ((dt>>x)&0x01)
void i2c_clock(void)
{
 scl=1; scl=1; scl=1;scl=1;
 scl=0; scl=0; scl=0;scl=0;
}

void i2c_start(void)
{
 sda=1; scl=1;
 sda=1; scl=1;
 sda=1; scl=1;
 sda=0;sda=0;sda=0; scl=0;
}

void i2c_stop(void)
{
 scl=0;sda=0;
 scl=0;sda=0;
 scl=0;sda=0;
 scl=1;scl=1;scl=1; sda=1;
}

void i2c_write(unsigned char input_data)
{
unsigned char w;
for(w=0;w<8;w++)
 {
  sda=data_bit(input_data,7-w);
  i2c_clock();
 }
i2c_clock();
}

unsigned char i2c_read(void)
{
unsigned char e,r;
r=0;
for(e=0;e<8;e++)
 {
 scl=1; scl=1; scl=1; scl=1;
 r=r<<1; r|=sda;
 scl=0; scl=0; scl=0; scl=0;
 }
i2c_clock();
return(r);
}

void i2cwrite(unsigned int adress,unsigned char wwdata)
{
i2c_start();
i2c_write(0xa0);
i2c_write(adress&0xFF);
i2c_write((adress>>8)&0xFF);
i2c_write(wwdata);
i2c_stop();
pause_ms(50);
}

unsigned char i2cread(unsigned int adresss)
{
unsigned char d;
i2c_start();
i2c_write(0xa0);
i2c_write(adresss&0xFF);
i2c_write((adresss>>8)&0xFF);
i2c_start();
i2c_write(0xa1);
d=i2c_read();
i2c_stop();
pause_ms(5);
return(d);
}
Bildiğim tek şey, hiç bir şey bilmediğimdir.

a.zorba

proton un forum un da şöyle bir şey var:
hello Guru's


I have a simple circuit which is interfaced to an external eeprom which is 24C04.

My code:

CODE: A
Device 16F77 
Config XT_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,CP_ALL
XTAL = 4
ALL_DIGITAL TRUE
; 76543210
TRISA = %00111111 ' ADC INPUT WITH REFERENCE ETC
TRISB = %11111111 ' ALL RELAY OUTPUT
TRISC = %11001111 ' JUMPER SWITCH
TRISD = %11000000 ' ALL RELAY OUTPUT
TRISE = %10100011 ' EEPROM & BUZZER
'------------------------- RAM VARIABLES --------------
Dim ADCVAL As Byte 
Dim I As Byte 
Dim samples As Word 
Dim sample As Byte 
Dim temp As Byte 
Dim ADC1 As Word
Dim WRD As Word
Dim KEY As Byte
Dim MODE As Byte 
Dim WHIP As Byte
'--------------------------- LCD ----------------------
Declare LCD_TYPE 0 
Declare LCD_DTPIN PORTD.0 ' use PORTD High nibble, (0 For Low nibble)
Declare LCD_ENPIN PORTD.5 
Declare LCD_RSPIN PORTD.4 
Declare LCD_INTERFACE 4 
Declare LCD_LINES 2 
'-------------------------- HC595 ---------------------
Symbol HC_latch = PORTC.4 
Symbol HC_Data = PORTC.7 
Symbol HC_Clk = PORTC.6
'--------------------------24c04-----------------------
Dim Address As Word ' 16-bit address required
Dim E_DATA As Byte ' eeprom data variable.
Symbol Control $A0 
Symbol SCL = PORTE.0 '---- 24C04 SCL PIN 
Symbol SDA = PORTE.1 '---- 24C04 SDA PIN
Declare SDA_PIN PORTE.1
Declare SCL_PIN PORTE.0
'-------------------------- MISC ----------------------
DelayMS 500
Clear

Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "EEPROM R_W"
Print At 2 , 1 , "TEST"
DelayMS 3000
START:

Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "EEPROM R_W"
Print At 2 , 1 , "WRITE"
DelayMS 1000

Clear
DelayMS 500 

I2Cout SDA, SCL, Control , 1 , [20]
DelayMS 50
I2Cout SDA, SCL, Control , 2 , [21]
DelayMS 50
I2Cout SDA, SCL, Control , 3 , [22]
DelayMS 50
I2Cout SDA, SCL, Control , 4 , [23]
DelayMS 50
I2Cout SDA, SCL, Control , 5 , [24]
DelayMS 50

Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "EEPROM R_W"
Print At 2 , 1 , "READ"
DelayMS 1000

Clear
DelayMS 500 

I2Cin SDA, SCL, Control , 1 , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 1
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , 2 , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 2
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , 3 , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 3
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , 4 , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 4
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , 5 , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 5
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

End


CodeB:
START:

Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "EEPROM R_W"
Print At 2 , 1 , "WRITE"
DelayMS 1000

Clear
DelayMS 500 

I = 1
I2Cout SDA, SCL, Control , ((I*15)+ 1), [11]
DelayMS 50
I2Cout SDA, SCL, Control , ((I*15)+ 2), [12]
DelayMS 50
I2Cout SDA, SCL, Control , ((I*15)+ 3), [13]
DelayMS 50
I2Cout SDA, SCL, Control , ((I*15)+ 4), [14]
DelayMS 50
I2Cout SDA, SCL, Control , ((I*15)+ 5), [15]
DelayMS 50

Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "EEPROM R_W"
Print At 2 , 1 , "READ"
DelayMS 1000

DelayMS 500 
I = 1
I2Cin SDA, SCL, Control , ((I*15)+ 1) , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 1
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , ((I*15)+ 2) , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 2
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , ((I*15)+ 3) , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 3
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , ((I*15)+ 4) , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 4
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

I2Cin SDA, SCL, Control , ((I*15)+ 5) , [E_DATA]
DelayMS 50
Print $FE , 1 : DelayMS 30
Print At 1 , 1 , "LOC: ", Dec 5
Print At 2 , 1 , "DATA: ", Dec E_DATA
DelayMS 500

End

while codeA works, CodeB does not work. any idea why.

regards

Hello Charlie Brown,
I doubt whether the "address" variable in the "I2Cin" & "I2COut" commands support expressions like ((I*15)+ 1) etc.
Try using a single word variable in place of the expression.
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

mech

\ProtonIDE\Samples\I2C.BAS örneği mevcut.Ben bunu örnek aldım.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mech

Meraba arkadaşlar.Aynı konudandevam ettiğim için yeni başlık açmadım.
Bu 24C08A ile 0-255 arası adresleri doğru yazıp okuyabiliyorum. Fakat 256-1023 arası adreslerde sorun çıkıyor. PDF'sinde adresin 8 bit olması gerektiğini görüyorum. Fakat bu eeprom 1024byte olduğuna göre 9 bitlik adreslere nasıl ulaşıcam. Teşekkürler.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mech

Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mech

Alıntı yapılan: "parda"I2C seri iletişim protokolü aynı fiziksel hat üzerinde birden fazla elemanla haberleşmeye olanak tanır. Bunun gerçekleşmesi için her elemanın bir adresi olmalıdır. Tabi bu adres her bir eleman için farklı olmalıdır. Hal böyle olunca üretici sabit bir adres veremez. Nedeni aynı hat uzerinde birden fazla kullanılabilsin diye. Orada gördüğün A0,A1,A2 elemanın adresinin 3 bitlik kısmıdır sen bu üç biti istediğin gibi değer vererek (1,0) elemanın adresini oluşturursun. Burdan çıkacak anlam aynı hatta bu entegreden en fazla 7 tane bağlaya bilirsin. Şimdi siz ben sadece bir tane kullanıcam derseniz pcb nizde nasıl kolayınıza geliyorsa bu bitleri adresleyin örneğin üçünüde GND ye bağlarsanız (sıfır vermiş olursunuz)
1010000R/W olur buna göre I2C rutinlerinizde bu adresi kullanırsınız.
Anlatabilmişimdir umarım
Kolay gelsin.

24c08'de a2 device code için kullanılıp a1 ve a0; 9. ve 10. bitler (eepromda 255'ten büyük ve 512'den büyük adresler) için control byte'nda kullanılıyormuş.Bilginize.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır