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
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).
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.