Irgendwie ist das nicht mehr schön. Jede neue Funktionalität, die ich verwenden will bricht mir immer wieder die Knie. Dabei ist das laut Beschreibung garnicht so schwer zu verstehen. Ich verstehe deshalb nicht, warum diese Funktion immer 0xFF ausliest: #define CONFIG_START_FAN 0 #define CONFIG_SIZE_FAN 1 + FAN_PWM_FAN_NUMS * 2 #define CONFIG_READY 0xAA55 void config_setword(uint16_t address, unsigned short value) { eeprom_busy_wait(); eeprom_write_word(&address, value); return; } unsigned short config_getword(uint16_t address) { unsigned short value; eeprom_busy_wait(); value = eeprom_read_word(&address); return(value); } Und nun der Aufruf: char conv_buf[10]; config_setword(CONFIG_START_FAN, CONFIG_READY); uart1_puts("\r\nCFG: "); itoa(config_getword(CONFIG_START_FAN), conv_buf, 16); uart1_puts(conv_buf); uart1_puts("\r\n"); Sollte zumindest in Hex auch die 0xAA55 ausgeben und nicht 0xFFFF. Wo könnte der Fehler liegen? Evtl. an der Adresse? Laut Datenblatt ist der EEPROM-Address-Space von 0 - 4096. Also müsste es doch so gehen.
Ich habe noch ein bisschen recherchiert und ein paar Sachen rausgefunden. Also um auf sas EEPROM zuzugreifen, muss ich das hier verwenden: _attribute_ ((section (".eeprom"))) Allerdings weiß ich nicht wieso und wie ich das nun so verwenden kann, dass ich meine Adressen beliebig schreiben kann. Ich brauche ja nur den Startpointer zum EEPROM. Den Rest will ich dann manuell suchen. Also: uint16_t config_address _attribute_ ((section (".eeprom"))) = 0; Wenn ich jetzt mittels: eeprom_write_word(&config_address, value); meinen Wert einschreibe geht das. Aber wie komme ich an die nächste Adresse? Und vor allem, wie kann ich die Adresse auch an einer Funktion übergeben. Das geht nämlich auch nicht.
> void config_setword(uint16_t address, unsigned short value) > { > eeprom_busy_wait(); > eeprom_write_word(&address, value); > return; > } Warum nimmst du die Adresse von address? Das ist Quatsch. Was du willst, ist eine Konvertierung in einen Zeiger. Das würde dann eher so aussehen: eeprom_write_word((uint16_t*)address, value); Aber warum so umständlich? Mir scheint es einfacher und übersichtlicher, das so zu machen wie in http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM beschrieben.
Genau das war der Fehler. Vielen Dank! Das es so umständlich aussieht liegt daran, dass ich verschiedene Konfigurationen speichern möchte und damit von mehreren Stellen zugreife. Global sollen allerdings die Speicherbereiche verwaltet werden, die sich aus den einzelnen Headerfiles errechnen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.