Forum: Mikrocontroller und Digitale Elektronik Bootloader auf ATmega168 flashen


von Alfred K. (devkid)


Lesenswert?

Hallo,

ich versuche seit gestern einen Bootloader auf einen ATmega168 zu 
bekommen, klappt aber nicht richtig. In den Extended Fuse Bits steht 
BOOTRST auf 0, also programmed.

Jetzt wollte ich versuchshalber nur ein kleines Programm (146 Byte) als 
Bootloader laden, das lediglich eine LED einschaltet. Seltsamerweise 
funktioniert das aber nur, wenn ich das Programm ganz ans Ende des 
Flashs schreibe, nach ISP-Offset 0x1F80 (in Words, also nach 2^16 - 256 
in Bytes). Wenn ich dagegen 512, 1024 oder 2048 Bytes Platz lasse, 
leuchtet die LED nicht. Dabei ist es egal, welche Fuse Bits für 
BOOTSZ1..0 eingestellt sind, es funktioniert nur, wenn das Programm ganz 
am Ende liegt (und dann funktioniert es auch unabhängig von den Fuse 
Bits). Lade ich das Programm ganz an den Anfang des Flashs funktioniert 
es auch.

Jemand eine Idee?

MfG.

von Thomas E. (thomase)


Lesenswert?

Alfred Krohmer schrieb:
> Jemand eine Idee?

Nö.

Deine Angaben sind noch ein bisschen dürftig.
C oder Assembler?
Poste mal deinen Code.

mfg.

von Alfred K. (devkid)


Lesenswert?

In C. Schaltet wie gesagt nur eine LED ein...
1
#include <avr/io.h>
2
3
int main ()
4
{
5
  DDRD = PORTD = (1 << 3);
6
}

von Vlad T. (vlad_tepesch)


Lesenswert?

welcher bootloader?
genaue Fuses-Config?

was passiert nach Abarbeitung der main?

von Alfred K. (devkid)


Lesenswert?

Der Code da aus meinem letzten Post soll testweise der "Bootloader" 
sein. Ich will nicht ein Programm über den Bootloader draufflashen, ich 
will überhaupt erstmal einen Bootloader drauf bekommen. Die Extended 
Fuse Bits sind momentan auf 0b11111000, also auf 2048 Byte Bootloader 
Größe und Bootloader Reset Vector aktiviert und den Code will ich nach 
nach 0x1C00 (in Words) flashen, was nicht funktioniert. Flashe ich ihn 
stattdessen nach 0x1F80, dann funktioniert es, dabei reicht dann aber 
der Platz für einen "richtigen" Bootloader nicht.

von Thomas E. (thomase)


Lesenswert?

Wie flasht du den denn auf die entsprechende Adresse?

Linker Offset?

mfg.

von Alfred K. (devkid)


Lesenswert?

Nein, ich benutze zum Flashen einen mySmartControl Board, das die Daten 
per USART kriegt und per SPI an den AVR weitergibt. Bei meinem Script um 
diesen "Programmer" anzusprechen sage ich ihm dann halt, dass er das 
Offset zu der Adressangabe hinzuaddieren soll. Die Ausgaben dazu stimmen 
eigentlich, es sind bei 146 also 2 Pages:
1
...
2
Writing page to 7168
3
...
4
Writing page to 7232

Wenn der Offset 0 ist, läuft die Ausgabe halt entsprechend mit 0, 64, 
128 usw. an.

Am "Programmer" sollte es aber nicht liegen, alle "normalen Programme" 
überträgt der einwandfrei und auch das Flashen nach 0x1F80 funktioniert 
scheinbar.

von Thomas E. (thomase)


Lesenswert?

Also compilierst du das Programm ganz normal mit AVR-Studio? So wie 
jedes andere auch?

Das bedeutet allerdings, daß die Vektortabelle auf Adresse 0x0000 gelegt 
wird. Nach einem Reset, springt das Programm dann vom Resetvektor auf 
die Initialisierung. Und zwar mit einem absoluten Sprung. Das heisst, 
wenn du deinen Code in einen anderen Speicherbereich verschiebst, zeigt 
der Resetvektor immer noch auf die Adresse, die für den Start auf 0x0000 
gültig ist.

Du must das ganze Programm auf den Anfang des Bootsektors linken. Dann 
werden auch die Adressen für die Vektortabelle richtig erzeugt.

mfg.

von Alfred K. (devkid)


Lesenswert?

Ahhhh, ok, hat geplappt. Benutze den avr-gcc unter Linux, da legt man 
das scheinbar mit -Ttext=addr fest (hab ich grad in einem Makefile 
gesehen). Dankeschön erstmal, jetzt nur noch schauen, ob der richtige 
Bootloader auch läuft, sonst belästige ich den Thread noch mal ;)

von Maddin (Gast)


Lesenswert?

Hey,

das liest sich interessant. Ich nutze auch gerade den Atmega168. In 
Verbindung mit diesem Programmer:

http://www.reichelt.de/Programmer-Entwicklungstools/AT-AVR-ISP/index.html?;ACTION=3;LA=444;GROUP=A38;GROUPID=2969;ARTICLE=45040;START=0;SORT=artnr;OFFSET=16;SID=11TZm53X8AAAIAAA5G1O0a84449dde95f1dba7189557beed97bd0

Ich arbeite mit AVR STudio und dem avr-gcc. Ich suche einen handlichen 
und kleinen Bootloader den ich einmalig mit meinem Programmer in den 
Controller flashen kann. Wenn dann ein Update des Programmes über RS232 
oder USB möglich wäre, hätte ich alles was ich brauche.

Habt Ihr einen Tip für eine passende Quelle?

M.

von Matthias H. (Gast)


Lesenswert?


von ... (Gast)


Lesenswert?


von Maddin (Gast)


Lesenswert?

ja danke...ich werde mich da mal im nächsten Schritt umsehen.

M.

von Alfred K. (devkid)


Lesenswert?

So, funktioniert jetzt alles wunderbar. Danke @Thomas Eckmann und die 
anderen :)

@Maddin: Siehe hier: http://thedenneys.org/pub/robot/avr/ unter AVR Boot 
Loader, zweiter Link in der Aufzählung: 
http://www.atmel.com/dyn/resources/prod_documents/avr109.zip
Hab den da draufgehauen, ist der "Original" Bootloader von Atmel und 
funktioniert durch AVR109 Protokoll wunderbar mit avrdude, auch ziemlich 
schnell (12 KiB in ca. 2 s).

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.