Sari la conținut
ELFORUM - Forumul electronistilor

Atmega 8 & External Eeprom


criss

Postări Recomandate

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
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    3

  • Liviu M

    2

Top autori în acest subiect

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

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări