EEPROM ATMEGA32

Gast #2813306
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
Persönliche Seite #2815721
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).
#2815740
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
Gast #2815771
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren