Freier Speicher bei Programmierung mit ISP

Hallo,

wenn ich den Atmega mit einem ISP programmiere spare ich mir ja den Platz für den Bootloader. Nur die IDE zeigt mir natürlich nach dem Linken den gleichen Wert für den maximalen Platz an wie sonst. Ist das irgentwie einstellbar das ich zum korrekten Zeitpunkt gewarnt werde wenn der Speicher alle ist.

Wie läuft das eigentlich ? Ist der Atmega-Code eigentlich vollkommen relocatibel (verschiebbar) so dass er einfach ohne das Compiler und Linker das wissen auf die Adressen des Bootloaders geschrieben werden kann ?

Wenn du den Bootloader eliminieren willst, dann solltest du dir einen eigenen boards.txt Eintrag basteln. Dort die Fuses eintragen Dort die Speichergrenze eintragen. Bootloader (*.hex) Eintrag weg lassen. Upload Methode auf deinen ISP Adapter anpassen.

Dann per ISP Bootloader Brennen. Es werden nur die Fuses gesetzt. Jetzt kannst du den vollen Speicher nutzen.

Ist der Atmega-Code eigentlich vollkommen relocatibel (verschiebbar)

Nein, wenn der Linker damit fertig ist, nicht mehr.

Hmmm,

ich habe mal ohne große Vorbereitungen einen Sketch mit so einem MiniUsbISP geflasht. Das funktionierte über die IDE und der Bootloader war danach weg. Ich konnte ihn mit dem ISP wieder reinflashen.

Ulli

Mannoo....

Die Probleme kommen, wenn dein Code in den Bootloader Bereich kommt. Die Fuses stehen bei deinem Verfahren noch auf Bootloader Betrieb. Nach einem Reset springt es weiterhin in den Bootloaderbereich. Schlimmstenfalls in deinen Code. Mitten rein. Willst du das?

Die guten Fragen: Willst du die Fuses per Hand setzen? Willst du den wahren Speicherbereich angezeigt bekommen und nutzen können?

Mein Tipp: Bau dir einen boards.txt Eintrag. Das tut nicht weh und befreit dich von allen Sorgen.

Ich konnte ihn mit dem ISP wieder reinflashen.

Auch das geht dann weiterhin! Der Weg ist nicht verdorben.

Hallo,

ich muß da auch mal fragen. Wenn ich meinen Mega2560 mittels Atmel Studio und AVRISPmkII Programmer flashe, dann ist der Bootloader weg und alles andere automatisch richtig gesetzt. Weil Atmel Studio weis ja was macht. Oder nicht?

Alles klar, so wird es gemacht !

Wenn ich meinen Mega2560 mittels Atmel Studio und AVRISPmkII Programmer flashe, dann ist der Bootloader weg und alles andere automatisch richtig gesetzt. Weil Atmel Studio weis ja was macht. Oder nicht?

Auch da bleiben die Fuses, ohne weiteren Eingriff, falsch gesetzt. Und die geschilderten Probleme werden eintreten können.

Hallo,

ich habe mir mal die aktuellen Fuses angeschaut mittels Atmel Studio und mkII Programmer und dazu die Seite http://www.engbedded.com/fusecalc/

"Boot size" kann ich nicht ganz abschalten. Geht nur 512, 1024, 2048 und 4096. Oder muß "BOOTRST" abgeschalten werden?

Was ich nicht verstehe, wenn ich keinen Bootloader mehr habe und er nach einem Reset in den nicht vorhandenen Bootloader springt, dann dürfte er doch niemals funktionieren bis ich das korrigiere. Er funktioniert aber bis jetzt und ohne Probleme.

originale Settings vom meinem 1. Arduino Mega2560, daran wird auch nicht rumgefummelt

ISP Clock   125kHz

ATmega2560
CPU     AVR8
Flash size  256kB
EEPROM size 4kB
SRAM size   8kB
VCC range   1,8 - 5,5V

