Arduino: External Programming Atmega328 Fix for avrdude



The atmega328 is only slightly cheaper than the atmega328P (about $0.30) but this can add up when you’re buying decent sized quantities. If you’re on a budget the atmega328 is probably the best choice. The only difference between the two is that the atmega328P uses less power ( “P” stands for pico power). However, both of the micro controllers have different signatures and you may find that avrdude will not process the atmega328 straight out of the box. Before I begin this file has been brought to you by Andrew Stone.

If you use avrdude directly, you can use the m328p chip option with the -F (force) parameter.  But if you use the Arduino IDE or AVRFuses you’ll need to change the avrdude.conf file. Please add the section included below to your avrdude.conf file, near the ATmega328p section.

NOTE: On Linux, the avrdude.conf file is located BOTH in /etc/avrdude.conf (this one is really used) and in your arduino IDE tree arduino-1.0/hardware/tools/avrdude.conf.  So if you make this change and it doesn’t work, please look around for another file.

#—————————–——————————
# 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;
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;

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”;
;
;

1 thought on “Arduino: External Programming Atmega328 Fix for avrdude”

Leave a Reply