mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik immer noch EEprom


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist irgendwie merkwürdig, was vor 2 Tagen noch ohne delay funftionierte, 
funktioniert jetzt nur noch mit delay im Hauptprogramm..wieso.
Ich warte doch die Stop-Bedingung vom EEprom ab bevor ich neu beschreibe


int EEPROM_SCHREIBEN (void)
{
  BasisAdresse = 0xA0;
    BlockAdresse = EEpromAdresse/256;
    BasisAdresse1 = BasisAdresse + BlockAdresse * 2;
    Speicherzelle = EEpromAdresse%256;

TWSR = (0<<TWPS0) | (0<<TWPS1);       // Prescaler 1
TWBR = 0x34;                // berechnung ergab 52


TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);  // start senden
while  (!(TWCR & (1<<TWINT)));        // warten bis fertig
if ((TWSR & 0xF8) != START)
ERROR();


TWDR = BasisAdresse1  ;            // Controll BYTE fur 24c08  OxA1 = 
lesen !!
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));        // warten bis fertig
if ((TWSR & 0xF8) != TWI_MTX_ADR_ACK)    // hats geklappt ?
ERROR();


TWDR = Speicherzelle;            // Daten(ADRERSSE) an das EEPROM senden
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));        // warten bis fertig
if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)    // hats geklappt ?
ERROR();


TWDR = EEPROM_DATEN;            // Daten(DATEN) an das EEPROM senden
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));        // warten bis fertig
if ((TWSR & 0xF8) != TWI_MTX_DATA_ACK)    // hats geklappt ?
ERROR();

TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // und STOP senden
while(TWCR & (1<<TWSTO));          // warten bis fertig

return 0;
}
int main (void)
{

for (EEpromAdresse=0 ; EEpromAdresse <=1023 ; EEpromAdresse++)

  {
      EEPROM_DATEN = 0;
      EEPROM_SCHREIBEN();
      _delay_ms(10);
  }

while(1)
  {
    return 0;
  }
}

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn der EEPROM das stop akzepziert ist   fängt er an mit schreiben
dann muss man so je mach typ 2-5ms warten

du must dann eigentlich prüfen ob du beim senden der EEPROM adresse ein 
ACK bekommst
wenn ein NACK kommt schreibt er noch

also :

schreiben ()
while (prüfen ob ACK)

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mach ich doch hier..oder?

TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // und STOP senden
while(TWCR & (1<<TWSTO));          // warten bis fertig

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ingo Laabs schrieb:
> das mach ich doch hier..oder?
>
> TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // und STOP senden
> while(TWCR & (1<<TWSTO));          // warten bis fertig

nein, hier wartest Du auf das Ende von Stop. Danach ist der I2C-Nus 
wieder frei, um z.B. mit einem anderen Baustein reden zu können.

Der EEPROM beginnt jetzt intern erst mit dem Schreiben.

Wie man abfragt, ob er damit fertig ist, sollte das Datenblatt verraten, 
ein Hinweis kam ja schon.

Gruß aus Berlin
Michael

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm...

TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);  // und STOP senden
while (TWCR & (1<<TWINT));


so haut es aber auch nicht hin

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs schrieb:

> so haut es aber auch nicht hin

Wie denn auch. Du machst hier nur Bus Abfragen. Du musst den Chip 
auf einer höheren Kommunikationsebene fragen, ob er schon wieder bereit 
ist.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> wenn der EEPROM das stop akzepziert ist   fängt er an mit schreiben
> dann muss man so je mach typ 2-5ms warten
>
> du must dann eigentlich prüfen ob du beim senden der EEPROM adresse ein
> ACK bekommst
> wenn ein NACK kommt schreibt er noch

Ich hab letzthin so ein Teil angeschlossen. Wenn der Chip noch 
geschrieben hat, kam auf die Adresse noch ein ACK, das erste zu 
schreibende Datenbyte wurde mit NACK beantwortet.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
>
> Wie denn auch. Du machst hier nur Bus Abfragen. Du musst den *Chip*
> auf einer höheren Kommunikationsebene fragen, ob er schon wieder bereit
> ist.
 ja aber wie ?