Fuse 
BODLEVEL    2V7
OCDEN       disabled
JTAGEN      disabled
SPIEN       enabled
WDTON       disabled
EESAVE      enabled
BOOTSZ      4096W_1F000
BOOTRST     enabled
CKDIV8      disabled
CKOUT       disabled
SUT_CKSEL   EXTXOSC_8MHZ_XX_16KCK_65MS

Fuse Register
Extended    0xFD
High        0xD0
Low     0xFF

Lock Bits
LB  no lock
BLB0    no lock
BLB1    LPM_SPM_DISABLE

Lockbit Register
Lockbit 0xCF

bei meinem 2. Mega2560 den ich nur noch mit dem mkII flashe sehen die Lockbits anders aus. Warum weis ich nicht, habe daran nie etwas geändert.

Lock Bits
LB  no lock
BLB0    no lock
BLB1    no lock

Lockbit Register
Lockbit 0xFF

Was ich nicht verstehe, wenn ich keinen Bootloader mehr habe und er nach einem Reset in den nicht vorhandenen Bootloader springt, dann dürfte er doch niemals funktionieren bis ich das korrigiere. Er funktioniert aber bis jetzt und ohne Probleme.

Leerer Flash ist mit -1 bzw. 0xFFFF geflutet. Das wird vom Prozessor als NoOperation ausgewertet.

Nach einem Reset werden also erstmal ein paar tausend NOPs ausgeführt, bis der Programm Counter seinen Wraparound zur Adresse Null macht.

Das geht natürlich fürchterlich in die Uhr, wenn an der Stelle statt -1 irgendwelcher User Code liegt.

Oder muß "BOOTRST" abgeschalten werden?

Jawoll! Wobei abschalten eine 1 ist.

Hallo,

okay. BootReset abschalten. Und was ist mit der Speichergröße anpassen wovon Du auch geredet hast? Weist du auch was die Lockbits bedeuten die bei mir unterschiedlich sind?

Ich stehe aber immer noch etwas auf der Leitung. Mit der Arduino IDE kann ich doch keinen Programmcode mit einen ISP Programmer flashen. Ich kann doch höchstens den Bootloader neu schreiben. Dafür ist die boards.txt da. Nur wenn ich den Bootloader mittels neuer boards.txt entferne, kann ich doch nie wieder über USB mit der Arduino IDE wie gewohnt flashen. Ich verstehe also den Aufwand nicht.

Mit der Arduino IDE kann ich doch keinen Programmcode mit einen ISP Programmer flashen.

Schonmal die Funktion "Upload mit Programmer" ( Strg+Shift-U ) gesehen?

Mit der Arduino IDE kann ich doch keinen Programmcode mit einen ISP Programmer flashen.

Doch, das geht sehr wohl!
Unkultiviert über Datei/Upload mit Programmer
Und kultiviert über einen eigenen boards.txt Eintrag

In boards.txt steht, wieviel Speicher für User Programme zur Verfügung stehen
In boards.txt steht, welche Upload Methode genutzt wird
In boards.txt stehen, die Fuses
In boards.txt steht, welcher Bootloader verwendet wird, oder eben keiner
Und noch mehr, Taktfrequenz, usw.
Halt eben vieles von den Dingen, welches der IDE erlaubt, Mit deinem AVR/ARM, (oder was auch immer) umzugehen.

Nur wenn ich den Bootloader mittels neuer boards.txt entferne, kann ich doch nie wieder über USB mit der Arduino IDE wie gewohnt flashen.

Nur das kleine “nie wieder” nicht das ganz große “nie wieder”
Keiner kann dich hindern das originale Board anzuwählen und den original Bootloader (inc.Fuses) aufzuspielen.

Und nein, für die Lockbits müsste ich auch erst das Datenblatt studieren.

Hallo,

okay, den vorderen Programmer Eintrag hab ich noch nie für voll genommen. Jetzt weis ich es.

Entschuldigt die vielen Fragen, aber mit den Fuses bin ich ängstlich, kann man viel falsch machen. :o

Ich schlage mich gerade mit dem Manual rum und vergleiche mit dem Fuse Rechner. Ich müßte die rot markierten Stellen ändern? Wenn ich BOOTRST abschalte. D9 ergibt sich laut Fuse Rechner. Und den verfügbaren Speicher auf volle 256kB erhöhen. Das wars? Und dann steht der Platz wo früher der Bootloader stand für den Programmcode zur Verfügung?

