- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: EEPROM lesen/schreiben

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66

    EEPROM lesen/schreiben

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich wollte nun mal auf meinem Pollin Evaluationboard 2.01 den EEPROM nutzen. Dazu habe ich (ebenfalls von Pollin) einen M24C08 gekauft.

    Nun stehe ich vor dem Problem das ich nachdem ich einiges dazu gelesen habe, nun gar nicht mehr weiß wie ich das anfangen soll.

    Der wird ja über I2C angesteuert. Ich nutze für einen Servocontroller die
    i2cmaster.h von Peter Fleury und hatte gehofft damit etwas anfangen zu können.
    Nun lese ich aber etwas von eeprom_read_byte auf microcontroller.net. Soll ich das nun wie in dem Tutorial da machen, oder über I2C ?
    Wo ist der Unterschied? Wenn es doch über I2C angesprochen wird, warum gibt es dann von AVR irgendwelche Lib`s dazu?

    Ich hatte bereits verzweifelt versucht die Adresse aus dem Datenblatt zu entnehmen. Außer 1010b steht da irgendwie nix. Reicht das denn?
    Bei dem Servocontroller brauche ich eine Hauptadresse zum ansprechen und dann noch weitere Adressen, das der überhaupt weiß, wo ich was hinschreiben möchte.

    Für`s erste würde es mir reichen einfach nur eine Zahl zu schreiben und wieder auszulesen. Nur um das erst mal zu verstehen.

    Ich hatte mir das eigentlich vorgestellt wie folgt:

    i2c_start_wait( 0xC2+ I2C_WRITE);
    i2c_write(address); //Adresse
    i2c_write(value); //Wert
    i2c_stop();

    Mein Gedanke war, die 0xC2 vom Servocontroller mit der 1010b aus dem Datenblatt zu ersetzen. Für mich sieht das 1010b nicht wie eine gültige Adresse aus, aber was solls.
    Und wo schreibe ich nun hin? Sind die INIT Adresse und die Write Adresse die selbe?

    Wäre nett, wenn mich dazu mal jemand aufklären könnte.

    Gruß

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Nun lese ich aber etwas von eeprom_read_byte auf microcontroller.net.
    Das bezieht sich auf den EEPROM im Kontroller.
    Die Device-Adresse sollte A8 sein?
    Vielleicht kannst du mit dem hier was anfangen:
    Code:
    /****************************************************************************
    Title:    Access serial EEPROM 24C02 using I2C interace
    Author:   Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
    Date:     9-Mar-2003
    Software: AVR-GCC 3.3
    Hardware: AT90S8515 at 4 Mhz, any AVR device can be used
    
    Description:
        This example shows how the I2C library i2cmaster.S can be used to 
        access a serial eeprom.
        Based on Atmel Application Note AVR300, adapted to AVR-GCC C interface
    
    *****************************************************************************/
    #include <avr/io.h>
    #include "i2cmaster.h"
    
    
    #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet
    
    
    int main(void)
    {
        unsigned char ret;
        
    
        DDRB  = 0xff;                              // use all pins on port B for output 
        PORTB = 0xff;                              // (active low LED's )
    
        i2c_init();                                // init I2C interface
    
        /* write 0x75 to eeprom address 0x05 (Byte Write) */
        ret = i2c_start(Dev24C02+I2C_WRITE);       // set device address and write mode
        if ( ret ) {
            /* failed to issue start condition, possibly no device found */
            i2c_stop();
            PORTB=0x00;                            // activate all 8 LED to show error */
        }else {
            /* issuing start condition ok, device accessible */
            i2c_write(0x05);                       // write address = 5
            i2c_write(0x75);                       // ret=0 -> Ok, ret=1 -> no ACK 
            i2c_stop();                            // set stop conditon = release bus
    
            /* write ok, read value back from eeprom address 0x05, 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(0x05);                        // write address = 5
            i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode
            ret = i2c_readNak();                    // read one byte
            i2c_stop();
            
            PORTB = ~ret;                           // output byte on the LED's
    
            /* 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();                              // set stop condition = release bus
        
            PORTB = ~ret;                            // output byte on the LED's        
        }
        
        for(;;);	
    }
    Bezieht sich zwar auf einen 24C02 sollte aber sonst passen.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Das wird immer verzwickter. Ich habe nun folgendes Herausgefunden:

    Dieses EEPROM was ich da habe wird nicht mit 8Bit adressiert, sondern mit 10 Bit.

    Ein normaler Zugriff über 8Bit würde lauten:

    Quelle(http://www.mikrocontroller.net/topic/109417)
    [.............]
    Peter Fleury übergibt diese 8-Bit mit dem ersten i2c_write -Befehl. Hier
    i2c_write(0x00); Es wird also die Speicherstelle 0x00 ausgewählt. Mit
    den nächsten Befehlen werden dann Buchstaben aufs EEPROM geschrieben.

    i2c_start_wait(Dev24C02+I2C_WRITE);
    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();
    [.............]

    Genau so war das bei meinem Servo Controller auch. Erst die Geräteadresse, dann die Speicheradresse und dann die Daten.


    So, nun kommt dieses 10Bit Wunderding:

    Quelle(http://www.mikrocontroller.net/topic/109417)
    [.............]
    AT24C08, 8K SERIAL EEPROM: Internally organized with 64 pages of 16
    bytes each, the 8K requires a 10-bit data word address for random word
    addressing. 4K(512x=64x16x8

    Dabei sind zwei Bits in der Device Adresse. Hier P1 und P0
    1010 A2 P1 P0 R/W

    Du übergibst somit mit der Device-Adresse schon ein Teil und mit
    i2c_write(0x00) den Rest der Speicheradresse.
    [.............]


    Damit komme ich nicht klar.
    Ist folgendes alles die Adresse? 1010 A2 P1 P0 R/W
    Oder ist das ein(e) Schema/Maske?

    Hier ein Auszug aus dem Datenblatt meines EEPROMS:
    (http://www.pollin.de/shop/downloads/D100756D.PDF)
    [.............]
    The Device Select Code consists of a 4-bit Device Type Identifier, and a 3-bit Chip Enable
    “Address” (E2, E1, E0). To address the memory array, the 4-bit Device Type Identifier is
    1010b.
    [.............]


    Immerhin deckt sich diese "1010" schon mal mit dem Beitrag von mikrocontroller.net
    Was hat das nun mit diesem E0, E1,E2 auf sich?
    Hängen die mit den "64 Pages" zusammen?
    Und das R/W heißt wohl ob man Lese- oder Schreibzugriff möchte.
    Nur wie schreibt man das alles in die adresse?


    Gruß

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Der 28C08 hat nur ein E2, mit A1 und A2 schaltest du zwischen den Blöcken um.
    Das 1010 ist in hex ein A, daher A8.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Nach vielen Versuchen ist mir wenigstens ein Teilerfolg gelungen.

    Vorweg: mit der Adresse A8 geht es nicht. Wenn man sie Aufdröselt:
    10101000
    1010 ist die Adresse, die auch schon im Datenblatt steht, soweit okay.
    Kommen wir zum Auszug aus dem Datenblatt:
    M24C08 Select Code 1 0 1 0 E2 A9 A8 RW
    Mit den letzten vier Bits von der Adresse A8 würde ich Bit E2 aktivieren. Auch das habe ich irgendwo gelesen, dass das Bit E2 bei dem M24C08 verwendet werden soll (muss). Trotzdem geht es nicht.

    Ich wollte entnervt aufgeben als ich es ein letztes Mal mit der Adresse A2 probieren wollte:
    10100010
    Danach würde das Bit A8 statt Bit E2 verwendet. Damit geht es. Aber vermutlich nur die ersten 256 Adressen. Das habe ich nicht getestet, da mir 4 Byte vollkommen reichen.



    Ich musste grad feststellen das das sehr ätzend ist, das es einmal die Device Adresse A8 gibt und einmal das Bit A8. Das kann bei einer Fehlerbeschreibung ganz schön zu Verwirrung führen weil ohne Erklärung niemand weiß wovon man spricht.

    Zufrieden bin ich nicht mit dem Ergebniss, aber wenigstens kann ich nun ein paar Zahlen schreiben und lesen.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    Zitat Zitat von MechMac
    Das habe ich nicht getestet, da mir 4 Byte vollkommen reichen.
    Und wieso bleibst du dann nich gleich im internen EEPROM des AVRs? Der einzige Grund für ein externes EEPROM wäre, dass man mehr Speicher braucht als intern vorhanden ist... und wenn das der Fall ist, dann braucht man meist gleich so viel mehr Speicher, dass sich ein SD-Karte lohnt. Die Zeiten der externen EEPROMs sind langsam vorbei, sie sammen noch aus der Ära, als noch nicht alle Mikrocontroller inegriertes EEPROM hatten...

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Zitat Zitat von uwegw
    Der einzige Grund für ein externes EEPROM wäre, dass man mehr Speicher braucht als intern vorhanden ist.
    Nicht nur. Weiterer Vorteil: Ext. EEPROM ist austauschbar, sollte man den mal kaputtschreiben. Aber da wärs mal interessant: Wer hat schon mal den internen EEPROM im normalen Betrieb zerlegt?
    #ifndef MfG
    #define MfG

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Bei einem Mega16 könnte man, bei den garantierten 100000 Schreib/Lese Zyklen, den EEPROM 10 Jahre lang täglich 27 mal neu beschreiben.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test