Forum: Mikrocontroller und Digitale Elektronik EEPROM schreiben geht nicht / AVR


von tippex (Gast)


Lesenswert?

Hallo

Ich möchte bei einem ATtiny25 das EEPROM lesen und
schreiben - lesen geht, aber das Schreiben funktioniert nicht...
1
  cli();
2
 // --- read ---
3
  while (EECR & (1<<EEPE) );  // wait for previous write access
4
  EEAR = 0x07;                // ee size = 128' => HByte not needed
5
  EECR |= (1<<EERE);          // start read
6
  EEByte = EEDR;              // read ee data register
7
 // --- write ---
8
  EEByte = 0x88;
9
  while (EECR & (1<<EEPE) );       // wait for previous write access
10
  EECR = (0<<EEPM1) | (0<<EEPM0);  // set programming mode
11
  EEAR = 0x08;                     // ee size = 128' => HByte not needed
12
  EEDR = EEByte;                   // write byte @ address
13
  EECR |= (1<<EEMPE);              // master prog. enable
14
  EECR |= (1<<EEPE);               // start write
15
16
  sei();

Die C-Code-Zeilen sind genau so, wie sie im µC-Handbuch stehen. Gibt es 
irgendwo einen "Trick", etwas, was ich vergessen oder übersehen habe 
(Interrupts sind ja schon disabled)? Ich habe gestern den ganzen Tag 
nach dem Fehler gesucht, hier in den Foren, via Google usw...

Danke schon mal für Eure Hilfe.

von Jonas B. (jibi)


Lesenswert?

Hallo,

zeig doch mal den "ganzen Code". Noch besser, um irgendwelche 
Seiteneffekte deiner Programmierung auszuschließen, leg schnell ein 
neues Projekt an, Startpunkt dafür kann gerne ein Beispiel-Projekt von 
Atmel zum Thema Eeprom sein. Dann damit die Funktion des Eeproms 
überprüfen. Dann Vergleich dein Programm <-> Atmel-Beispiel, daraus 
ableiten wo hängt's:)

Gruß Jonas

von H.Joachim S. (crazyhorse)


Lesenswert?

Macht bei mir der Compiler...
Hier ein Auszug aus dem listing, falls dir das was nutzt:

                   .CSEG
                 __EEPROMWRB:
00004e 9be1        SBIS EECR,EEWE
00004f c002        RJMP __EEPROMWRB1
000050 95a8        WDR
000051 cffc        RJMP __EEPROMWRB
                 __EEPROMWRB1:
000052 b79f        IN   R25,SREG
000053 94f8        CLI
000054 bbae        OUT  EEARL,R26
000055 9ae0        SBI  EECR,EERE
000056 b38d        IN   R24,EEDR
000057 17e8        CP   R30,R24
000058 f019        BREQ __EEPROMWRB0
000059 bbed        OUT  EEDR,R30
00005a 9ae2        SBI  EECR,EEMWE
00005b 9ae1        SBI  EECR,EEWE
                 __EEPROMWRB0:
00005c bf9f        OUT  SREG,R25
00005d 9508        RET

von tippex (Gast)


Lesenswert?

Hallo Jonas

Werd ich gleich mal machen - meine Original-SW hat einen RT-Scheduler, 
verwendet ADC usw. mit den entsprechenden WinAVR-Includes. Ich werde 
gleich mal tatsächlch alles rausschmeißen und nur die paar EEPROM-Zeilen 
testen.

Michael

von tippex (Gast)


Lesenswert?

Hallo Joachim

Ich werde gleich mal den Code runterstrippen und dann mal in den 
Assembler schauen - brauche ein paar Minuten.

Michael

von tippex (Gast)


Angehängte Dateien:

Lesenswert?

So, nun ist der gesamte Code auf ein Minimum reduziert. Anbei ein 
Screenshot vom Simulator inkl. Quellcode + Assembler / List-File...

Funktioniert genausowenig wie vorher - lesen geht, schreiben nicht.

von H.Joachim S. (crazyhorse)


Angehängte Dateien:

Lesenswert?

Vielleicht nur ein Simulatorprobblem? Oder geht es "in echt" auch nicht?

Bei mir funktioniert dein Code (Studio V4.19)

von Peter D. (peda)


Lesenswert?

tippex schrieb:
> So, nun ist der gesamte Code auf ein Minimum reduziert.

Schön für Dich.
Es wär aber keine blöde Idee, wenn Du ihn uns auch zeigen würdest (*.c, 
*.h als Anhang).

Hier mal ein einfaches EEPROM Beispiel:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91306


Peter

von tippex (Gast)


Angehängte Dateien:

Lesenswert?

@ Joachim:

Auf der Zielhardware konnte ich es noch nicht ausprobieren - die erste 
SW-Version ging nicht, aber da können auch noch andere Fehler drin 
gewesen sein - war nur ein Schnellschuß.

Wenn ich Dein Simulatorergebnis sehe: Ist eindeutig, bei Dir 
funktioniert es.

Ich habe AVR-Studio 4.14 mit WinAVR-20100110. Könnte es an irgendwelchen 
Simulatoreinstellungen liegen? Welche wären da ggf. relevant?

Ich such mal, ob es bei Atmel zu Studio 4 eine Versionshistory gibt und 
was sich zwischen 4.14 und 4.19 geändert hat.

@ Peter:

Es ist tatsächlich nur genau der C-Code, der weiter oben im Screenshoot 
zu sehen ist, kein h-File. Hier nochmals als ASCII-Datei.

Ich schau mir gleich Dein Beispiel an - aber viel einfacher, als das aus 
dem µC-Handbuch geht es ja fast gar nicht...

