Arduino IDE für eigene Boards

Hi,
brauch mal wieder eure Hilfe:
Ich hab noch ein Board mit einem ATMega8 rumliegen. Für eine kleine Anwendung würde mir der reichen.
Da ich mich mit der Arduino IDE sehr gut angefreundet habe, möchte ich diese gerne dazu benutzen um das Programm damit zu entwickeln, und den Chip über ISP zu programmieren.
Hab auch gesehen, daß man in der IDE ein Board namens "Arduino NG/ATmega8" auswählen kann.

Wenn ich das nehme, meinen Code schreibe und dann mit ISP auf den Chip brenne... passt das dann?
Ich meine wegen der Fuses und so.
Ich hab auch mal in der "boards.txt" nachgeschaut. Da stehen zwar Fuses drin, aber die sind doch nur wegen dem Bootloader oder?
In der Datei könnte man doch ein Board kopieren, und dann in der Kopie Parameter wie Taktfrequenz ändern, wenn ich jetzt nur einen 8MHz Quarz hätte. Geht das?
Und welche Fuses nimmt die IDE eigentlich her, wenn ich mein Programm ohne Bootloader auf die CPU brennen will? Den brauch ich ja nicht, wenn ich über ISP flashe.

Doch, die Fuses brauchst du in jedem Fall. Hier wird festgelegt was die Taktquelle ist, BOD-Level, Watchdog etc.. Selbst den reset-Pin kannst du ausschalten, was das Programmieren allerding stark verkomplziert... :wink:
Hier mal ein Link zum Fuse Calculator: AVR® Fuse Calculator – The Engbedded Blog

Ja, aber die Fuses die in der boards.txt stehen sind so berechnet, daß sie mit bootloader laufen.
Wenn ich jetzt bei meinem Mega keinen Bootloader will, dann muss ich doch die Fuses ändern.

Hmm.... generell stellt sich mir jetzt die Frage, wann Arduino die Fuses eigentlich schreibt. Nur beim Bootloader flashen? Oder auch jedesmal beim flashen des Anwenderprogrammes.

Die Fuses werden nur beim Flashen des Bootloaders geflashed.
Die Fuses musst du insbesonders dann umstellen, wenn der Takt oder die Taktquelle geändert wird. Der Atmega8 steht bei Auslieferung auf internem Takt mit 1MHz.
Für den ArduinoNG Atmega8 musst du die Fuses umflashen. Wenn du dir den Quarz sparen willst, kannst du auch auf 8MHz intern flashen.

Wenn du einen externen Quarz mit 8 ... 20 MHz für dein Projekt verwendest passt du die Frequenz und deinen ISP in der boards.txt an und lädst einmal den Bootloader hoch. Danach lädst du dein Programm über "Upload mit ISP" hoch, der Bootloader ist weg und die Fuses bleiben.

circuit99:
Wenn du einen externen Quarz mit 8 ... 20 MHz für dein Projekt verwendest passt du die Frequenz und deinen ISP in der boards.txt an und lädst einmal den Bootloader hoch.

Wieso den ISP??
Wird das nicht vom Menüpunkt "Programmer" übersteuert?

Danach lädst du dein Programm über "Upload mit ISP" hoch, der Bootloader ist weg und die Fuses bleiben.

Hmmm.... OK, der Bootloader ist weg, aber die Fuses haben doch noch immer die Einstiegsadresse vom Bootloader. Und die liegt doch im oberen Speicherbereich.
Wie startet dann der AVR nach einem Reset wieder mit dem Anwenderprogramm??
Ob Bootloader oder Start von 0x0000h wird doch durch das BOOTRST Fusebit gesteuert. Und wenn das nicht geändert wird, dann will doch der AVR wieder an der Startadrese des Bootloaders starten und da ist dann keiner mehr.

Erste Frage: wie stehen die Fuses jetzt? Wenn du unter Linux arbeitest kannst du die Fuses mit avrdude abfragen

avrdude -p atmega8 -P /dev/ttyUSB0 -c stk500v2 -v

Schnittstelle und Programmer musst du natürlich anpassen. Unter Windows müsste das auch gehen, da musst du nur den Pfad herausfinden.
Wenn der Chip einen Bootsektor definiert hat, wird bei einem Programm-Upload das Programm immer hinter das Bootloader-Segment geschrieben.

erni-berni:
Wenn der Chip einen Bootsektor definiert hat, wird bei einem Programm-Upload das Programm immer hinter das Bootloader-Segment geschrieben.

Bist du dir da sicher??? Ich bin der Meinung, das Programm beginnt bei 0x000h. Und ein Bootloader z.B. bei 0xE000h. Also im hinteren Bereich des Flash.
Wobei "Vorne" ist bei mir 0x0000h

Edit:
Hab dazu was gefunden:

Der Bootloader ist immer hinten und nie vorne. Wer es genauer wissen will schaut ins Datenblatt. Dort steht das genau drin.

hk007:
Hmmm.... OK, der Bootloader ist weg, aber die Fuses haben doch noch immer die Einstiegsadresse vom Bootloader. Und die liegt doch im oberen Speicherbereich.
Wie startet dann der AVR nach einem Reset wieder mit dem Anwenderprogramm??
Ob Bootloader oder Start von 0x0000h wird doch durch das BOOTRST Fusebit gesteuert. Und wenn das nicht geändert wird, dann will doch der AVR wieder an der Startadrese des Bootloaders starten und da ist dann keiner mehr.

In der Praxis dürfte es aber trotz eigentlich falsch gesetzten BOOTRST Fuse oft funktionieren:

Wenn die BOOTRST Fuse programmiert ist, springt der Controller bei einem Reset an den Anfang des Bootloader-Bereichs (statt auf die Adresse 0). Dort enthalten bei einem fehlendem Bootloader bis zum Ende des Flashs alle Speicherzellen üblicherweise den Wert FF (hex) / 11111111 (bin). Immer vorausgesetzt, dass das eigentliche Programm nicht so groß ist, dass es schon in den Bootloader-Bereich hineinreicht.
Im gelöschten/noch nicht programmierten Flash-Speicher sind alle Bits auf 1 gesetzt!
FF FF ist für den Controller ein ungültiger Befehlscode, der nichts tut, aber auch nicht zur Exception oder zu ähnlichem führt. Nach dem "Nichtstun" wird der Program Counter erhöht und das nächste FF FF tut ebenfalls wieder nichts. Und irgendwann kommen wir am Ende des Adressbereichs an.

Und jetzt wird wieder alles gut! Der Program Counter wird beim Überlauf als nächstes auf Adresse 0 gesetzt und dort sollte in der Interrupt-Vektor-Tabelle hoffentlich der Sprungbefehl zum eigentlichen Beginn des Programms stehen, der sonst bei einem Reset direkt ausgeführt würde.

Aber die feine Art ist das auf keinen Fall!

Gruß
Wolfgang