Forum: Mikrocontroller und Digitale Elektronik PIC I2C EEPROM beschreiben


von michi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich will mit einem PIC18F4550 (20MHz) ASCII-Codes in einen EEPROM 
Speicher
(ST24C02) schreiben auslesen.

Ich habe ein Beispiel Programm gefunden, welches ich nicht verstehe:
------------------------------------------------------------------------
#include <18f4550.h>
#fuses HS,NOPROTECT,NOWDT,NOLVP
#use delay(clock=20000000)
#include <lcd.c>
#use i2c(master,sda=pin_b0,scl=pin_b1)   // i2c-Bus einbinden


int8 Schreibwert,Lesewert;
int1 ack=0;                              // Acknowledge-Bit für i2c-Bus
int i = 0;


main()                                   // Beginn des Hauptprogrammes
{
    lcd_init();                          // Initialisierung des LCDs
    Schreibwert=0;
    while(true)
    {

      printf(lcd_putc,"\fSchreibwert: %u",Schreibwert);
      delay_ms(1000);

      i2c_start();             // externen Speicher beschreiben
      i2c_write(0xa0);         // Adresse des externen Speichers+"write"
      i2c_write(0);            // Speicheradresse 8 beschreiben
      i2c_write(Schreibwert);  // die Variable "Schreibwert" schreiben
      i2c_stop();

      delay_ms(50);

      i2c_start();             // externen Speicher auslesen
      i2c_write(0xa0);         // Adresse des externen Speichers+"write"
      i2c_write(0);            // Speicheradresse 8 auslesen
      i2c_start();             // laut Datenblatt nocheinmal starten
      i2c_write(0xa1);         // Adresse des externen Speichers+"read"
      Lesewert=i2c_read(ack);  // Speicherinhalt auslesen
      i2c_stop();

      printf(lcd_putc,"\nLesewert: %u",Lesewert);
      delay_ms(500);

      Schreibwert++;         // Variable "Schreibwert" um 1 erhöhen
   }
}
------------------------------------------------------------------------

Ich habe es getestet, es funktioniert. Doch warum muss man zuerst 
i2c_write(0);   schreiben und kann erst dann die eigentlichen Daten 
schreiben?

Schreibt man einen Wert in den Speicher, wird die Speicheradresse 
automatisch um 1 erhöht. Wie zu einer bestimmten Stelle springen und 
dort zu lesen/ schreiben beginnen?

Danke für eure Hilfe

von Dieter W. (dds5)


Lesenswert?

> Ich habe es getestet, es funktioniert. Doch warum muss man zuerst
> i2c_write(0);   schreiben und kann erst dann die eigentlichen Daten
> schreiben?

Die (0) ist in diesem Beispielfall die Startadresse.

> Schreibt man einen Wert in den Speicher, wird die Speicheradresse
> automatisch um 1 erhöht. Wie zu einer bestimmten Stelle springen und
> dort zu lesen/ schreiben beginnen?

Indem man statt der (0) die Adresse einsetzt ab der der geschrieben bzw. 
gelesen werden soll.

> Danke für eure Hilfe

Gerne geschehen

von michi (Gast)


Lesenswert?

Danke für deine Hilfe, jetzt verstehe ich das Programm.
Ich habe es umgeschrieben, dass es einen Wert in den EEPROM speichert, 
wieder ausliest. Das wird so oft wiederholt bis der richtige Wert 
gespeichert wurde und eine Meldung über RS232 zum PC sendet.

------------------------------------------------------------------------
int cma = 0x00;

void SaveToEEPROM(int valuetosave)
{
int read = 0x00;
while(read != valuetosave)
{
  printf("\n\n\n\rversuche 0x%X nach 0x%X zu 
speichern",valuetosave,cma);

  i2c_start();
  i2c_write(0xa0);
  i2c_write(cma);
  i2c_write(valuetosave);
  i2c_stop();
  delay_ms(50);

  i2c_start();
  i2c_write(0xa0);
  i2c_write(cma);
  i2c_start();
  i2c_write(0xa1);
  read = i2c_read(ack);
  i2c_stop();
  delay_ms(50);

  printf("\n\rsoll:0x%X  ist:0x%X",valuetosave,read);

}

printf("\n\rwert 0x%X erfolgreich nach 0x%X 
gespeichert",valuetosave,cma);
cma++;  // AKTUELLE SPEICHERADRESSE UM 1 ERHÖHEN

}
------------------------------------------------------------------------



Die Ausgabe am PC sieht folgend aus (wenn es funktioniert hat):

versuche 0x61 nach 0x0A zu speichern
soll:0x61  ist:0x61
wert 0x61 erfolgreich nach 0x0A gespeichert



Jedoch funktioniert es fast nie, und es wird nicht der Wert ausgelesen 
der geschrieben wurde, sondern meistens 0x63.

Woran kann das liegen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.