Step 1: The Beginning
Last week I decided to make a classic Arduino clone with an ATMEGA328P-PU. I seemed to be so easy and quick but a very bad surprise for me: I odered the cheaper ATMEGA328-PU (non P!!) that is to say: non pico power.
The difference: this IC needs a bit more energy and IS NOT COMPATIBLE with the Arduino ISP bootloader (see the wrong signature). So I was a bit disappointed.
I looked on the net for a method to boot load this kind of circuit: a lot of methods found but none of them would run with Arduino 1.0.6. So I tested one of mine: a sort of mix between all this tricks. I will give it to you nowโฆ
Step 2: The Schematic and the Bootloader to Use:

You can find it easily on:
https://www.arduino.cc/en/Tutorial/ArduinoISP
I use a prototype board to connect all the cables on the photo (components on the top of the board are decorative).
Then you have to follow these steps:
1-download in your arduino the famous example โarduinoISPโ, then close Arduino 1.0.6
2-backup the arduino/hardware/tools/etc/avrdude.conf and do the following change (at line 8080 for me in notepad++):
#โโโโโโโโโโโโโโโโโโโโ
# 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; # do not change it
pagel = 0xd7;
bs2 = 0xc2;
chip_erase_delay = 9000;
pgm_enable = โ1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1โ,
โx x x x x x x x x x x x x x x xโ;
chip_erase = โ1 0 1 0 1 1 0 0 1 0 0 x x x x xโ,
โx x x x x x x x x x x x x x x xโ;
timeout = 200;
stabdelay = 100;
cmdexedelay = 25;
synchloops = 32;
bytedelay = 0;
pollindex = 3;
pollvalue = 0x53;
predelay = 1;
postdelay = 1;
pollmethod = 1;
pp_controlstack =
0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
hventerstabdelay = 100;
progmodedelay = 0;
latchcycles = 5;
togglevtg = 1;
poweroffdelay = 15;
resetdelayms = 1;
resetdelayus = 0;
hvleavestabdelay = 15;
resetdelay = 15;
chiperasepulsewidth = 0;
chiperasepolltimeout = 10;
programfusepulsewidth = 0;
programfusepolltimeout = 5;
programlockpulsewidth = 0;
programlockpolltimeout = 5;
ocdrev = 1;
memory โeepromโ
paged = no;
page_size = 4;
size = 1024;
min_write_delay = 3600;
max_write_delay = 3600;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = โ 1 0 1 0 0 0 0 0โณ,
โ 0 0 0 x x x a9 a8โณ,
โ a7 a6 a5 a4 a3 a2 a1 a0โณ,
โ o o o o o o o oโ;
write = โ 1 1 0 0 0 0 0 0โณ,
โ 0 0 0 x x x a9 a8โณ,
โ a7 a6 a5 a4 a3 a2 a1 a0โณ,
โ i i i i i i i iโ;
loadpage_lo = โ 1 1 0 0 0 0 0 1โณ,
โ 0 0 0 0 0 0 0 0โณ,
โ 0 0 0 0 0 0 a1 a0โณ,
โ i i i i i i i iโ;
writepage = โ 1 1 0 0 0 0 1 0โณ,
โ 0 0 x x x x a9 a8โณ,
โ a7 a6 a5 a4 a3 a2 0 0โณ,
โ x x x x x x x xโ;
mode = 0x41;
delay = 20;
blocksize = 4;
readsize = 256;
;
memory โflashโ
paged = yes;
size = 32768;
page_size = 128;
num_pages = 256;
min_write_delay = 4500;
max_write_delay = 4500;
readback_p1 = 0xff;
readback_p2 = 0xff;
read_lo = โ 0 0 1 0 0 0 0 0โณ,
โ 0 0 a13 a12 a11 a10 a9 a8โณ,
โ a7 a6 a5 a4 a3 a2 a1 a0โณ,
โ o o o o o o o oโ;
read_hi = โ 0 0 1 0 1 0 0 0โณ,
โ 0 0 a13 a12 a11 a10 a9 a8โณ,
โ a7 a6 a5 a4 a3 a2 a1 a0โณ,
โ o o o o o o o oโ;
loadpage_lo = โ 0 1 0 0 0 0 0 0โณ,
โ 0 0 0 x x x x xโ,
โ x x a5 a4 a3 a2 a1 a0โณ,
โ i i i i i i i iโ;
loadpage_hi = โ 0 1 0 0 1 0 0 0โณ,
โ 0 0 0 x x x x xโ,
โ x x a5 a4 a3 a2 a1 a0โณ,
โ i i i i i i i iโ;
writepage = โ 0 1 0 0 1 1 0 0โณ,
โ 0 0 a13 a12 a11 a10 a9 a8โณ,
โ a7 a6 x x x x x xโ,
โ x x x x x x x xโ;
mode = 0x41;
delay = 6;
blocksize = 128;
readsize = 256;
;
memory โlfuseโ
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = โ0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0โ,
โx x x x x x x x o o o o o o o oโ;
write = โ1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0โ,
โx x x x x x x x i i i i i i i iโ;
;
memory โhfuseโ
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = โ0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0โ,
โx x x x x x x x o o o o o o o oโ;
write = โ1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0โ,
โx x x x x x x x i i i i i i i iโ;
;
memory โefuseโ
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = โ0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0โ,
โx x x x x x x x x x x x x o o oโ;
write = โ1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0โ,
โx x x x x x x x x x x x x i i iโ;
;
memory โlockโ
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = โ0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0โ,
โx x x x x x x x x x o o o o o oโ;
write = โ1 0 1 0 1 1 0 0 1 1 1 x x x x xโ,
โx x x x x x x x 1 1 i i i i i iโ;
;
memory โcalibrationโ
size = 1;
read = โ0 0 1 1 1 0 0 0 0 0 0 x x x x xโ,
โ0 0 0 0 0 0 0 0 o o o o o o o oโ;
;
memory โsignatureโ
size = 3;
read = โ0 0 1 1 0 0 0 0 0 0 0 x x x x xโ,
โx x x x x x a1 a0 o o o o o o o oโ;
;
;
part parent โm328โ
id = โm328pโ;
desc = โATmega328Pโ;
#signature = 0x1e 0x95 0x0F; # change this to:
signature = 0x1e 0x95 0x14;
ocdrev = 1;
;
#โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ-
#โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ-
I give you the initialย avrdude.confย and the modified file in 2 archives.
3-run ARDUINO 1.0.6
4-select the board Arduino Duemilanove or Diecemilia
5-select the good pprocessor: Atmega328
6-select Arduino s ISP
7-burn the bootload
8-shut off ARDUINO 1.0.6, replace avrdude modified by the original file you back up.
9-now you have to change the file arduino/hardware/arduino/avr/boards.txt to make appear the new board name with this kind of circuit. I called it:ย Arduino Uno w/ ATmega328 (non-P)
The text you have to insert in it:
##############################################################
uno328.name=Arduino Uno w/ ATmega328 (non-P)
Source: ARDUINO CLONE With ATMEGA328-PU Non P