www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR; i2c Problem, avrlib von peter fleury


Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ich habe leider nicht so viel Erfahrung mit i2c, möchte aber lernen. Ich 
benutze eine ATMega 128. ich habe da ein altes EEPROM dran welches noch 
keine unterschiedliche Adressierung unterstützt (vielleicht liegt es 
auch nicht am alter sondern nur am typ, ist ja egal).
     unsigned char ret;

     i2c_init();                             // initialize I2C library

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

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

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

Ich habe jetzt Adresse mit 0xAF definiert, bei anderen Adressen bleibt 
die routine hängen.
ich benutze twimaster.c und i2cmaster.h aus der lib von peter fleury. An 
SDA und SCL habe ich 4,7 kOhm Widerstände dran.

Das problem ist ich bekomme immer ein 0xB0 in die variable ret. egal was 
ich auslese.

hat einer eine idee an was es leigen könnte? wenn informationen fehlen 
nicht böse sein oder zynisch einfach schreiben was fehlt bitte.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast den Typ des EEPROM nicht angegeben, aber du hast hoffentlich die 
'baud'rate des I2C richtig gesetzt (steht nicht in dem code)
    unsigned char ret;
    // initialize I2C library
    i2c_init();

    // read previously written value back from EEPROM address 5 
    i2c_start_wait(ADRESSE+I2C_WRITE);     
    
    /* Hier musst du dem EEPROM _wahrscheinlich_
       eine Speicheradresse schicken, damit das weiß wohin mit den bytes.
       schau aber lieber nach, in welcher reihenfolge */
    unsigned int eineadresse 0;
    i2c_write((unsigned char)(eineadresse>>8));
    i2c_write((unsigned char)eineadresse);

    // daten:
    i2c_write(0x05); 

    i2c_start_wait(ADRESSE+I2C_WRITE);     
    
    /* Nochmal die interne adresse schicken, die meisten EEproms 
      erhöhen von allein den adresszähler */
    i2c_write((unsigned char)(eineadresse>>8));
    i2c_write((unsigned char)eineadresse);

    i2c_rep_start(ADRESSE+I2C_READ);

    // set device address and read mode

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

rtfm! Jörg

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt hab vergessen zu schreiben was das für ein eeprom ist. es ist 
eines mit 128 byte.
ein byte adresse müsste also reichen. oder muss ich trotzdem beide 
senden? das problem ist ich habe nicht so viele informationen über den 
eeprom. der steckt in einen vergossenden gehäuse.

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weißt Du genau, daß es ein I2C Baustein ist? Die Bezeichnung für 128 
Byte ist dann 24C01. Es gibt auch Microwire. Die beginnen mit 93C.. und 
gehen nicht mit I2C.

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, hab den fehler gefunden.

ich habe den EEPROM mit der adresse 0xA7 angesprochen, und er hat mir 
die adresse einfach um 1 erhöht und zurückgeschickt.

Etweder hab ich es noch irgendein geheimniss beim i2c noch nicht 
gekannt, oder das ist ein eigenartiger effekt bei diesen exemplar eines 
EEPROMs.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habe den EEPROM mit der adresse 0xA7 angesprochen, und er hat mir die
> adresse einfach um 1 erhöht und zurückgeschickt.

was bedeutet das? was hast du wie angesprochen, was hat womit wann 
geantwortet?

?? Jörg
ps.: in den Datasheets gibt meistens hübsche ( -leider keine bunten- ) 
Bildchen, wie Chips über Busse angsprochen werden wollen ;-)

Autor: Ulrich P. (uprinz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe das Problem nicht. Das eeprom erhöht mit jedem Zugriff seinen 
Adresszeiger. Also Adresse auf 0x05 gesetzt und was geschrieben. Damit 
steht der Adresspointer dann auf Ox06. Wenn man jetzt das vorher 
geschriebene lesen möchte, muss man erst wieder die Adresse neu setzen. 
Das ist normal und bei jedem EEPROM gleich.

Gruss, Ulrich

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.