mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloaderprobleme ATmega644p


Autor: Florian H. (hucky20)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche gerade einen Bootloader... Aber Es funktioniert nicht! Hab 
alles bis aufs Grundgerüst runtergebrochen! der inhnat des bin.-files, 
das letztendlich geflasht werden soll steht im Array test[] .  Ist der 
Bootloader fertig mit schreiben und startet er immer wieder neu, obwohl 
er ja zum Application-Teil also Adresse 0 springen soll. hat jemand ne 
Ahnung?

Lineroptions :+= -Wl,-section-start=.text=0x7000
Fuses: bootloadersize auf 4096
       bootrst ist auf 0 (häkchen in avrstudion)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/boot.h>


uint8_t test[]={  0x0C,0x94,0x3E,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,
          0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x0C,0x94,0x48,0x00,0x11,0x24,0x1F,0xBE,
          0xCF,0xEF,0xD0,0xE1,0xDE,0xBF,0xCD,0xBF,0x0E,0x94,0x4A,0x00,0x0C,0x94,0x5B,0x00,
          0x0C,0x94,0x00,0x00,0x87,0xB1,0x8C,0x63,0x87,0xB9,0x4C,0xE3,0x29,0xE1,0x30,0xE0,
          0x88,0xB1,0x84,0x27,0x88,0xB9,0x88,0xE8,0x93,0xE1,0xF9,0x01,0x31,0x97,0xF1,0xF7,
          0x01,0x97,0xD9,0xF7,0xF5,0xCF,0xF8,0x94,0xFF,0xCF  };


void app_start(void)
{
  cli(); 
  MCUSR= 0; 
  asm volatile("jmp 0x0000"); 
}


int main()
{
  //LED blinken
  DDRC |= (1<<PC2);   //LED
  for(uint8_t t=0; t<10; t++)
  {
    PORTC ^= (1<<PC2);
    _delay_ms(200);
  }
  uint16_t page;
  for(page=0;page<sizeof(test) ;page+=SPM_PAGESIZE)
  {

    eeprom_busy_wait ();
    boot_page_erase(page);
    boot_spm_busy_wait ();


    for (uint16_t j=0; j<SPM_PAGESIZE; j+=2)
    {

      boot_page_fill(page + j, ((uint16_t)(test[j+1+page*SPM_PAGESIZE]<<8)) + (test[j+page*SPM_PAGESIZE])    );
     
    }

    boot_page_write(page);
    boot_spm_busy_wait();
    boot_rww_enable();
  }
  //LED blinken
  for(uint8_t t=0; t<10; t++)
  {
     PORTC ^= (1<<PC2);
     _delay_ms(500);
  }
  PORTC &= ~(1<<PC2);
  _delay_ms(5000);
  app_start();
  for(;;);
  return 0;
}

Grüße Flo

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn dein HAuptprogramm ISRs enthält würde ich Dir vorshclagen, dass Du 
das IVSEL Bit im MCUCR setzen/löschen (siehe Datenblatt).

Wenn man die Reset-Fuse setzt (start im Bootloader, dann werden auch die 
IRQ VEktoren umgebogen auf den Bootloaderbereich!9 Das muss man dann 
wieder
selber hinbiegen, bevor man die Applikation startet...

Autor: Doktor Gnadenlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal das für den Sprung in die Applikation

void (* start_application) (void); // Definition Variable als 
Funktionszeiger


start_application = 0x0000; // Adresse fuer Einsprung
start_application();     // und aufrufen

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..nur der Vollständigkeit halber: Was ∗genau∗ soll das..

> MCUSR= 0;

erreichen? (JTAG aktivieren? IVSEL auf 0 setzen funktioniert so nicht!)

Normalerweise(tm) lässt man sich für einen sauberen Reset vom Watchdog 
beissen, dabei werden auch die Port-Konfiguartionen/.. auf die 
Standardwerte gesetzt, nicht potentiell auf einen Mischmasch.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch was:

Florian H. schrieb:
> Lineroptions :+= -Wl,-section-start=.text=0x7000
--------------------------------------------^^^^^^

Adressen beim avr-gcc sind *Byte*adressen.  Ich nehme mal an, dass 
deshalb 0xf000 gemeint ist (außer Dein Bootloader belegt mehr als die 
Hälfte des Flash).

Autor: Florian H. (hucky20)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi so hab das mit IVSEL ausprobiert. Laut Datenblatt:
>to change the IVSEL bit:
>a. Write the Interrupt Vector Change Enable (IVCE) bit to one.
>b. Within four cycles, write the desired value to IVSEL while writing a >zero to 
IVCE.

also Funktion zum Jumpen ist nun:
void (* start_application) (void);
void app_start(void)
{
  start_application = 0x0000;
  MCUCR |= (1<<IVCE);
  asm volatile ("nop");
  asm volatile ("nop");
  asm volatile ("nop");
  asm volatile ("nop");
  MCUCR &= ~(1<<IVSEL);
  //asm volatile("jmp 0x0000"); 
  start_application();
}

@ Natthias: hab es mit
asm volatile("jmp 0x0000");
und
start_application();
wie du gemaint hast probiert! keine Änderung

Fazit: Selbes Verhalten wie vorher!



Gruß Flo

Autor: Florian H. (hucky20)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hc Zimmerer:

Die Scheixxe jeeeeehhhhhhhhhhhhhhhhhttttttt!!!


Danke allen!

Autor: Doktor Gnadenlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hc Zimmerer
Das ist mir auch schon aufgefallen. Eigentlich dürfte der Bootloader gar 
nicht starten. Florian H. schreibt aber, dass der Bootloader sehr wohl 
losläuft, er kommt nur nicht in die Application Section.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian H. schrieb:
>>to change the IVSEL bit:
>>a. Write the Interrupt Vector Change Enable (IVCE) bit to one.
>>b. Within four cycles, write the desired value to IVSEL while writing a >zero to
> IVCE.
>
> also Funktion zum Jumpen ist nun:void (* start_application) (void);
> void app_start(void)
> {
>   start_application = 0x0000;
>   MCUCR |= (1<<IVCE);
>   asm volatile ("nop");
>   asm volatile ("nop");
>   asm volatile ("nop");
>   asm volatile ("nop");
>   MCUCR &= ~(1<<IVSEL);

Das ist genau falsch herum verstanden.  Lies Dir b) nochmal durch.  Du 
musst nicht 4 Zyklen warten, sondern innerhalb von 4 Zyklen schreiben.

Übrigens: die Byte-Entsprechung zur Wortadresse 0x7000 ist 0xE000 (um 
meinen Flüchtigkeitsfehler zu korrigieren).

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.