It took me an embarrassingly long time to get a 328 with a 12MHz crystal working so that it would allow a normal (serial / FTDI) upload from the Arduino IDE.
There are a few older guides around but I didn’t find one that used the newer optiboot bootloader.
If you don’t want to compile the bootloader yourself, you can download the compiled optiboot_at328mega_12.hex file from this link (right-click and and Save (link) as…) just copy it to your optiboot folder before editing your “boards.txt” file as described below.
If you want to compile the hex file yourself here’s how:
Edit the Makefile in your optiboot folder. On my (Windows 7 64bit) machine using Arduino 1.0.5-r2 this folder was C:\Program Files (x86)\Arduino\hardware\arduino\bootloaders\optiboot
Add this section. I put it in after the existing atmega328 sections and before the Sanguino section (note that the -W1, … shouldn’t be on a separate line – it’s a continuation of the LDSECTIONS line, but this blogging software seems to want to wrap it onto a new line):
atmega328_12: TARGET = atmega328
atmega328_12: MCU_TARGET = atmega328p
atmega328_12: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
atmega328_12: AVR_FREQ = 12000000L
atmega328_12: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328_12: $(PROGRAM)_atmega328_12.hex
atmega328_12: $(PROGRAM)_atmega328_12.lst
atmega328_12_isp: atmega328
atmega328_12_isp: TARGET = atmega328
atmega328_12_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_12_isp: HFUSE = DE
# Low power xtal (12MHz) 16KCK/14CK+65ms
atmega328_12_isp: LFUSE = FF
# 2.7V brownout
atmega328_12_isp: EFUSE = 05
atmega328_12_isp: isp
This is just a copy of the atmega328. section with:
- the name changed from atmega328. to atmega328_12.
- the f_cpu parameter changed from 16000000L to 12000000L
- the two (PROGRAM) lines changed so that the .hex and .lst filenames also have the “_12” addition
- the comment about the 16MHz crystal frequency changed to 12MHz
Run a command shell as administrator and navigate to the optiboot folder. Enter the following command to compile the new 12MHz optiboot bootloader:
omake atmega328_12
Now edit your boards.txt file. On my machine this was located at C:\Program Files (x86)\Arduino\hardware\arduino Add this new section at the end – again this is just a copy of the ‘uno’ section with the few obvious edits for frequency and bootloader file.
############################################################## atmega328bb12.name=ATmega328 12MHz crystal atmega328bb12.upload.protocol=arduino atmega328bb12.upload.maximum_size=32256 atmega328bb12.upload.speed=115200 atmega328bb12.bootloader.low_fuses=0xff atmega328bb12.bootloader.high_fuses=0xde atmega328bb12.bootloader.extended_fuses=0x05 atmega328bb12.bootloader.path=optiboot atmega328bb12.bootloader.file=optiboot_atmega328_12.hex atmega328bb12.bootloader.unlock_bits=0x3F atmega328bb12.bootloader.lock_bits=0x0F atmega328bb12.build.mcu=atmega328p atmega328bb12.build.f_cpu=12000000L atmega328bb12.build.core=arduino atmega328bb12.build.variant=standard
Now launch Arduino, select “ATmega328 12MHz crystal” as your board and “Burn Bootloader” from the Tools menu.
That’s it, and you should be up and running with the normal hardware serial port working correctly with the ‘Serial’ commands and serial uploading from the Arduino IDE also working correctly. I’ve seen comments that not all of the timing functions (microsecond delays etc.) work accurately when using a 12MHz crystal and the standard Arduino libraries. I’ve not investigated that yet; and so far I’ve not tried using software serial with a 12MHz crystal – that also may require some tweaking…
Leave a Reply