www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Schreiben und Lesen


Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich habe eine Kurze frage. Ich möchte mittels I2C auf ein EEProm 
schreiben. Muss ich jedes mal eine Adresse angeben wenn ich das EEProm 
anspreche oder hat das Teil einen zähler der hochzählt?

Wie teile ich dem Ding aber eine 16 Bit Adresse mit?

Mache das im Assembler und habe einen PIC mit i2c!

LG
Blackpuma

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt auf "das Ding" an...

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf welches Ding kommt es an????

I2C sollte doch überall gleich sein. Ich habe ein EEPROM von Microchip. 
Muss erst schaun was für eines.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I²C ist nur das Busprotokoll, wie der Chip was bewertet steht...
...im Datenblatt.

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

Bewertung
0 lesenswert
nicht lesenswert
In der Regel hat man die Möglichkeit einen größeren Block zu schreiben. 
Also mehrere Bytes mit einem Befehl. Dann gibt es auch noch die 
Möglichkeit ohne vorher angegebene Adresse zu schreiben. Dann nimmt er 
einfach den aktuellen "Pointer" und erhöt ihn um eins.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das EEPROM ist ein 24128 von Microchip. Steht das auch im 
Datenblatt ob das Teil den Pointer automatisch um 1 erhöht?

Heißt das ich kann es beim ersten mal auf die Adresse 0 setzten und dann 
brauch ich nur mehr hineinschreiben und der pointer wird immer um eines 
erhöht sodas er immer eine neue speicheradresse nimmt bis das teil voll 
ist?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas Riegebauer (blackpuma)

>Also das EEPROM ist ein 24128 von Microchip. Steht das auch im
>Datenblatt ob das Teil den Pointer automatisch um 1 erhöht?

Sicher.

>Heißt das ich kann es beim ersten mal auf die Adresse 0 setzten und dann
>brauch ich nur mehr hineinschreiben und der pointer wird immer um eines
>erhöht sodas er immer eine neue speicheradresse nimmt bis das teil voll
>ist?

Nein. So ein EEPROM hat sog. Pages, Speicherseiten, die je nacht Typ 
8....ganz viele Bytes langs sind. Der Pointer wird nur inerhalb einer 
Page erhöht, läuft er darüber hinaus fängt er am Anfang der Page wieder 
an. Steht alles im Datenblatt.

MFG
Falk

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So. Hab mich mal durch das Datenblatt gewühlt.

Der Counter wird immerhalb der Page um 1 erhöht. Wenn er voll ist fängt 
er wieder bei 0 an. OK

Wie das Teil die Adresse haben will is auch klar:
Kontrollbyte_Adress.high_Adress.low_datenbyte


Wie kann ich das Brauchbar realisieren?
2 byte im Prozessor in dem die Adresse steht. Nach jedem Schreiben wird 
das um 1 erhöht und diese Adressbytes dann immer mitschicken?

LG
Andreas

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas Riegebauer (blackpuma)

>Wie kann ich das Brauchbar realisieren?
>2 byte im Prozessor in dem die Adresse steht. Nach jedem Schreiben wird
>das um 1 erhöht und diese Adressbytes dann immer mitschicken?

???
Du hast es doch gerade ricgtig gesagt. Innerhalb einer Seite schickst du 
EINMAL die Adresse, dann N Bytes, der Zähler wird automatisch 
hochgezählt. Wenn du mehr als eine Page schreiben willst musst du eine 
neue Adresse schicken und das Gleiche nochmal.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> hochgezählt. Wenn du mehr als eine Page schreiben willst musst du eine
> neue Adresse schicken und das Gleiche nochmal.


Du mußt nach dem letzten Byte einer Page vor allem erstmal ein Stop 
schicken, damit das Schreiben überhaupt veranlaßt wird.

Und dann entweder die maximale Zeit warten oder den Chip solange 
adressieren, bis er sich nicht mehr tot stellt (kein NACK).


