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).
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.
Die Funktion schreibt jedoch nichts ins EEPROM.Code:unsigned char matrix[] = "1111111111"; eeprom_write_block(&matrix, (void *) 0x4010, sizeof(matrix));
Kann mir jemand sagen, an was es liegt?
Ich komme einfach nicht weiter.
Danke für eure Hilfe!
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).
Disclaimer: none. Sue me.
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?
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.
Disclaimer: none. Sue me.
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.
Da sollte dann herauskommen: 1,~,1Code: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]);
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
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.
Disclaimer: none. Sue me.
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-
Lesezeichen