EEPROM ATmega32

Gast #4236175
Lesenswert?

Guten Tag,

leider habe ich zu meinem Problem keine direkte Lösung gefunden. Daher 
frage ich euch mal.

Seit kurzen arbeite ich mit dem internen EEPROM des ATmega32.
Hierbei habe ich mir dass verhalten mal angesehen,
speichere ich die Ziffer "A",

"eeprom_write_byte((uint8_t*)0,'A');"

wird sie nach alle 255 Bytes wiederholt, aslo 4x. Aus dem grund habe ich 
versucht in einem Speicherbereich über 255 zu schreiben. - Warum? weil 
ich später für ein Projekt den gesammten bereich benötige. -

Leider erfolglos, die Bytes bleiben unverändert. Vielleicht könnt ihr 
mir hier etwas unter die Arme greifen. ^^

PS: Sprache: C auf AVR Studio 4. ich arbeite mit "eeprom.h" definiere 
also          -   selber keine Register.

Liebe grüße
Umbrecht
Gast #4236267
Lesenswert?

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/eeprom.h>

int main(void) {

eeprom_write_byte((uint8_t*)400,'A');

while(1) {

}}

So wie oben beschrieben, aber danke für deine aufmerksamkeit schon mal.

Statt "400" nutzte ich auch schon andere Zahlensysteme ( 0x190 ).
Gast #4236670
Lesenswert?

Also

eeprom_write_byte( (uint8_t * ) 0x0190  ,'A');

Passt schon laut Simulator.  Der 16Bit Wert wird hier ja geCastet.

Umbrecht schrieb:
> Statt "400" nutzte ich auch schon andere Zahlensysteme ( 0x190 ).

Hier liegt der Fehler 0x190 wird interpretiert als 0x1900 und da bist 
beim Zugriff weit über dem EEPROM Bereich.

Ab  0x0400 ist schluss.
Gast #4236940
Lesenswert?

Ärgert sich schrieb:
> Ab  0x0400 ist schluss.

Habe diesen Wert mal eingetragen also 
"eeprom_write_byte((uint8_t*)0x400,'A');"
und den µC gestartet. Anschließend mit "AVR8 Burn-O-MAT V2" den EEPROM 
als RAW format auf meinen PC kopiert.

Beim Durchsuchen des files fiel mir auf, dass das 'A' an erster stelle 
in der datei steht. Liegt es dran, weil mit 1024 der bereich 
überschritten ist?

Daraufhin habe ich "eeprom_write_byte((uint8_t*)0x3FF,'A');" Probiert 
also 1023, hier habe ich wieder dass selbe problem, man findet das 'A' 
nicht, es steht nicht in der Textdatei.


Was aber auch komisch ist, wenn ich die EEPROM datei umschreibe also auf 
meine gewünschten Zeichen, kann ich es erfolgreich hochladen wenn ich 
weniger als 256 Byte bzw. Ziffern verwendet habe. Brauche ich mehr kommt 
immer ein Error, dass beim schreiben etwas schiefgelaufen ist.

Error:  avrdude.exe: verification error, first mismatch at byte 0x0011
        0xff != 0x71
        avrdude.exe: verification error; content mismatch
Gast #4236969
Lesenswert?

Walter T. schrieb:
> Du bist sicher, einen ATmega32 zu haben?

Als ich ihn bei Reichelt + 5 anderen gekauft habe stand "ATmega32" da, 
auf dem Gehäuse des Prozessors steht ATmega32, ich vermute zu 10% dass 
er es sein könnte.

Nein - spaß bei seite, er ist es sicher.


Fuses sind im Anhang, ich habe hier nichts verändert bis auf die Quarz 
einstellungen.
Angehängte Dateien:
#4236986
Lesenswert?

@ Umbrecht (Gast)

>Hierbei habe ich mir dass verhalten mal angesehen,
>speichere ich die Ziffer "A",

>"eeprom_write_byte((uint8_t*)0,'A');"

Was soll das? In C kümmert sich der COMPILER um die Adressen der 
Variablen!

>PS: Sprache: C auf AVR Studio 4. ich arbeite mit "eeprom.h" definiere
>also          -   selber keine Register.

Also mach es so wie der Rest der Welt!

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
#4237029
Lesenswert?

Umbrecht schrieb:
> auf dem Gehäuse des Prozessors steht ATmega32, ich vermute zu 10% dass
> er es sein könnte.

Der Teufel ist ein Eichhörnchen.

Umbrecht schrieb:
> Fuses sind im Anhang

BODEN und EESAVE wären schon einmal ein guter Anfang.

Falk B. schrieb:
> Was soll das? In C kümmert sich der COMPILER um die Adressen der
> Variablen!

Für das Hardkodieren von EEPROM-Adressen kann es auch unter C gute 
Gründe geben. Z.B. um einen EEPROM-Dump aufs Display oder UART zu geben. 
Und ich finde auch nichts, was dagegen spricht, außer den Komfort, den 
die automatische Verwaltung der EEPROM-Adressen bietet.
Gast #4237048
Lesenswert?

Walter T. schrieb:
> BODEN und EESAVE wären schon einmal ein guter Anfang.

Warum EESAVE? Hierdurch werden alle Bytes des EEPROM bei einem neuen 
Programm upload auf 0xFF gesetzt - oder liege ich falsch?

Walter T. schrieb:
> Für das Hardkodieren von EEPROM-Adressen kann es auch unter C gute
> Gründe geben. Z.B. um einen EEPROM-Dump aufs Display oder UART zu geben.

Dass trifft es.. Mein fehler dass ich es nicht erwähnt habe - Sorry
#4237062
Lesenswert?

