EEPROM schreiben geht nicht / AVR

Gast #2861426
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.
#2861453
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
#2861461
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
Gast #2861471
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
Gast #2861577
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...
Angehängte Dateien:
Gast #2861642
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.
Gast #2861759
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...
Gast #2861784
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?
#2861801
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.
#2861829
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
Gast #2861981
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

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