mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloader ATMega16M1 Einsprung/Wechsel


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas O. (kosmos)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte einen Bootloader integrieren damit ich den µC aus dem
bestehendem CAN Bus programmieren kann. Ich habe ein paar Fragen die mir
aus dem Datenblatt nicht ganz klar sind.

1. Einspung in den Bootloader, im Datenblatt steht das man das einfach
per Sprungbefehl an die entsprechende Adresse (0x1FFF) durchführen kann
oder in dem die Boot Reset Fuse programmiert wird, so das es eben im
Bootsector startet.

BOOTRST Reset address
1 Reset Vector = Application reset (address 0x0000)
0 Reset Vector = Boot Loader reset

Wenn man aber einfach dort hin springt wird doch bei der weiteren
Ausführung der Application Resetvector benutzt und nicht der Resetvector
des Bootloaders.

Wie kann man das bewerkstelligen, aus dem laufenden Programm in den
Bootloadermodus mit dessem Resetvector(Interrupttabelle)zu wechseln, den
Application Flash Bereich zu programmieren und danach wieder dorthin
wechseln und die Application Interrupttabelle zu nutzen.

Kann mir jemand den Ablauf erklären, wie ich aus dem laufenden Betrieb 
ein Programm im Bootflash ausführen kann und später das neue Programm im 
Apllication Flashbereich ausführe, da ja die Interruptvectoren irgendwie 
gewechselt werden müssen.

von Draco (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die ISR verbiegen:

//Application:

    unsigned char Temp = GICR;
    GICR = Temp | (1<<IVCE);
    GICR = Temp & ~(1<<IVSEL);


//Boot
    unsigned char nTemp = GICR;
    GICR = nTemp | (1<<IVCE);
    GICR = nTemp | (1<<IVSEL);


Zum Bootloader springen:
//...
 void (*bootloader)( void ) = 0x1FFF;
 // Achtung, ist WORD, am besten in der Hex des BL schauen wo
 // der Einsprungsvector ist!

//...

 bootloader(); 

Zurück zum Hauptprogramm, aus dem Bootloader:

//...
 void (*start)( void ) = 0x0000;
//...

 start(); 

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Es kommt ja drauf an, ob du nach einem Reset den bootloader oder deine 
Applikation starten willst.

Nach deiner Beschreibung willst du den bootloader von der Applikation 
aus aufrufen. Da brauchst du keinen Resetvektor, der auf den bootloader 
zeigt.

Oliver

von Thomas O. (kosmos)


Bewertung
0 lesenswert
nicht lesenswert
@Draco: Danke für den Hinweis mit dem IVCE und IVSEL Bit, jetzt konnte 
ich es auch im Datenblatt nachschlagen.

Mit dem BOOTSZ Fuses kann man es fest einstellen, und im MCU Control 
Register kann man es im Betrieb umschalten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.