Habe mich doch hier genau an das Beispiel aus dem Datenblatt gehalten 
was ja auch soweit funktioniert, aber nur einmal. Will ich dann ein 
zweites Byte schreiben funktioniert das nicht.

Gruß aus Berlin
Ingo

Autor: Michael U. (amiga)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe jetzt nicht geschaut, ob Du den EEPROM-Typ erwähnt hast, aber 
mal das Datenblatt eines 24LC256 Seite 10 unter Acknowledge Polling.

Du mußt vor dem nächsten Zugriff abfragen, ob das EEPROM mit schreiben 
fertig ist. Wenn nicht, bekommst Du kein ACK und muß es eben nochmal 
versuchen.

Gruß aus Berlin
Michael

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alle eeproms haben das selbe schema :

startbit
eepromadresse ( mit schreibbit)
datenadresse
daten
.
.( für page write größe beachten )
.
.daten
stopbit
( und jetz muss man ~5ms warten  oder ackpolling betreiben )


wobei ich festgestellt hab das ackpolling bei meinen eeproms im schnitt 
3-5ms brauch -.-


der witz beim lernen ist der ..
wenn man nur ab und an was reischreibt ... ( ohne ackpolling oder 
warten)
wo genug luft dazwischen ist
und alles läuft

dann aber alles rumspinnt weil man nun mal mehrere werte speichert ^^

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ( und jetz muss man ~5ms warten  oder ackpolling betreiben )


das ich jetzt warten muss, habe ich ja begriffen. Mit einem delay von, 
bei mir 10ms funktioniert es ja.

Ich weiß jetzt nur nicht wie ich das ACK-Polling nach dem Stopp 
durchführe.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach eine neue Schreiboperation ankicken und wenn ein NACK kommt, mit 
Stop abbrechen und neu versuchen.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu schrieb:
> Einfach eine neue Schreiboperation ankicken und wenn ein NACK kommt, mit
> Stop abbrechen und neu versuchen.

und genau das verstehe ich nicht, wie das funktionieren soll....

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs schrieb:
> und genau das verstehe ich nicht, wie das funktionieren soll....

Die Brachiallösung ist ein 5 ms Delay nach jedem geschrieben Byte.

Die etwa feinere schreibt so lange, bis das EEPROM mit NACK antwortet 
und schickt dann ein Restart und versucht das abgewiesene Byte nochmal 
zu schreiben - so lange, bis ein ACK zurück kommt.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5 ms !!!
ach du liebe Zeit.
Bei 1024 Byte beim 24C08 würden alleine diese 5 ms schon dafür sorgen, 
dass das schreiben des EEPROM 5,12 Sekunden benötigt.
Beim 24C512 wären es ja dann schon 327 Sekunden oder sehe ich das falsch 
?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn man eine page schreibt geht das schneller :P

dieEEPROMs brauchen diese zeit für EINE schreiboperation
ob da nun 1 byte oder eine page geschrieben wird ist egal
beides dauert ~5ms

man muss beim schreiben jedoch aufpassen das man nicht Über die pagezise 
schreibt
da der adresscounter im EEPROM dann meist an den anfang der page springt 
und so alte werte überschreibt



zum ack polling

steht doch im datenblatt
steht auf dem datemblatt hier vom thread auf seite 10
bzw kapitel 7.0

zitat :
ACK polling can be initiated immediately. This involves the master
sending a Start condition, followed by the control byte
for a Write command (R/W = 0). If the device is still
busy with the write cycle, then no ACK will be returned.
If no ACK is returned, the Start bit and control byte must
be resent


zB von meinem 24FCxxxx

startbit
eeprom adresse mit  R/!W = 0 ( schreiboperation )
kommt ein ACK = 0  dann isser fertig
wenn nicht ...
neues senden von start
solange bis eben ACK kommt

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.