You are here

Arduino on breadboard (ATMEGA328P 8MHz and 1MHz)

A one stop shop for using the ATMEGA328P standalone at 8MHz or 1MHz clock speed including compiled bootloader.  This is for use primarily on a breadboard, but also also directly on, say, a Uno R3 or Nano.


I was unable to find any complete resources for configuring the AVR ATMEGA328P as an 8MHz Arduino.  Also I could find no resources at all to allow me to use the AVR ATMEGA328P microprocessor at 1MHz.  This frustration is shared by many.  Put the following files in your sketchbook to provide both 8MHz and 1MHz boards in the Arduino IDE which can be used for burning bootloaders or uploading sketches.  My sketchbook directory is /home/ewan/Arduino.  So put the hardware directory at /home/ewan/Arduino/hardware, etc.  Links to download all the required files are below.


The fiddly stuff

I needed to build the 1MHz boot loader. To do this I modified the Makefile in the Arduino hardware bootloader directory /var/local/arduino-1.6.9/hardware/arduino/avr/bootloaders/optiboot:

atmega328_1: TARGET = atmega328
atmega328_1: MCU_TARGET = atmega328p
atmega328_1: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=4800'
atmega328_1: AVR_FREQ = 1000000L
atmega328_1: LDSECTIONS  = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe
atmega328_1: $(PROGRAM)_atmega328_1MHz_4800.hex
atmega328_1: $(PROGRAM)_atmega328_1MHz_4800.lst

The 8 MHz, 38400 BAUD configuration and steps will be similar. The Arduino AVR binary directory was added to the path, then the bootloader built and copied to the Arduino sketchbook hardware directory.

make atmega328_1
cp -p optiboot_atmega328_1MHz_4800.hex /home/ewan/Arduino/hardware/breadboard/avr/bootloaders/atmega

Note that my environment built a bootloader file that was slightly over 512 bytes in size. Hence I lowered the start address by 512 bytes and adjusted the fuses to allow for a 1kB bootloader.  Note that if you use the fuse calculator then all the bits are reversed (0 and 1)!  Always ensure that the high fuses are set to at least 0x80 to keep the reset pin enabled.

Setting up the atmega328p on the breadboard

The pin mapping is useful. Connect RESET Pin 1 via a 10 kOhm pull-up resistor to 5V. Provide power by connecting 5V to pin 7 and GND to pin 8. If you wish, connect PB5 pin 19 to the anode of a LED, via 150 Ohm resistor to GND. That really is all you need.

Burn bootloader (chip on Uno R3 board)

I used another Arduino Uno R3 prepared with the standard example ArduinoISP sketch loaded. Now, connect the ISP Arduino to the target Arduino (with the new chip) as normal, i.e. (ISP->Target Uno): 13->13, 12->12, 11->11, 10->RESET. Burn the bootloader using Arduino as ISP.

Burn bootloader (chip on breadboard)

Connect as follows (ISP->target chip pin): 13->19 (SCK), 12->18 (MISO), 11->17 (MOSI), 10->1 (RESET). Burn the bootloader using Arduino as ISP.

Upload sketch (chip on Uno R3 board)

Upload the sketch using the usual process in the IDE. This can take a considerable amount of time at 4800 baud when running at 1MHz.

Upload sketch (chip on breadboard)

If you need to visualise the serial activity then, for both pins 2 and 3 of the processor, wire to a LED cathode, via a current limiting resistor (say, 1k), to +5V. This way the LEDs will illuminate when Tx/Rx pins are grounded.

I use a CH340 USB to serial converter which does not have the ability to reset the micro processor. Connect CH340 5V to pin 7 (5V), GND to pin 8 (GND), Tx to pin 2 (Rx) and finally Rx to pin 3 (Tx). Now, short pin 1 (RESET) to GND. Click Upload in the Arduino IDE. When the progress bar fills all the way to the right, release the RESET from GND. That should synchronise the sketch upload with the reset of the boot loader.

Upload sketch using Arduino-Makefile (chip on breadboard)

To use Arduino-Makefile instead of the IDE, wire the serial port as above. For the correct timing, release RESET when you see the output show make reset. You will also need to change a couple of lines in the Makefile as appropriate, for example:


Setting AVRDUDE_OPTS to blank reinstates the progress bar and the verification of the flash programming operation. These are useful options because the upload is slow and can be unreliable.



Great, hopefully blinking at the correct rate as well? I think your internal oscillator cannot support the upload speed. Let me look into what's needed to lower that speed.

Right, I'll need to build a bootloader for 38400 BAUD and 8 MHz. I'll also re-introduce the 3 flashes since this may also be causing you issues because it reduces the upload window size.

Ok sounds good! For my understanding, what a lower baudrate, is the 57600 not the correct rate for 8MHz?
And when do you expect to have a new build, not to pressure you at all but so I can adjust to that myself.

I have prepared a replacement boards.txt file and bootloader hex file. Please let me have your email address so I can send them over (reply to this message an include your details). Put the files in the same locations as per the main article, re-burn the bootloader and re-upload the blink sketch at 8 MHz.

Following positive feedback from Sebex I have updated this guide with a custom bootloader for 8 MHz with a lower 38400 BAUD upload speed. The boards.txt was also updated to reflect this. I hope others find it useful.