mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC I2C EEPROM beschreiben


Autor: michi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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.