Go Down

Topic: Arduino Bootloader anpassen? (Read 847 times) previous topic - next topic

Addi

Hallo,
ich habe mir hier(https://github.com/arduino/Arduino/blob/master/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c)
den Bootloader geholt, und wollte wissen, wie ich den Code ändern muss, damit der Bootloader z.B. immer Pin 13
anschaltet. Ich möchte dafür sorgen, dass ein Teil eines Sketches immer ausgeführt wird, egal ob
nun einer neuer Sketch draufgeladen wurde oder nicht.

Addi
/ \    _|  _| o
 /--\ (_| (_| |

michael_x

Schau mal in Zeile 425 oder am Ende in flash_led().

Statt digitalWrite(PIN, HIGH); wird hier mit Ports und Bitmasken gearbeitet,
aber dein Beispiel Pin13 ist schon drin ( du musst nur an/aus umdrehen, dann bleibt's am Ende an )

Addi

#2
Nov 26, 2012, 06:18 pm Last Edit: Nov 26, 2012, 06:22 pm by Addi Reason: 1
Kann man auch die "einfachen" Befehle nutzen, wenn man alle Liberies einfügt?
Wo müsste man dann die Befehle im Quellcode setzen?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

michael_x

Quote
wenn man alle Liberies einfügt
... wird der Bootloader ziemlich groß, aber wenn es dir darauf nicht ankommt ...
Kannst ja auch mal in core den Code von digitalWrite ansehen, der meiste Aufwand ist die Fall-Unterscheidung zwischen verschiedenen Boards.

Wenn der pin eine Compilezeit-Konstante ist, wird alles einfacher, da bietet digitalWrite (unnötigen ?) Schnickschnack.

Mit Ports und |= und &=~ zu arbeiten, ist Gewöhnungssache.
Ist halt nicht mehr Arduino IDE Level , am Bootloader rumzufummeln  ;)

Addi

#4
Nov 26, 2012, 06:36 pm Last Edit: Nov 26, 2012, 08:57 pm by Addi Reason: 1
Kann ich dann die Befehle irgendwo in der main() schreiben, oder
muss ich das an einer Bestimmten Stelle einfügen?

Edit: Hab ertmal versucht den Quellcode zu compillieren, erhalte aber diese Fehlermeldung:
booting_168.cpp: In function 'int main()':
booting_168:424: error: 'NUM_LED_FLASHES' was not declared in this scope
booting_168.cpp: In function 'char getch()':
booting_168:974: error: 'MAX_TIME_COUNT' was not declared in this scope

Verwende den Quellcode der DAtei die ich oben verlinkt habe. Als Board habe ich den UNO,Fio,Nano und Lilypad verwendet.
Addi
/ \    _|  _| o
 /--\ (_| (_| |

pylon

In Deiner IDE findest Du die Datei auch: arduino-1.0.2/hardware/arduino/bootloaders/atmega/. Dort findest Du auch ein zugehöriges Makefile, das die notwendigen Definitionen vornimmt.

Mit der IDE kriegst Du einen Bootloader nicht kompiliert. Die IDE ist als Convenience-Tool für Anfänger und mit der Materie nicht sehr vertraute Personen gedacht. Jemand, der am Bootloader rumfummelt, sollte hingegen wissen, was er macht und entsprechend mit Makefiles und Kommandozeilen-Werkzeugen umgehen können (damit ich das "Warum" auch gleich erklärt habe). Der Bootloader für den UNO heisst im Übrigen optiboot, derjenige, den Du zu kompilieren versuchst, ist für die älteren Arduinos.

Addi

Nur wo muss ich jetzt den zusätzlichen Code einfügen?
Und kann man optiboot auch für den Atmega2560 einsetzen?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

pylon

Quote
Und kann man optiboot auch für den Atmega2560 einsetzen?


Nein, der wird nicht unterstützt, für dem 2560 musst Du den stk500v2 nehmen.

Quote
Nur wo muss ich jetzt den zusätzlichen Code einfügen?


Ich bin ganz ehrlich: Wenn Du das fragen musst, solltest Du die Finger davon lassen. Je nach der Funktion, die Du ausführen möchtest, meistens irgendwo gegen Ende der main()-Funktion. Und ich sag's nochmals deutlich: Wenn Du den Code dort nicht verstehst, solltest Du keine Änderungen vornehmen, die Wahrscheinlichkeit, dass es nicht so funktioniert, wie Du Dir das vorstellst, ist relativ hoch.

Go Up