Die einfachste Möglichkeit für einen Datenaustausch wäre das EEPROM.
Die Daten sind dann völlig unabhängig vom Flash und bleiben auch nach einem Reset bzw. Power-Down noch erhalten.
Gruß,
askazo
Moin.
Welche (brauchbaren) Möglichkeiten gibt es, um zwischen dem Programm und dem Bootloader eines AVR (ATmega8/16/32 etc.) Daten auszutauschen? Es geht hierbei um einzelne Bytes, keine ganzen Datensätze oder "Strings".
Die derzeitige Lösung ist eine Section im RAM, die beim Start beider einfach nicht mit 0 initialisiert wird; d.h. ein Teil schreibt einen Wert hier rein, der andere Teil liest ihn einfach aus.
Nachteil dieser Section ist, dass die dann in der zu flashenden .hex auftaucht und die üblichen ISP-Programmer natürlich keine Möglichkeit haben, Daten ins RAM zu flashen; d.h. die .hex muss vor dem Flashen erst manuell von dieser Section befreit werden.
Gibts da noch was "eleganteres", ein Byte hier hin und her zu schicken?
Bzw. gibt es eine Möglichkeit, dass in der .hex-Datei auch wirklich nur der Flash-Bereich steht und nichts aus den RAM-Sections?
mfG
#ifndef MfG
#define MfG
Die einfachste Möglichkeit für einen Datenaustausch wäre das EEPROM.
Die Daten sind dann völlig unabhängig vom Flash und bleiben auch nach einem Reset bzw. Power-Down noch erhalten.
Gruß,
askazo
Hm... EEPROM wär zwar ne Möglichkeit.
Kleines Problem: Der EEPROM sollte eigentlich dem Programm voll zur Verfügung stehen.
Grösseres Problem: Die Anzahl der Datenübertragungen ist damit auf die Lebensdauer des EEPROMS begrenzt.
#ifndef MfG
#define MfG
Zum "kleinen" Problem:
Da Du nur einige Bytes brauchst, sollte das eigentlich kein Problem sein. Ich würde eher sagen, das RAM sollte dem Programm voll zur Verfügung stehen.
Zum "großen" Problem:
Das EEPROM macht 100.000 Schreibzyklen mit. Selbst, wenn Du pro Tag 10 mal den Bootloader aufrufst, würde das EEPROM fast 28 Jahre leben, bevor Du den Controller austauschen müsstest.... reicht das nicht?
Gruß,
askazo
Wovon die 100000 aber nur eine "Mindestgrenze" sind, meistens halten EEPROMs wesentlich mehr Zyklen aus.Zitat von askazo
Grüße
Thomas
So... gerade nochmal nachgefragt: Die Verwendung des EEPROM scheidet aus, da alle 512 Bytes (Mega von der Software verwendet werden und von "ausserhalb" nicht verändert werden dürfen.
Also bleibt wohl nur die nicht-initialisierende RAM-Section.
#ifndef MfG
#define MfG
Hi,
wie wäre es dann mit einem größeren Chip mit 1kB++ Eeprom?
Grüße Furtion
Wieviele Bytes müssen denn zwischen Programm und Bootloader ausgetauscht werden? Wenn's nur max. 8 Bytes sind und der Timer1 in der Phase nicht benötigt wird, könntest Du die Timer-Register (TCNT1,OCR1A,OCR1B,ICR1) für den Datenaustausch missbrauchen. Evtl. gehen auch noch andere Register, die vom Programm nicht verwendet werden.
Gruß,
askazo
Kommt ganz darauf an, wie der Wechsel von Application zu Bootloader (und umgekehrt) erfolgt. Normalerweise wird ja mindestens für eines von beiden (in der Regel App->Bootloader) der Watchdog-Reset verwendet, und dann ist's Essig mit deinem Vorschlag.Zitat von askazo
MfG
Stefan
Hei, die Idee ist schon mal nicht schlecht.
Also der Wechsel vom Bootloader in die App. läuft über nen Jump nach 0x0000. Das müsste das Timer-Register ja überleben.
Der Timer wird zwar für das Timeout-Handling gebraucht, aber vor dem Jump deaktiviert, da die App. einen deaktivierten Timer erwartet.
#ifndef MfG
#define MfG
Lesezeichen