Umbrecht schrieb:
> Guten Tag,
>
> leider habe ich zu meinem Problem keine direkte Lösung gefunden. Daher
> frage ich euch mal.
>
> Seit kurzen arbeite ich mit dem internen EEPROM des ATmega32.
> Hierbei habe ich mir dass verhalten mal angesehen,
> speichere ich die Ziffer "A",
>
> "eeprom_write_byte((uint8_t*)0,'A');"
>
> wird sie nach alle 255 Bytes wiederholt, aslo 4x.

Wie hast du das festgestellt?
Gast #4237077
Lesenswert?

Karl H. schrieb:
> Wie hast du das festgestellt?

Ich habe den EEPROM mittels AVR Burn-O-Mat ausgelesen (im Programm die 
funktion "Read" beim EEPROM).

In meinem Fall wird dann auf dem Desktop die datei "eeer" angelegt ohne 
endung. Sorry für den Namen aber ich war einfallslos.

Diese öffne ich mit Notepadd++ und man kann alle 1024Byte lesen. 
Gegebenfalls auch ändern und hochladen mit "Write" aber eben nur bis 
Byte 256 danach kommt der Error.
Angehängte Dateien:
#4237098
Lesenswert?

Umbrecht schrieb:

> Gegebenfalls auch ändern und hochladen mit "Write" aber eben nur bis
> Byte 256 danach kommt der Error.

Was schon mal ein Hinweis darauf ist, dass irgendetwas hardwaremässig 
nicht stimmt.
Es gibt keinen Grund, warum du beim Beschreiben des EEPROM einen Fehler 
bekommen solltest. Von daher würde ich schon mal dem, was Burn-O-Mat aus 
dem EEProm ausliest, nicht mehr über den Weg trauen.

Solange dein Brennprogramm weiss, dass es sich um einen Mega32 handelt, 
musst du 1024 Bytes fehlerfrei ins EEPROM schreiben können. Egal welche 
Werte. Solange das nicht der Fall ist, würde ich dem alles nicht über 
den Weg trauen.
Gast #4237110
Lesenswert?

Denkst du dann eher ich sollte einen anderen ATmega32 testen oder ganz 
weg von AVR Burno-O-Mat?

Eine Option die mir gerade einfällt, wenn ich z.b. die Adresse 500 des 
EEPROM beschreibe, anschließend auslese mit eeprom_read_byte und über 
den Uart oder LCD ausgebe. - Werde ich gleich mal ein Programm dafür 
schreiben und testen
#4237119
Lesenswert?

Umbrecht schrieb:
> Eine Option die mir gerade einfällt, wenn ich z.b. die Adresse 500 des
> EEPROM beschreibe, anschließend auslese mit eeprom_read_byte und über
> den Uart oder LCD ausgebe. - Werde ich gleich mal ein Programm dafür
> schreiben und testen

Wahlweise das gesamte (mit Burnomat geschriebene) EEPROM mal auslesen 
und über UART dumpen. Ist ja ein Wenigzeiler.

Umbrecht schrieb:
> Warum EESAVE? Hierdurch werden alle Bytes des EEPROM bei einem neuen
> Programm upload auf 0xFF gesetzt - oder liege ich falsch?

Neee, andersherum: Der EEPROM-Inhalt wird auch über ein Chip Erase 
hinaus aufbewahrt.
Gast #4237126
Lesenswert?

Peter D. schrieb:
> Das betrifft nur Flash und RAM, da diese vom Linker verteilt werden.
> Beim EEPROM nimmt man aber oftmals eine feste Zuweisung, dann kann man
> ihn auch über ISP oder Bootloader vorbelegen bzw. auslesen.

Genau das geht auch bei Verwaltung durch den Compiler komfortabel.

uint16_t EEMEM  beispiel = 42;

im Source.

Compiler vergibt eine Adresse im Eeprom, Makefile erzeugt passend ein 
.eep - HEX-File, avrdude - Aufruf im Makefile kann das eeprom 
automatisch beschreiben.

Klappt auch mit vorbelegten Structs, Arrays usw. im EEMEM.


1
%.eep: %.elf
2
        @echo
3
        @echo $(MSG_EEPROM) $@
4
        -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
5
        --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
Gast #4237130
Lesenswert?

Also, vom ATmega32 funktioniert alles einwandfrei, ich habe ein 'A' in 
die Adresse 0x3FF geschrieben und lese sie aus. Zusätzlich auch noch die 
Adressen 0x3FE, 0x400 um sicher zu gehen. Herauskommt dass 'A' und 2 
Werte mit 255 - was soweit richtig ist.

Was aber nun blöd ist, dass irgendwas mit dem AVR Burn-O-Mat nicht 
stimmt..

Soweit schon mal danke für die Hilfe! ^^
#4237136
Lesenswert?

Planlos schrieb:
> Peter D. schrieb:
>> Das betrifft nur Flash und RAM, da diese vom Linker verteilt werden.
>> Beim EEPROM nimmt man aber oftmals eine feste Zuweisung, dann kann man
>> ihn auch über ISP oder Bootloader vorbelegen bzw. auslesen.
>
> Genau das geht auch bei Verwaltung durch den Compiler komfortabel.
>
> uint16_t EEMEM  beispiel = 42;
>
> im Source.

Das löst das Problem nicht, welches Peter anspricht.

Gerade beim EEPROM will man die Adressen kontrollieren können. Ganz 
speziell will man das zb, wenn sich von einer Linkerversion zur nächsten 
die Adresszuordnung ändert, du aber einen bereits benutzten AVR mit 
intakten Daten im EEPROM auf eine neue Programm Version updaten musst 
und zwar ohne dass es beim Lesen aus dem EEPROM zu Datensalat kommt.

Und ja: das hat es schon gegeben, dass eine neuere GCC Version die 
Adressvergabe anders gelöst hat.

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