I2C AVR -> EEPROM

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Ranstam
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16
Ort: LUND

I2C AVR -> EEPROM

Inlägg av Ranstam »

Hej

Jag behöver lite extra lagringsutrymme på min Atmega8, därför tänkte jag använda ett löst 64k EEPROM som har I2C kommunikation. Detta verkar lite knepigt, men jag läste en del på nätet och det verkar som att Peter Fleurys I2c bibliotek är det som har strulat minst för folk.

Eftersom jag inte har kört varesig I2C eller rotat speciellt mycket med minneskretsar känner jag mig lite handfallen. Kod exemplet ser ut så här:

Kod: Markera allt

#include <i2cmaster.h>


 #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet

 int main(void)
 {
     unsigned char ret;

     i2c_init();                             // initialize I2C library

     // write 0x75 to EEPROM address 5 (Byte Write) 
     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
     i2c_write(0x05);                        // write address = 5
     i2c_write(0x75);                        // write value 0x75 to EEPROM
     i2c_stop();                             // set stop conditon = release bus


     // read previously written value back from EEPROM address 5 
     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode

     i2c_write(0x05);                        // write address = 5
     i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode

     ret = i2c_readNak();                    // read one byte from EEPROM
     i2c_stop();

     for(;;);
 }
Jag tänkte mig att EEPROMet ser ut som en hylla, med 64000fack. Varje fack har en adress, och varje fack rymmer 1byte. För att spara värdet "0x75" i fack 5 skriver man:

Kod: Markera allt

 i2c_write(0x05);                        // write address = 5
 i2c_write(0x75);                        // write value 0x75 to EEPROM
Det är altså samma funktion som anger plats, och värde som ska lagras? samma funktion används dessutom för att ange var man ska hämta information längre ner i exemplet. Jag tycker det känns lite förvirrande, är det någon som har använt detta bibliotek eller som förstår sig på koden? Varför är både minnesadresser och lagringsinformation hexadecimalt, är det inte komplicerat att gå omvägen genom det, för att behöva omvandlad det 2ggr extra?

//Alexander
bos
Inlägg: 2308
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: I2C AVR -> EEPROM

Inlägg av bos »

> Det är altså samma funktion som anger plats, och värde som ska lagras?

Ja. Om du läser databladet för 24C01A (sid 9, "Byte write") så får du svar på din fråga (eller iallafall en hint) varför man använder samma funktion.

> Varför är både minnesadresser och lagringsinformation hexadecimalt

Det är nog en smaksak ur programmerarsynpunkt.

> är det inte komplicerat att gå omvägen genom det, för att behöva omvandlad det 2ggr extra?

Va?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4743
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: I2C AVR -> EEPROM

Inlägg av Swech »

Du kan köra med decimala adresser och data... eller binära eller hex...
normalt behöver du inte omvandla ett skvatt.

swech
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: I2C AVR -> EEPROM

Inlägg av vfr »

All data lagras i binär form som ettor och nollor i kretsen. Sedan kan du presentera datan på olika sätt. Dels i koden som i exemplet, dels vid visning av data/värden för användaren. Vid inmatning av kontstanter i koden så sköter assemblern om den omvandlingen. Skall du däremot presentera ett värde för användaren, t.ex ett mätvärde, så måste du sköta omvandligen för det vet inte assemblern något om.
linlun
Inlägg: 15
Blev medlem: 26 september 2007, 11:37:21
Ort: Göteborg

Re: I2C AVR -> EEPROM

Inlägg av linlun »

Det finns ett bra lib för att använda i2c-eeprom i2c-instructable for ATmega.

För att använda ett större minne som använder 2 byte till adress har han gjort en specialvariant. Jag kan ge den till mig om du hör av dig.
Jag har testat och använder den modifierade versionen för ett 64k minne farnell 1439744 och det fungerar perfekt.

/Linus
Ranstam
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16
Ort: LUND

Re: I2C AVR -> EEPROM

Inlägg av Ranstam »

Jag har läst igenom Exempelkoden för I2C nu, men hänger inte riktigt med. Filen i2cmaster.h lägger man helt enkelt till i utvecklingsmiljön(avrstudio), och skriver "include..." men det finns även en film som heter i2cmaster.s som bla innehller information om vilka portar som ska användas för kommunikation, vad gör man med .s filen? jag har aldrig stött på dessa tidigare.

Det står lite vagt om den här http://homepage.hispeed.ch/peterfleury/ ... aster.html


Någon som vet?


//Alexander
sodjan
EF Sponsor
Inlägg: 43244
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: I2C AVR -> EEPROM

Inlägg av sodjan »

".s" låter enligt sidan som du länkade till bara som en assembler fil.
Du ska väl assemblera och länka in den vid länkningen av din
applikation, antar jag. "Precis som vanligt", misstänker jag...
Ranstam
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16
Ort: LUND

