criss Postat Aprilie 15, 2011 Partajează Postat Aprilie 15, 2011 Buna ziua domnilor, Doresc sa conectez un Atmega 8(4Mhz) la un eeprom extern AT24C256 prin I2C, dar nu reusesc. Conectarea fizica l-am realizat: 1 - A0 => la masa 2 - A1 => la masa 3 - NC 4 - GND 5 - SDA => PC4 (+ rezistenta pull-up 4,7k) 6 - SCL => PC5 (+ rezistenta pull-up 4,7k) 7 - WP => la masa 8 - Vcc Am citit ca prin pini A0 respectiv A1 selectez adresa, dar cum? Libraria I2C l-am descarcat de la: http://homepage.hispeed.ch/peterfleury/i2cmaster.zip Atasez libraria+manualul de utilizare: [attachment=1]i2cmaster.zip[/attachment] [attachment=0]pfleury_avrlibs.zip[/attachment] #include "i2cmaster.h"#define Dev24C02 0xA0 // device address Aici nu stiu ce sa selectez .....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();}Compilarea se decurge normal dar dupa insrierea uCului cu fisierul compilat incep problemele ... La uC mai am atasat un LCD hd44780 care dupa scrierea fisierului in uC 'moare' doar primul rand ramane pe LCD si acela ca si cum uCul nu ar fi programat. Link spre comentariu
Liviu M Postat Aprilie 15, 2011 Partajează Postat Aprilie 15, 2011 Intamplator adresa pe care ai folosit-o e OK. Mai multe despre adresare - in datasheet - poza de la pagina 11. Cu alte cuvinte, in functie de valorile lui A1A0, poti avea 4 adrese diferite => poti conecta 4 memorii pe acelasi bus. De asemenea, daca functiile sunt OK scrise, ar trebui sa mearga. Faptul ca nu vezi nimic pe LCD se poate datora lipsei de initializare a LCD-ului. Cel putin in codul pe care l-ai postat nu programezi nimic pentru controlul LCD-ului. LE Am mai citit o data si adresarea e pe 2 bytes. Nu stiu ce se intampla daca scrii un singur byte. Adica ar trebui sa ai i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); // MSB address = 0 i2c_write(0x05); // LSB 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(0x00); // MSB address = 0 i2c_write(0x05); // LSB address = 5 i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode ret = i2c_readNak(); // read one byte from EEPROM i2c_stop(); Link spre comentariu
criss Postat Aprilie 15, 2011 Autor Partajează Postat Aprilie 15, 2011 multumesc, functioneaza adica imi afiseaza 65280 indeferent ce valoare au 0x41,0x42, 0x43 .. . Am folosit exemplul gasit pe acel site: /* write 0x70,0x71,072,073 to eeprom address 0x00..0x03 (Page Write), wait until the device is no longer busy from the previous write operation */ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); // write start address = 0 i2c_write(0x70); // write data to address 0 i2c_write(0x71); // " " " " 1 i2c_write(0x72); // " " " " 2 i2c_write(0x74); // " " " " 3 i2c_stop(); // set stop conditon = release bus /* write ok, read value back from eeprom address 0..3 (Sequencial Read), wait until the device is no longer busy from the previous write operation */ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); // write address = 0 i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode ret = i2c_readAck(); // read one byte form address 0 ret = i2c_readAck(); // " " " " " 1 ret = i2c_readAck(); // " " " " " 2 ret = i2c_readNak(); // " " " " " 3 i2c_stop(); Afisare: void ext_eepr_display(void){lcd_gotoxy( 0, 0 ); lcd_puts("EEprom");lcd_gotoxy( 1, 0 ); utoa(~ret, e, 10); lcd_puts(e); }In primul post nu am pus partea cu LCDul ca este cam complex si nu am dorit sa va incurcati. Problema a fost hardware adica rezistorii pull-up nu au fost conectati deoarece am detasat senzorul de temperatura DS1621 pt a exclude erorile si pe pinii lui au fost atasati rezistentele. inca nu stiu ce inseamna cea ce s-a afisat pe LCD dar am sa caut. o intrebare cu conectarea celorlalte echipamente pe bus, doresc sa conectez 3(o memorie si 2 senzori DS1621), cum voi stii care este adresa fiecaruia? cum sa setez pini Ax? DS1621: 1 - SDA 2 - SCL 3 - Tout => NC 4 - GND 5 - A2 => GND 6 - A1 => GND 7 - A0 => GND 8 - Vcc cum se stabileste adresa? pinul respectiv se conecteaza la masa? sau la Vcc? Multumesc anticipat Link spre comentariu
Liviu M Postat Aprilie 15, 2011 Partajează Postat Aprilie 15, 2011 Un pin Ax legat la masa inseamna 0, unul legat la VDD/+ inseamna 1.Cu alte cuvinte, A2=VDD, A1=GND, A0=VDD inseamna ca cei trei biti au valoarea 101. Nu trebuie insa uitat faptul ca adresele au 7 biti (si sunt intotdeauna pare), asa ca trebuie sa te uiti in documentatii sa vezi cum arata adresa completa.De exemplu la memoria de mai devreme e (parca) 10100AAx. AA sunt cei doi pini cu care poti schimba adresa, x e bitul care indica tipul operatiei (scriere pentru 0, 1 pentru citire (tot parca)). Link spre comentariu
criss Postat Aprilie 17, 2011 Autor Partajează Postat Aprilie 17, 2011 pana la urma l-am facut sa mearga corect, dar tot am renuntat la emularea prin soft si am ales pe cel hardware TWI. tot in acel dosar se gaseste si acel fisier. Scriere: i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); // MSB address = 0 (ce reprezinta aceasta adresa?) i2c_write(0x05); // LSB address = 5 (ce reprezinta aceasta adresa? pot sa trec si 0x00 ca si cel de sus si functioneaza, care dintre ele este adresa de inceput al memoriei?) i2c_write(160); // write value 0x75 to EEPROM i2c_write(235); i2c_write(244); // write value 0x75 to EEPROM i2c_stop(); // set stop conditon = release bus i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode i2c_write(0x00); // MSB address = 0 i2c_write(0x05); // LSB address = 5 Citire: i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode ret2 = i2c_readAck(); ret1 = i2c_readAck(); ret = i2c_readNak(); // read one byte from EEPROM i2c_stop(); Adresare: i2c_rep_start(0xA0+1); // pt citire 1 iar pt scriere 0 ret2 = i2c_readAck(); ret1 = i2c_readAck(); ret = i2c_readNak(); // read one byte from EEPROM i2c_stop(); I2C basic command sequence. * 1. Send the START bit (S). * 2. Send the slave address (ADDR). => "Dev24C02" * 3. Send the Read®-1 / Write(W)-0 bit. => "I2C_READ / I2C_WRITE" * 4. Wait for/Send an acknowledge bit (A). * 5. Send/Receive the data byte (8 bits) (DATA). => " i2c_write(235)" * 6. Expect/Send acknowledge bit (A). * 7. Send the STOP bit (P). => "i2c_stop()" In afara de cele 2 intrebari mentionate mai sus(in comentariile de la codul sursa) mai am una referitor la valoarea stocata in memorie maxim: 256..echivalentul a 8biti, care imi este prea mic eu doresc sa stochez o valoare intre 0-1.000.000. sau eventual variabile. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum