PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eeprom_write_block [gelöst]



andio
05.10.2006, 09:18
Hi!

Ich möchte ein 10Byte großes unsigned char Array vom RAM ins EEPROM schreiben, dazu nütze ich die Funktion eeprom_write_block.
Ich verwende einen ATmega162.




unsigned char matrix[] = "1111111111";
eeprom_write_block(&matrix, (void *) 0x4010, sizeof(matrix));


Die Funktion schreibt jedoch nichts ins EEPROM.
Kann mir jemand sagen, an was es liegt?

Ich komme einfach nicht weiter.
Danke für eure Hilfe!

SprinterSB
05.10.2006, 10:17
Ein ATmega162 hat 512 Bytes EEPROM. Du schreibst ab Adresse 0x4010 (16400), also ins Nirgendwo. Gültige EEPROM-Adressen sind von 0-511 (0x0-0x1ff).

andio
05.10.2006, 11:02
Danke SprinterSB für die schnelle Antwort.
Ich habs jetzt mit Adresse 0x01 bzw. mit 0x00 versucht. Funktioniert auch nicht.

Ich hab mir gedacht, dass der EEPROM Adressbereich von 0x4000 bis 0x41FF liegt. So steht es im galep32 der Software für den GALEP-4, mit der ich dann kontrolliere, ob die gewünschten Daten geschrieben worden sind.

Hast du noch ne Idee?

SprinterSB
05.10.2006, 12:27
GALEP???
Wenn du damit ausliest, musst du ab 0x4000 lesen. Das sind wohl virtuelle Adressen, um Flash-Adresse 0 von EEPROM-Adresse 0 von SRAM-Adresse 0 unterscheiden zu können.

Also:
EEPROM (GALEP: 0x4000-0x41ff)
EEPROM (AVR: 0x0-0x1ff)

Hast du alles neu übersetzt? Sicher?
Stimmt der -mmcu Schalter?

BTW: sizeof (matrix) ist 11.

andio
05.10.2006, 13:10
ok, dass mit den Adressen ist mir jetzt klar.

ja, sicher hab ichs neu übersetzt.....
ich hab jetzt mal versucht, ins EEPROM zu schreiben und dann wieder daraus zu lesen.



unsigned char matrix[] = "1111111111";
UART0_transmit (matrix[0]);
eeprom_write_block(&matrix, (void *) 0x010, sizeof(matrix));
matrix[1]='~';
UART0_transmit (matrix[1]);
eeprom_read_block (&matrix, (void *) 0x010, sizeof(matrix));
UART0_transmit(matrix[1]);


Da sollte dann herauskommen: 1,~,1

Es kommt aber: 1,~,0xFF

Es steht auch nichts im EEPROM auf dieser Adresse, wenn ich mit GALEP auslese. Also 0xFF.

Was meinst denn mit dem -mmcu Schalter?

sizeof(matrix) sollte 10 sein? oder? matrix[0] bis matrix[9] sind 10 Zeichen

SprinterSB
05.10.2006, 13:32
Die endende 0 bei Matrix gehört bei sizeof() dazu. Belegt ja auch Speicher.

mmcu ist ein Compilerschalter, mit dem du den Controller angibst. Wenn der nicht richtig steht wird Code für nen anderen µC generiert, der sich flashen lässt aber evtl. nicht funktioniert. Bei dir muss es heissen -mmcu=atmega162

Ansonsten fällt mir auch nix mehr ein.

andio
05.10.2006, 14:13
Servus SprinterSB!

Genau, die 0 am Ende steht ja auch im EEPROM!

Ich hab in der Entwicklungsumgebung schon eingestellt, dass ich nen ATmega162 hab.

Aber ich weiß jetzt, worans gelegen ist.

Der Code funktioniert!
Das Problem ist aber, dass ich den Code mit dem Bootloader "MegaLoad V5.0b1" in den Controller lade, nach dem flashen macht der Controller einen Reset und das Programm wird ausgeführt.
Dies hat bis jetzt auch immer funktioniert, jedoch jetzt mit der eeprom_write Routine ist es notwendig, dass ich nach dem Flashen noch einen weiteren Reset mache(davor muss ich aber MegaLoad schließen, weil sonst wird ja bei einem Reset sofort wieder neu geflasht).

Jetzt funktionierts!
Danke für die Hilfe SprinterSB!

-andio-