Arduino Bootloader auf einem ATMEGA328-PU

Für ein in Kürze hier vorgestelltes Projekt habe ich im Guloshop einige Atmega328-PU geordert, da der Preis von 2 Euro sehr attraktiv ist und man für kleines Geld auch noch passende Quarze, Kondensatoren und andere Kleinteile bekommt. Donnerstag Abend bestellt und Samstag im Briefkasten. Vielen Dank an die Shopbetreiber, das ging wirklich fix.
Da ich in meiner Arduino-Sammlung auch einen Clone von DFRobot habe, der mit einem DIP28 Atmega328P versehen ist und zusätzlich einen tinyUSB Programmer mein Eigen nenne, lag es natürlich nahe, den Atmega zu tauschen und einen der neuen Chips mit dem aktuellen Bootloader zu versehen. Doch so einfach wie gedacht war die Sache dann doch nicht, denn:

avrdude: Device signature = 0x1e9514
avrdude: Expected signature for ATMEGA328P is 1E 95 0F
Double check chip, or use -F to override this check.

Das Tool avrdude weigert sich leider recht hartnäckig, den Chip zu flashen.
Ursache ist, das ich einen Atmega328-PU gekauft habe und nicht einen Atmega328P-PU. Das kleine, zusätzliche “P” hinter der 328 im Namen steht für “Picopower” und besagt, das dieser Atmega quasi das “Stromsparmodell” des Atmega328 ist. Tja, das hat man dann davon, das man 50 Cent pro Chip sparen wollte.
Hilfreich ist zumindest schon mal die Fehlermeldung, die AVRDUDE ausspuckt. Die Signatur meines Chips (0x1E 0x95 0x14) passt nicht zur erwarteten Signatur des original auf dem Board vorhandenen Atmega328P.
Der Hinweis auf die Option “-F”, um das Problem zu umgehen ist nett gemeint, hilft mir aber nicht, da ich keine einfache Möglichkeit habe der Arduino IDE diese zusätzliche Option für das avrdude beizubringen. Außerdem wäre das sicher keine gute Idee, wenn immer alles mit dieser Option geflashed werden würde.
Ich mußte also der IDE einen neuen Typ Board unterjubeln, in dessen Definition ein Atmega328 statt des Atmega328P verwendet wird. Das ist am einfachsten in der Datei “boards.txt”, die man zumindest beim Mac unter “/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt”
Unter Windows 7 ergab ei kurzer Test, das man die Datei unter “arduino-1.0.3\hardware\arduino\boards.txt” findet (der Pfad ist natürlich abhängig von Ablageort der IDE und deren Version).
Der folgende Diff zeigt die Änderungen, die ich gemacht habe:

--- boards.txt.orig 2012-11-05 14:58:50.000000000 +0100
+++ boards.txt 2012-12-29 14:43:47.000000000 +0100
@@ -20,6 +20,27 @@

##############################################################

+atmega328p.name=Arduino Duemilanove w/ ATmega328P
+
+atmega328p.upload.protocol=arduino
+atmega328p.upload.maximum_size=30720
+atmega328p.upload.speed=57600
+
+atmega328p.bootloader.low_fuses=0xFF
+atmega328p.bootloader.high_fuses=0xDA
+atmega328p.bootloader.extended_fuses=0x05
+atmega328p.bootloader.path=atmega
+atmega328p.bootloader.file=ATmegaBOOT_168_atmega328.hex
+atmega328p.bootloader.unlock_bits=0x3F
+atmega328p.bootloader.lock_bits=0x0F
+
+atmega328p.build.mcu=atmega328p
+atmega328p.build.f_cpu=16000000L
+atmega328p.build.core=arduino
+atmega328p.build.variant=standard
+
+##############################################################
+
atmega328.name=Arduino Duemilanove w/ ATmega328

atmega328.upload.protocol=arduino
@@ -34,7 +55,7 @@
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F

-atmega328.build.mcu=atmega328p
+atmega328.build.mcu=atmega328
atmega328.build.f_cpu=16000000L
atmega328.build.core=arduino
atmega328.build.variant=standard

Im Grunde habe ich den originalen Eintrag des Duemilanove kopiert und dessen internen Bezeichner von “atmega328.xxx” zu “atmega328p.xxx” für alle Einträge geändert. Damit gibt es zunächst zwei identische Einträge. Damit man diese auch in der IDE Auswahl unterscheiden kann, habe ich dem atmega328p das “P” auch noch im Parameter “atmega328p.name=Arduino Duemilanove w/ ATmega328P” verpasst.
Im zweiten Eintrag mit nur atmega328.xxx habe ich den MCU Typ von atmega328p auf atmega328 geändert : “atmega328.build.mcu=atmega328″.
Nach einem Neustart der IDE konnte ich nun als Board sowohl “Arduino Duemilanove w/ ATmega328″ als auch “Arduino Duemilanove w/ ATmega328P” wählen.
Aber auch jetzt gab es immer noch Probleme, denn AVRDUDE kennt den Bezeichner “atmega328″ nicht, es gibt nur einen “atmega328p”.
Also gilt es noch eine Datei anzupassen, nämlich die Datei “avrdude.conf. Diese findet man in der IDE unter folgendem Pfad:
“/hardware/tools/avr/etc/avrdude.conf”
Auch hier erzeugen wir wieder einen zusätzlichen Eintrag, indem wir den kompletten Eintrag für den ATmega328P clonen. Nun entsorgen wir beim geclontent Eintrag noch das “P” im Namen und passen die Signatur an:

#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
id = "m328";
desc = "ATMEGA328";
has_debugwire = yes;
flash_instr = 0xB6, 0x01, 0x11;
eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
0x99, 0xF9, 0xBB, 0xAF;
stk500_devcode = 0x86;
# avr910_devcode = 0x;
signature = 0x1e 0x95 0x14;

Angepasst werden “id”, “desc” und “signature”. Alle anderen Werte bleiben gleich, da die Chips sonst identisch sind.

Ein erneuter Test liefert dann auch das gewünschte Ergebnis. Der Bootloader wird übertragen, von AVRDUDE mit einem Erfolg vermeldet und die LED blinkt munter vor sich hin.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>