Forum: Mikrocontroller und Digitale Elektronik ATmega328P Bootloader klappt einfach nicht.


von Ratloser (Gast)


Lesenswert?

Hallo zusammen.
Schon sehr lange versuche ich vergebend einen Bootloader/bzw. Flash zu 
programmieren mittels AVR selbst.
Dazu habe ich einen stark vereinfachten Aufbau gestartet welcher aber 
nicht klappt:
Der zweite Teil ist das originale Nutzungsbeispiel von boot.h
Ich lese den Flash nach dem starten des Programmes aus, er ist nicht 
beschrieben (mit 0x00).
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/boot.h>
4
#define F_CPU 8000000
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
  uint8_t inhalt[SPM_PAGESIZE] = {0x00};
10
  boot_program_page((uint16_t)0x0000, inhalt);
11
  while(1);
12
}
13
14
void boot_program_page (uint32_t page, uint8_t *buf)
15
{
16
  uint16_t i;
17
  uint8_t sreg;
18
19
  /* Disable interrupts.*/
20
  sreg = SREG;
21
  cli();
22
23
  eeprom_busy_wait ();
24
25
  boot_page_erase (page);
26
  boot_spm_busy_wait ();      /* Wait until the memory is erased. */
27
28
  for (i=0; i<SPM_PAGESIZE; i+=2)
29
  {
30
    /* Set up little-endian word. */
31
    uint16_t w = *buf++;
32
    w += (*buf++) << 8;
33
    
34
    boot_page_fill (page + i, w);
35
  }
36
  boot_page_write (page);     /* Store buffer in flash page.    */
37
  boot_spm_busy_wait();       /* Wait until the memory is written.*/
38
39
  /* Reenable RWW-section again. We need this if we want to jump back */
40
  /* to the application after bootloading. */
41
  boot_rww_enable ();
42
43
  /* Re-enable interrupts (if they were ever enabled). */
44
  SREG = sreg;
45
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ohne überhaupt auf dein Programm einzugehen:

Ratloser schrieb:
> Ich lese den Flash nach dem starten des Programmes aus, er ist nicht
> beschrieben (mit 0x00).

 Nein, tust du nicht.
 Ein nicht beschriebenes Flash hat den Inhalt 0xFF.

von Ratloser (Gast)


Lesenswert?

Marc V. schrieb:
> Nein, tust du nicht.
>  Ein nicht beschriebenes Flash hat den Inhalt 0xFF.

Nein, du hast mich falsch verstanden... der ganze Flash ist bis auf den 
Bootloader voll mit 0xFF - es ist aber kein Teil mit 0x00 beschrieben, 
was ja  meine Absicht ist.

Das nicht beschrieben bezog sich auf den Inhalt den ich drauf möchte 
(0x00) um dann auch den Unterschied zwischen erfolgreich und gescheitert 
zu sehen.

von Ratloser Beisteher (Gast)


Lesenswert?

Ratloser schrieb:
> Schon sehr lange versuche ich vergebend einen Bootloader/bzw. Flash zu
> programmieren mittels AVR selbst.

Hast du denn bei Erstellung deines Programms dem Linker gesagt
wohin er das Programm allozieren soll?

von Ratloser (Gast)


Lesenswert?

Ratloser Beisteher schrieb:
> Ratloser schrieb:
>> Schon sehr lange versuche ich vergebend einen Bootloader/bzw. Flash zu
>> programmieren mittels AVR selbst.
>
> Hast du denn bei Erstellung deines Programms dem Linker gesagt
> wohin er das Programm allozieren soll?

Ja, alles getan, .Text befindet sich bei 0x0C00

von Ratloser (Gast)


Lesenswert?

Hat niemand ne Vermutung wo der Fehler liegen könnte? Bin leider immer 
noch nicht weiter gekommen...

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

> Ja, alles getan, .Text befindet sich bei 0x0C00
Das sagt mir leider gar nichts.
Aber Frage: angehängte Tabelle ist bekannt?

von S. Landolt (Gast)


Lesenswert?

PS:

> ... 0x0C00
Das sieht eher nach ATmega8 oder 88 aus.

von gauna (Gast)


Lesenswert?

Ins blaue geraten: Optimierung beim Compiler sind an? Schreibzugriffe 
sind oft zeitkritisch und nur mit aktiviert Optimierung zu schaffen.

von Ratloser (Gast)


Lesenswert?

S. Landolt schrieb:
>> Ja, alles getan, .Text befindet sich bei 0x0C00
> Das sagt mir leider gar nichts.
> Aber Frage: angehängte Tabelle ist bekannt?

Bingo! Vielen herzlichen Dank (ich hoffe du siehst das noch).
Die Tabelle war mir bekannt, habe aber nicht erwartet das es relevant 
ist wo sich der Bootloader befindet (dachte das diese Speicherzuweisung 
mehr zu da ist um den Bereich vor dem überschreiben zu schützen)

Hat nun geklappt, Bootloader lässt sich einwandfrei programmieren.

Natürlich auch allen Anderen die mir helfen wollten ein Dankeschön :D

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.