Nur die Lockbits machen mir noch Schwierigkeiten. Außerdem finde ich im AVR Manual keine Unlock Bits. Nur Lock-Bits. Was machen die unlock_bits in der boards.txt? Ich verstehe nur so viel. Der LB-Mode beschreibt wie ich flashen kann und ob ich überhaupt nochmal flashen kann. Und der BLB-Mode beschreibt wer in welchen Speicherbereich wie zugreifen darf. Aber was SPM und was LPM ist ... keine Ahnung.

Testweise habe ich in der boards.txt einen neuen Eintrag gemacht. Habe noch die IDE v1.0.6. Der neue Eintrag kommt jedoch nicht dazu, sondern der ersetzt im Auswahlmenü den originalen. Hab die Zeilen kopiert, geändert und den Namen grün geändert.

mega2560.name=Arduino Mega 2560 or Mega ADK

mega2560.upload.protocol=wiring mega2560.upload.maximum_size=262144 mega2560.upload.speed=115200

mega2560.bootloader.low_fuses=0xFF mega2560.bootloader.high_fuses=0x*D9* mega2560.bootloader.extended_fuses=0xFD mega2560.bootloader.path=stk500v2 mega2560.bootloader.file=stk500boot_v2_mega2560.hex mega2560.bootloader.unlock_bits=0x3F mega2560.bootloader.lock_bits=0x0F

mega2560.build.mcu=atmega2560 mega2560.build.f_cpu=16000000L mega2560.build.core=arduino mega2560.build.variant=mega

mein_mega2560.name=Arduino Mega ohne Bootloader

mein_mega2560.upload.protocol=wiring
mein_mega2560.upload.maximum_size=262144
mein_mega2560.upload.speed=115200
.... und so weiter ....

Eigenen Board Eintrag einlegen heißt auch einen eigenen Bezeichner vergeben. Der Bezeichner dient dazu, die Einträge zuzuordnen. Der Name wird im Menue angezeigt.

Habe noch die IDE v1.0.6.

Bei mir läuft die Version 1.6.3
Die bietet Submenus für die Boardkonfigurierung (die 1.x vielleicht auch schon?)

Und in meinem Standard Sketch Ordner gibts einen hardware Ordner, wo ich eigene Board Definitionen unterbringen kann.

Im Anhang mal solche Einträge für ungewöhnliche ATMega328P Konfigurationen.

arduino_hardware_breadboard.zip (2.92 KB)

Hallo,

Danke soweit. Hab dann nochmal gegoogelt. http://elk.informatik.fh-augsburg.de/da/da-21/Tutorial/sw/Fusebits.html Da wird einem die Lockbits erklärt. Aber was die unlockbits in der boards.txt sein sollen bleibt wohl ein Rätsel? Oder sollen die unlock_bits der LB-Mode sein und die lock_Bits der BLB-Mode? Wobei es aber drei Lockbits Modes gibt. Hmmm.

Ich lass das erstmal sacken und mach damit morgen weiter. Danke nochmal an alle soweit. :)

Edit: hab nochmal auf der Arduino Seite gelesen ... jetzt wird es klar :)

.unlock_bits is the value to write to the ATmega168 lock byte to unlock the bootloader section.

.lock_bits is the value to write to the ATmega168 lock byte to lock the bootloader section (so it doesn't get accidently overwritten when you upload a sketch).

Hallo,

habe soeben die Fuses erfolgreich geändert. :) Der µC funktioniert noch. Hatte nochmal das Datenblatt rangezogen und mir eine Exceltabelle gebaut um selbst nachzurechnen was rauskommt bzw. rauskommen muß als hex Wert. Damit ich genau weis was ich mache. Eigentlich nicht schwer, jedoch wegen der invertierten Logik extrem Nerven aufreibend. Hab das jedoch mit Atmel Studio gemacht statt mit boards.txt. Wieder was gelernt. :) Danke.