Re: I2C AVR -> EEPROM

Inlägg av Ranstam »

Räcker det att adressera EEPROMET med 0xA0?, jag läste någon stans att adressen var mycket längre.

"0xA0" säger inte mig så mycket, och jag hittar inte något på nätet om det. Det har att göra med dom 3 benen som är märkta A0/1/2 på kretsen. Jag har dragit samtliga av dessa till jord, stämmer adressen då?

//Alexander
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: I2C AVR -> EEPROM

Inlägg av vfr »

Om du menar själva minnets I2C-adress (i motsats till innehållets adresser), så brukar den vara tvådelad. Dels ett hårdkodat device-id för just den typen av chip, dels en ställbar del av adressen på t.ex 3 bitar (8 adresser) som kan ställas in på yttre pinnar på chipen. Dessa ställbara är huvudsakligen för att kunna skilja dom åt om man har flera likadana chip på samma buss.

'0xA0' låter som den hårdkodade chipadressen. Har du sedan pinnar märkta t.ex A0-A2? Det är isåfall den ställbara delen av adressen. Sätter du alla dom till 0 så borde du få adressen 0xA0 på minnet.

Edit: Såg nu efteråt att du skrivit om just A0-A2. Ja, då borde det stämma.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: I2C AVR -> EEPROM

Inlägg av Kaggen »

Ranstam skrev:"0xA0" säger inte mig så mycket, och jag hittar inte något på nätet om det.
Brukar stå i databladet till det berörda EEPOM:et exakt hur du skall gå tillväga för att sätta/adressera det. Kolla upp ditt EEPROM mot ELFA eller något liknande ställe (tillverkaren t.ex) och kolla i databladet. Detta skiljer sig från olika fabrikat så det finns inget generellt svar, mer än det vfr sagt ovan.
Ranstam
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16
Ort: LUND

Re: I2C AVR -> EEPROM

Inlägg av Ranstam »

Jag har lyckats reda ut det där med hex, hittade lite omvandlingstabeller på nätet. Även adresseringen ska fungera nu. Tyvärr fungerar inte koden alls, och jag har ingen aning om var felet är. Vad jag har förstått på forumen på nätet så är jag inte ensam.

En nödlösning är ju att göra en egen minneskrets, och att skippa i2c prylarna. Tyvärr är det ju lite dyrt också. En Atmega16 har ju 1k minne, och kan ju via uart lagra information åt en extern krets. 60kr för 1k istället för 15kr för 64k :/



//Alexander
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: I2C AVR -> EEPROM

Inlägg av Kaggen »

Är du säker på att du öppnat och gått igenom filen "i2cmaster.s" som beskrivs i manualen till biblioteket? i2cmaster.s är en assembler fil med de funktioner som ingår i biblioteket. Där specificeras också vilka pinnar som skall agera SDA och SCL (default pinne 4 och 5, dvs PORTD bit 4 och 5) och en delay rutin som måste modifieras beroende på vilken frekvens du kör processorn på (default är i2cmaster.s ställd på 4MHz vad jag kan se). Du måste även välja om du kör fast eller normal mode (default i i2cmaster.s är 100kHz). Har du kopplat rätt med pull-ups och pinnar som det står beskrivet?

Om du inte ändrar något i i2cmaster.s så måste alltså processorn klockas på 4MHz, SDA vara kopplad till det ben på processorn som motsvarar PORTD bit 4 och SCL till det ben som motsvarar PORTD bit 5.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: I2C AVR -> EEPROM

Inlägg av BEEP »

"hittade lite omvandlingstabeller på nätet"
Du kan använda kalkylatorn i Windows för att omvandla hex till dec. Klicka på Visa/Avancerat.
Ranstam
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16
Ort: LUND

Re: I2C AVR -> EEPROM

Inlägg av Ranstam »

Hej

Det hela görs lite mer komplicerat av att koden jag provade innehåller två stycken delar. Tydligen så finns det hårdvarustöd för ett protokoll som heter TWI, som är atmels eget namn på I2C. De atmega som har denna hårdvara behöver inte .s koden. Däremot måste man in i en Makefile och ändra om lite.


//Alexander
sodjan
EF Sponsor
Inlägg: 43244
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: I2C AVR -> EEPROM

Inlägg av sodjan »

TWI ("Two Wire Interface") är inte Atmels eget namn på I2C, det är Atmels namn på
den enhet i en AVR processor som *bland annat* kan köra I2C. Jag tror att den
även kör SPI. På samma sätt som samma enhet i en PIC heter SSP ("Synchronous
Serial Port"), det är inte heller Microchips "namn på I2C"...

Och det borde vara betydligt enklare att köra med en processor som
har en TWI enhet, i och för sig.
Skriv svar