Peter

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich möchte das gesamte EEPROM vollschreiben. Ich starte bei Adresse 
0 und dann inkrementiere ich die Adresse. Wenn ich nur 256 
Speicherstellen beschreiben will wird das kein Problem sein. Wenn ich 
nun aber die 257 stelle beschreiben will wie mache ich das am besten?
while(1)
{
   adresse++;    // bis 256 kein Problem dann fängts ja wieder bei 0 an.
   schreibe_i2c(zeichen);
}

Wie kann ich das am einfachsten lösen?

Danke
Andreas

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal was geschrieben. Vielleicht könnt ihr mir sagen ob das so passt 
das ich von Adresse 0 bis 65k das gesamte eeprom vollschreibe.

Weiß auch nicht ob das mit der Globalen Var so passt. Brauche das 
anscheinend das ich sie für den Anfang auf 0 setzten kann.

Compiler ist cc5x.

uns16 address = 0;    // Weiß nicht ob das so funktioniert. Globale Var??

// **************************************************************************************
// eeprom_rs232: Schreibt den gemessenen Wert in das EEPROM. (ADRESH, ADRESL)
// **************************************************************************************

void eeprom_rs232()
{
  int high, low;
  
  address++;
  high = address.high8;
  low  = address.low8;

  bstart();          // Start Bedingung
  schreib(160);      // Bauteiladresse senden (zum schreiben)
  schreib(high);     // Höhere Adresse Übertragen (0..127)
  schreib(low);      // Niedrigere Adresse Übertragen (0..255)
  schreib(ADRESH);   // Schreibe das Zeichen
  bstop();           // Stop Bedingung

  address++;
  high = address.high8;
  low  = address.low8;

  bstart();          // Start Bedingung
  schreib(160);      // Bauteiladresse senden (zum schreiben)
  schreib(high);     // Höhere Adresse Übertragen (0..127)
  schreib(low);      // Niedrigere Adresse Übertragen (0..255)
  schreib(ADRESL);   // Schreibe das Zeichen
  bstop();           // Stop Bedingung

} //eeprom_rs232

// **************************************************************************************
// main: Hauptprogrammm. 
// **************************************************************************************

void main()
{
  init();

  while (1) {        // Endlosschleife

  pause(1000);       // 1 Sekunde Pause
  
  adc();             // AD Wert Messen

  eeprom_rs232();      // Sende Messwert an eeprom

  } //while
} //main

Danke
Andreas

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datum: 01.08.2007 14:27
Datum: 04.08.2008 09:18

Das hat ja lange gedauert, 1 Jahr für so eine Funktion? :P

Spass bei Seite, passt vom Grundprinzip, ob deine Funktionen so 
funktionieren, musst du feststellen. Ich habe übrigens den gleichen 
EEPROM verwendet, finde das Ding zu Kotzen langsam. Es gibt auch I2C/SPI 
Flash Bausteine mit 16 und mehr MBits die sich viel schneller 
beschreiben lassen.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauch das nicht so schnell. Ich möchte einen Drucksensor Messen 10 
od. 100 mal pro Sekunde und für das sollte es schon schnell genug sein. 
Die I2C Funktion ist auch eine Softwarelösung. Die funktioniert 
allerdings schon.

Bei SPI finde ich das blöd mit dem CS. Das ist bei I2C besser gelöst 
finde ich.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich möchte einen Drucksensor Messen 10 od. 100 mal pro Sekunde und für
>das sollte es schon schnell genug sein.
Das das EEPROM irgendwann kaputt geht wen du zu oft schreibst ist dir 
klar?
Für höhere Schreibgeschwindigkeit und längere Lebensdauer wäre evt. ein 
FRAM interessant. Gibt's als 1:1 ersatz für I²C EEPROMs.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Is mir klar das es nach 100k mal schreiben kaputt sein kann. es zeichnet 
die daten nur auf beim flug. und das wird max. 10 mal sein.

Wie ist das beim FRAM? wenn da die spannung weg ist sind aber auch die 
daten weg oder?

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenn da die spannung weg ist sind aber auch die daten weg oder?
Nein, die bleiben erhalten.

Da die FRAMs die Daten auch sofort nach erhalt schreiben gibt's da auch 
keine Pages auf die man achten müsste. Du kannst das Ding einfach von 
vorn bis hinten am Stück vollschreiben.

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.