von H.Joachim S. (crazyhorse)


Lesenswert?

Was ich ändern musste: EEAR -> EEARL.

von Peter D. (peda)


Lesenswert?

tippex schrieb:
1
EECR =0xFF;

Das ist völlig unsinnig!
Wo hast Du das her?


Peter

von tippex (Gast)


Lesenswert?

@ Peter:

Vielleicht nicht gerade unsinnig, aber auch nicht hilfreich: Geht mit 
genausowenig wie ohne...

@ Joachim:

Ich finde keine Versionshistory, aber ich lade die V19 gerade bei Atmel 
runter - ist immerhin drei Jahre jünger, vielleicht ist es tatsächlich 
ein Simulatorproblem.

von Stefan E. (sternst)


Lesenswert?

Das Schreiben scheitert bei dir am Timing wegen nicht eingeschalteter 
Optimierung.

von Georg G. (df2au)


Lesenswert?

tippex schrieb:
> EECR = (0<<EEPM1) | (0<<EEPM0);  // set programming mode

Was bewirkt diese Zeile? Was passiert, wenn man eine NULL schiebt (mit 
etwas multipliziert oder dividiert)?

> Die C-Code-Zeilen sind genau so, wie sie im µC-Handbuch stehen

Du solltest den Autor züchtigen, 5 Peitschenhiebe.

von tippex (Gast)


Lesenswert?

Hallo Stefan

Kannst Du mir das erklären? Welche O-Stufe sollte ich wählen? Gilt das 
für Simulator und Ziel-HW gleichermaßen?

Ich arbeite üblicherweise mit O0 oder O1 - O1 als optimaler Kompromiß 
zwischen Speicherplatz und Simulatorfähigkeit. Habe mit dem Beispiel 
bislang nur O0 probiert, werde jetzt mal alle Optimierungsstufen 
durchprobieren.

Bevor ich V4.19 installiere...

von tippex (Gast)


Lesenswert?

@ Stefan:

Wie gehabt: o0 + o1 gehen im Simulator nicht. Überraschung: o2, o3 + os 
funktionieren. Alles noch mit V4.14 . Wie sieht es (voraussichtlich) auf 
der Zielhardware aus und was steckt dahinter? Timing, in wiefern?

Alles über o1 hat aber den Nachteil, daß wegen der Optimierung 
C-Sourcecodezeilen im Simulator nicht mehr mit dem ASM- / Listfile 
übereinstimmen, d.h. die C-SW nicht mehr 1:1 zeilenweise simuliert 
werden kann.

@ Joachim:

Welche Optimierungsstufe hast Du mit Deiner V4.19 verwendet?

von Stefan E. (sternst)


Lesenswert?

tippex schrieb:
> Wie sieht es (voraussichtlich) auf
> der Zielhardware aus

Genauso.

tippex schrieb:
> was steckt dahinter? Timing, in wiefern?
1
When EEMPE is set, setting EEPE within four clock cycles will
2
program the EEPROM at the selected address.

tippex schrieb:
> Alles über o1 hat aber den Nachteil, daß wegen der Optimierung
> C-Sourcecodezeilen im Simulator nicht mehr mit dem ASM- / Listfile
> übereinstimmen, d.h. die C-SW nicht mehr 1:1 zeilenweise simuliert
> werden kann.

Warum willst du überhaupt eigene EEPROM-Routinen verwenden?
Benutze doch einfach <avr/eeprom.h>, dann hast du auch kein Problem mit 
der Optimierung.

von Peter D. (peda)


Lesenswert?

tippex schrieb:
> Vielleicht nicht gerade unsinnig

Doch.
Unsinnig ist es, weil der Autor sich überhaupt nichts dabei gedacht hat.
Es setzt reservierte Bits, obwohl das Datenblatt 0 empfiehlt.
Und es enabled den EEPROM-Interrupt ohne einen Handler.
Jede Codezeile muß eine Absicht haben, sonst ist sie unsinnig.


tippex schrieb:
> Ich arbeite üblicherweise mit O0 oder O1

Das erklärt es.
Ohne Optimierung werden alle Operation auf 16Bit aufgebläht und dann 
können die 4 Zyklen nicht mehr eingehalten werden.
Mit -O0 hast Du etwa doppelten Code, doppelten RAM-Verbrauch und 
doppelte Laufzeit.
Ich arbeite ausschließlich mit -Os. Warum Ressourcen absichtlich 
verschwenden.


Peter

von tippex (Gast)


Lesenswert?

Hallo Leute

So, AVR-Studio V4.19 installiert, Toolchain, usw., dreimal kurz vorm 
Nervenzusammenbruch, zwischenzeitliches Microschrott-Trauma - das 
übliche halt. Jetzt läuft alles wieder...

Das mit der Compileroptimierung leuchtet mir jetzt ein - man sieht es, 
wenn man die verschiedenen Listfiles bei unterschiedlichen 
Optimierungsstufen ansieht. Und ab Optimierungsstufe -o2 läuft es jetzt 
- im Simulator.

Danke @ ALL ;-)

Werde das ganze jetzt im Kontext der Gesamt-SW ausprobieren, dann auf 
der Zielhardware - und dann hier nochmals das Ergebnis posten.

Nochmals Danke
Michael

von tippex (Gast)


Lesenswert?

So, jetzt noch schnell das abschließende Update: Funktioniert genau so, 
das Problem waren die Compiler-Optimierungslevel in Bezug auf das 
erforderliche EEPROM-Timing.

Danke für die Hilfe.

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.