Forum: Mikrocontroller und Digitale Elektronik Daten in den Programspeicher zur laufzeit.


von Programspeicher (Gast)


Lesenswert?

Hallo,

ich will gerne meine Konfigurationen in die hinteren 64kbyte meines 
atmega128 speichern, da der EEPROM etwas zu klein ist.

Wie ist das möglich, gibt es so eine Funktion wie write_byte_progmem()?

vielleicht hat jemand ja ein Beispiel für mich.

von Peter II (Gast)


Lesenswert?

Programspeicher schrieb:
> Wie ist das möglich, gibt es so eine Funktion wie write_byte_progmem()?
> vielleicht hat jemand ja ein Beispiel für mich.

steht alles im Abschnitt "Self-Programming the Flash" vom Datenblatt.

von Stefan E. (sternst)


Lesenswert?


von Oliver (Gast)


Lesenswert?

Datenblatt, unter "Self-Programming the Flash". Steht alles da drin. Mit 
Beispielcode.

Ansonsten google mit dem Stichwort bootloader befragen.

Oliver

von Programspeicher (Gast)


Lesenswert?

Im Datenblatt steht nur ASM code, würde es gerne in C machen.

von Karl H. (kbuchegg)


Lesenswert?

Programspeicher schrieb:
> Im Datenblatt steht nur ASM code, würde es gerne in C machen.

Da wirst du aber Probleme kriegen.
Die Spezial-Register zu beschreiben ist noch nicht das große Problem. 
Aber den Compiler dazu zu zwingen, den Z-Pointer bzw. eine SPM 
Instruktion einzusetzen, das wird schon schwieriger.

-> Solche Dinge kann man nur in Assembler vernünftig machen. Klar kann 
man sich dann um die Assembler-Abschnitte C-Funktionen bauen. Aber im 
Kern kriegst du das nur in Assembler hin.

von Falk B. (falk)


Lesenswert?

Ich würde lieber einen kleinen, externen EEPROM nehmen, ehe ich den 
Krampf mit dem Flashschreibzugriff in C mache.

von Cyblord -. (cyblord)


Lesenswert?

Oder einen I2C/SPI Flash Baustein wie z.B. AT45DB...

von Georg G. (df2au)


Lesenswert?

Sollte es nicht mit den Routinen funktionieren, die in boot.h definiert 
sind (boot_page_write() als Beispiel)? Dann hat der TO sein C Interface 
und "unten" ist alles (erprobter) Assembler.

von Karl H. (kbuchegg)


Lesenswert?

Georg G. schrieb:
> Sollte es nicht mit den Routinen funktionieren, die in boot.h definiert
> sind (boot_page_write() als Beispiel)?

Keine so schlechte Idee.
Im Prinzip müsste das gehen.

Bleibt aber immer noch das Problem, dass diese Flash-Zugriffe aus dem 
Bootloader-Bereich des Mega heraus erfolgen müssen. D.h. man muss den 
Linker dazu überreden, die Funktionen da rauf zu verschieben. Allerdings 
kenne ich mich da nicht besonders aus.

Ich würde auch ein extenes EEPROM nehmen, wenn der Platz nicht reicht.
4KB EEprom sind schon eine Menge Holz. Was ist da alles an 
Konfigurationsdaten drinn enthalten? Kann man da etwas abspecken?

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Karl Heinz Buchegger schrieb:
> man muss den
> Linker dazu überreden, die Funktionen da rauf zu verschieben.

Bei AVR-Studio in den Configuration Options unter Memory eine neue 
section an passender Stelle definieren und den Code per attribute dort 
ablegen lassen.

(Ein serielles EEPROM mit etwas Heißkleber kopfüber auf der Platine geht 
vermutlich einfacher, aber das will der TO ja nicht.)

von Stephan B. (matrixstorm)


Lesenswert?

Hi.

Die SPM-Instruktion kann nicht von jeder Stelle im Flash erfolgreich 
ausgefuehrt werden. Also einfach den hinteren Speicher beschreiben wird 
fehlschlagen. (Bzw. einfach nicht durchgefuehrt.)

Um eine Updatefunktion fuer das tinyUSBboard zu realisieren ( 
http://matrixstorm.com/avr/tinyusbboard/ ) habe ich vor einiger Zeit 
eine API implementiert mit der man beliebig Flash schreiben kann.

Im Beitrag Beitrag "Re: [ATMega] Programm aus externem EEprom laden" habe 
zudem ein Beispiel vorgestellt, wie man es benutzt.

Ich hoffe es hilft dir, und wuerde mich um Feedback freuen.

MfG Stephan

Nachtrag: Anfangs falscher Link jetzt korrigiert.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.