Vor ein paar Tagen habe ich einen ATmega 328P mit dem Arduino Bootloader und 8 MHz geflasht, wie in diesem Tutorial (Minimal Circuit).

Als ich dann mit der Arduino IDE das Programm auf den Microcontroller uploaden wollte, startete dieser neu, doch es kam die Standard-Fehlermeldung:

avrdude: stk500_getsync(): not in sync: resp=0x00

Laut Tutorial erweiterte ich die boards.txt um folgenden Part:

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

atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)

atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600

atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard

Im Vergleich zur 16 MHz "original"-Version ist der Upload Speed nicht 115200, sondern 57600.

Die Ursache dafür liegt in der Ungenauigkeit des internen Quarzes. Eine geringere Uploadrate führt zu einer geringeren Fehlerrate.

Die Lösung für das o.g. Problem  ist denkbar einfach: Den Upload Speed herabsetzen, beispielsweise auf 9600.
Die folgende Config bietet eine Auswahlmöglichkeit:

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

atmega328bb.name=ATmega328(8 MHz, 9600 upload)
atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=9600
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard

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

atmega328bb2.name=ATmega328(8 MHz, 57600 upload)
atmega328bb2.upload.protocol=stk500
atmega328bb2.upload.maximum_size=30720
atmega328bb2.upload.speed=57600
atmega328bb2.bootloader.low_fuses=0xE2
atmega328bb2.bootloader.high_fuses=0xDA
atmega328bb2.bootloader.extended_fuses=0x05
atmega328bb2.bootloader.path=arduino:atmega
atmega328bb2.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb2.bootloader.unlock_bits=0x3F
atmega328bb2.bootloader.lock_bits=0x0F
atmega328bb2.build.mcu=atmega328p
atmega328bb2.build.f_cpu=8000000L
atmega328bb2.build.core=arduino:arduino
atmega328bb2.build.variant=arduino:standard

Im Arduino (Tools->Board) sieht das dann folgendermaßen aus:


 

Dabei darf man natürlich die Geschwindigkeiten nicht verwechseln: Ein mit 9600er Uploadspeed programmierter ATmega kann natürlich nicht mit 57600 Baud beschrieben werden.

Kommentare  

#1 Mike 2016-10-02 16:56
Und warum setzt du diese Bremse ein?
#2 Marcel I. 2016-10-07 15:59
@Mike: Die "Bremse" bietet zwei Vorteile:
1. Sie benötigt keine zusätzlichen Kondensatoren und kein Quarz.
2. Sie läuft auch mit 3.3V statt 5V. Gerade bei Batteriebetrieb ist das ein Segen.