Forum: Mikrocontroller und Digitale Elektronik EEPROM ATMEGA32


von Transi (Gast)


Lesenswert?

Hallo µC (AVR) Gemeinde,

ich bekomme das Schreiben in das EEPROM eines ATMEGA 32 nicht hin und 
hätte dazu einige Fragen.
Wenn ich die unten stehende Funktion ausführe wird der ucDaten Wert 
nicht auf der vorgegebenen Adresse gespeichert, sondern beim Lesen 
erhalte ich immer 0xFF zurück, was typischerweise der 
Initialisierungswert eines EEPROMs ist.

void EEPROM_Write (unsigned int uiAdresse, unsigned char ucDaten)
{
  cli();        //Interrupts sperren
  while (EECR & (1<<EEWE))
  {
    ;      //mögliche Schreibroutine abwarten
  }

  EEAR = uiAdresse;
  EEDR = ucDaten;

  EECR |= (1<<EEMWE);  //Set EEMWE
  EECR |= (1<<EEWE);  //Set EEWE
  sei();        //Interrupts freigeben
}

Was ich nicht verstehen ist, wie man die int Adresse dem Regsiter EEAR 
zuweisen kann.
Das Adressregister wird im Datenblatt als EARH und EARL beschrieben. 
Dröselt der Compiler (AVR Studio) das auf? Hatte das auch schon von Hand 
gemacht, aber es funktioniert auch nicht besser.
Ich vermute den Fehler allerdings eher im setzen der Bits EEMWE und 
EEWE. Laut Datenblatt muss dies innerhalb von 4 Taktzyklen erfolgen. Ist 
das gewährleistet? Was mich in diesem Zusammenhang auch wundert ist, 
dass das EEPROM irgend wie mit dem internen 8MHz RC Oszillator arbeitet. 
Mein CPU Takt wird aber mittels externem 3,6MHz Quarz gewonnen. Ist in 
dieser Richtung (Fuse Bits) noch irgend etwas zu beachten?

Besten Dank für Eure Tips

Transi

von Transi (Gast)


Lesenswert?

Sorry, wenn ich diesen Trad noch einmal nach vorne zerre,

aber ich bin immer noch nicht wirklich weiter.
Hat vielleicht doch noch jemand eine Idee?

von holger (Gast)


Lesenswert?


von holger (Gast)


Lesenswert?

Ach Mist, copy and paste Fehler:

Jetzt aber:

von holger (Gast)


Lesenswert?

Und schon wieder daneben:

http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

Ich geh jetzt besser schlafen;)

von Tom M. (tomm) Benutzerseite


Lesenswert?

Transi schrieb:
> Laut Datenblatt muss dies innerhalb von 4 Taktzyklen erfolgen. Ist
> das gewährleistet?

Lässt sich so nicht beantworten und könnte abhängig sein von 
Optimierungsstufe und Compilerversion. Schau ins Listing oder 
Disassembly des Object Files, wenn du's prüfen möchtest.

Würde mich aber nicht darauf verlassen und die mitgelieferten Funktionen 
der avr-libc verwenden (siehe link von Holger).

von Tom M. (tomm) Benutzerseite


Lesenswert?

holger schrieb:
> Ich geh jetzt besser schlafen;)

;) Der Link funktioniert schon, nur die Anzeige wird etwas weggekürzt.

von Michael K. (saxosun)


Lesenswert?

> Das Adressregister wird im Datenblatt als EARH und EARL beschrieben.
> Dröselt der Compiler (AVR Studio) das auf?

Hallo, du kannst in EEAR eine int Adresse eingeben ( 0x000 - 0x3ff), 
alternativ kannst du natürlich auch EEARH u. EEARL einzeln laden, aber 
wer macht das in C schon.

Im Prinzip kannst du einfach den Code aus dem Datenblatt verwenden:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

die Adresse als int und die Daten als char übergeben.
Und nicht vergessen, der EEprom wird bei jedem programmieren wieder 
überschrieben (0xff)!

viele Grüße
Saxosun

von Komischer Typ (Gast)


Lesenswert?

Schau dr doch mal die Assemblerdatei an und zähle die benötigten Takte. 
Alternativ kannste dir das ja auch im Simulator anschauen. Bei einem 
ähnlichen Versuch bin ich gescheitert auf die 4 Takte zu kommen. Ich 
vermute das es ohne Inlineassembler eher schwierig wird.

von Transi (Gast)


Lesenswert?

Endlich,

mit dem Inlineassembler funktionierts.
Der Compiler generiert wohl eine zu langsame Behfehlsfolge.

Danke Euch allen, wieder etwas gelernt.

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.