Forum: Mikrocontroller und Digitale Elektronik Bootloader mit boot.h


von Tom (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade einen Bootloader auf dem ATMega88 zu implementieren. 
Ich benutze die Version 4.13 + Service Pack des AVR Studios, WINAVR 
sowie ein STK500 und einen JTAGICEmkII.

Nun habe ich folgenden Code der Daten zum Test ins Flash schreiben soll:

1
#include <avr/io.h>
2
#include <avr/boot.h>
3
#include <avr/pgmspace.h>+
4
#include <avr/interrupt.h>
5
6
unsigned char buffer[64];
7
8
int main(void)
9
{
10
unsigned char c, *p;
11
unsigned int i;
12
unsigned long address = 0x1800;
13
14
  DDRB |= (1 << PB2);
15
  PORTB |= (1 << PB2);
16
17
  p = buffer;
18
19
  for(c=0;c<64;c++)
20
    *p++ = c;
21
  cli();
22
  eeprom_busy_wait();
23
24
  boot_page_erase( address );
25
  boot_spm_busy_wait();
26
27
  for( c=0, p=buffer; c<SPM_PAGESIZE; c+=2 )
28
  {
29
    i = (unsigned int)*p++;
30
    i += (unsigned int)(*p++ << 8);
31
    boot_page_fill( address+c, i );
32
  }
33
34
  boot_page_write( address );
35
  boot_spm_busy_wait();
36
37
  for(;;)
38
  {
39
    PORTB &= ~(1 << PB2);
40
  }
41
42
  return(0);
43
}


Nun hängt das Program sich bei "unsigned long address = 0x1800;" auf und 
der Controller kann danach nicht mehr gedebuggt werden. Erst ein High 
Voltage Programming holt den Controller zurück.

Wenn ich es mit dem Simulator kompiliere und aufspiele, funktioniert das 
Programm zwar auch nicht aber wenigstens ist dann der Controller nicht 
hin.

Was ist das Problem? Warum verträgt sich das Programm mit dem Debugger 
nicht?

Gruß

von 1234 (Gast)


Lesenswert?

Das Applikationsprogramm ist von Null weg. Bis wahrscheinlich zu den 
0x1800.
Wenn man in den Bootloader selbst schreiben will, so geschieht nichts 
mehr nebenbei. Ich wuerd mal im Datenblatt das Kapitel Bootloader 
nachlesen.
Der obige Code macht wenig Sinn. Zudem sind interrupts im bootloader 
overkill. Den Debugger im bootloader zu benutzen bedingt einiges an Mut.

von Tom (Gast)


Lesenswert?

Gut, das es zusammen mit dem Debugger nicht so optimal ist habe ich 
jetzt auch festgestellt.

Also Ziel soll ein Softwareupdate über die serielle Schnittstelle sein. 
Je nachdem welche Daten dort ankommen, soll das Anwendungsprogramm 
ausgeführt oder die neue Software aufgespielt werden.

So wie ich das Verstanden hab, können mit Hilfe der Funktionen aus der 
boot.h der Bootloaderbereich bzw. das Flash beschrieben werden.

Nur weiß ich noch nicht so wirklich, wie ich das ganze umsetzen muss, 
bzw. wie ich da jetzt genau vorgehen sollte.

Kann mir da wer helfen?

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.