-         

Ergebnis 1 bis 10 von 10

Thema: AVR: Datenaustausch Bootloader <=> Programm

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    AVR: Datenaustausch Bootloader <=> Programm

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Zitat Zitat von askazo
    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?
    Wovon die 100000 aber nur eine "Mindestgrenze" sind, meistens halten EEPROMs wesentlich mehr Zyklen aus.

    Grüße
    Thomas

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    wie wäre es dann mit einem größeren Chip mit 1kB++ Eeprom?
    Grüße Furtion

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von askazo
    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.
    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.
    MfG
    Stefan

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •