bootloading the atmega328-pu

So recently i ordered a bunch of atmega chips (atmega328-pu as opposed to the atmega328p pico power series) as i dont need the extra power saving gains so i decided to save myself some money. However I had a heck of a time trying to burn the bootloader on them and it took me several hours to find the info i needed so i thought i would just archive the info for anyone looking for the same. If you have any tips or suggestions please add them as i am still quite new to all of this. The chips loaded in this process seem to work fine ...

Please note this is for the non picopower atmega328-pu chips signature = 0x1e 0x95 0x14 (1E 95 14) vs atmega328p-xx (1E 95 0F)

I tried to load the optiboot and the demillinauve bootloaders via the arduino ide v22 but all i could get was this message - Expected signature for ATMEGA328P is 1E 95 0F Double check chip, or use -F to override this ...

After much searching I found you need to modify the avrdude.conf file ( mac = arduino -show package contents - resources/java/hardware/tools/avr/etc )

Make a backup copy of this file in case something gets messed up.

Open the file with text edit and about 2/3 the way down under atmega 328 find " signature = 0x1e 0x95 0x0F; "

change the 0F to 14 save it and restart the arduino ide, you should now be able to bootload your atmega328-pu chips.

Make sure to change the 14 back to OF and restart when your done loading the bootloaders otherwise it will fail with - Expected signature for ATMEGA328P is 1E 95 14 Double check chip, or use -F to override this ...

Good luck :slight_smile:

1 Like

Thanks for the elaborate explanation. This was very helpful.

Hopefully the next release of Arduino should support the MCU atmega328 (currently supports only atmega328p). Its quite annoying to keep changing the hex value, everytime we switch the chips/boards. :~

The technique of modifying the avrdude.conf file to load the bootloader on this MCU worked flawlessly using Ardunio-22. THANKS TEN TONS!!!!

BUT, is there a way to modify another settings file (maybe boards.txt???) to allow uploading of sketches to this chip with the Arduino programming interface? I get the same error that occurs when trying to load the bootloader to this chip with an unmodified avrdude.conf file...

I did modify the boards.txt file, noting a 328 chip (vs. 328p), but the sketch won't compile.

trouinky:
The technique of modifying the avrdude.conf file to load the bootloader on this MCU worked flawlessly using Ardunio-22. THANKS TEN TONS!!!!

BUT, is there a way to modify another settings file (maybe boards.txt???) to allow uploading of sketches to this chip with the Arduino programming interface? I get the same error that occurs when trying to load the bootloader to this chip with an unmodified avrdude.conf file...

I did modify the boards.txt file, noting a 328 chip (vs. 328p), but the sketch won't compile.

See my last posting on: Trouble burning the bootloader to Atmega328-PU - #7 by retrolefty - Microcontrollers - Arduino Forum

Once you have a arduino bootloader installed on a non p 328 chip, you need no further modifications to any arduino files to compile and upload to the chip from the arduino IDE.

Lefty

hotshotharry:
So recently i ordered a bunch of atmega chips (atmega328-pu as opposed to the atmega328p pico power series) as i dont need the extra power saving gains so i decided to save myself some money. However I had a heck of a time trying to burn the bootloader on them and it took me several hours to find the info i needed so i thought i would just archive the info for anyone looking for the same. If you have any tips or suggestions please add them as i am still quite new to all of this. The chips loaded in this process seem to work fine ...

Please note this is for the non picopower atmega328-pu chips signature = 0x1e 0x95 0x14 (1E 95 14) vs atmega328p-xx (1E 95 0F)

.....deleted for brevity........

change the 0F to 14 save it and restart the arduino ide, you should now be able to bootload your atmega328-pu chips.

Make sure to change the 14 back to OF and restart when your done loading the bootloaders otherwise it will fail with - Expected signature for ATMEGA328P is 1E 95 14 Double check chip, or use -F to override this ...

Good luck :slight_smile:

FYI. I used the avrisp MK II device to burn the chips. I only had to change this conf file and not change it back for future uploads of sketches.
For windows users’ avrdude.conf is here. C:\Documents and Settings\a\My Documents\Arduino\arduino-0022\hardware\tools\avr\etc

Also I was able to load the sketch without the bootloader. I was able to trigger the reset on the switch and have the program load and run without issues. The timing was off without the bootloader, no doubt certain settings were off, i.e. factory defaults.

This uses the winusb driver so that requires loaded before you can use the avrisp with arduino ide. The studio4 USB driver does not work and the whole studio4 environment and driver has to be uninstalled, the winusblib has to be installed to use the arduino IDE and avrisp MK II to burn bootloaders and upload sketches. It also works with atmega328p (if you have the right signature in avrdude.conf file).

Enjoy.

I've added (probably) support for the 328-pu chips to the "optiLoader" sketch, but I don't have any 328 (non-328P) chips to try it out on. If someone would like to give it a try, it is downloadable from This Google Docs Link

OptiLoader is somewhat described here: New optiboot; beta testers welcome... - #26 by westfw - Microcontrollers - Arduino Forum
It autodetects the target chip type and downloads an appropriate optiboot automagically. 4_4a does mega8, mega168, mega328p, and mega328 (the latter two get identical bootloaders, and will then identify as "Uno" to the Arduino IDE. So far, no one has found any relevant differences between 328 and 328p, other than making people pay attention.)

I didn't try running that version you just posted, but the entry for the 328 is exactly the same as the modification I made to the older optiLoader to do my chips. So there shouldn't be any reason why it won't work.

Thanks a lot hotshotharry for posting this! I was scratching my head for awhile trying to get this to work, and when I finally talked to my board from avrdude directly I could see what the signature was, and realized the difference in signature from the 328p - which led me here. I agree there should be a way to integrate this into the IDE so that you don't have to switch back and fourth... should be easy to do. I'll take a look at doing it and post back if I get it done.

In my case, I had built my own Arduino Pro Mini using an ATMEGA328-AU TQFP-32 package part, and was programming the bootloader via the Arduino v22 IDE with a sparkfun AVR Pocket Programmer (USBTinyISP compatible)

Thank you! I just received an order of 10 of these and started to panic when I got the error about it stating the signature was wrong.

This worked perfectly!

I met the same problem, I wonder why Arduino developers ignore that 328 chip.
OptiLoader doesn't help all the time, for example I needed to burn "ATmega328 on a breadboard (8 MHz internal clock)".

hotshotharry:
So recently i ordered a bunch of atmega chips (atmega328-pu as opposed to the atmega328p pico power series) as i dont need the extra power saving gains so i decided to save myself some money. However I had a heck of a time trying to burn the bootloader on them and it took me several hours to find the info i needed so i thought i would just archive the info for anyone looking for the same. If you have any tips or suggestions please add them as i am still quite new to all of this. The chips loaded in this process seem to work fine ...

Please note this is for the non picopower atmega328-pu chips signature = 0x1e 0x95 0x14 (1E 95 14) vs atmega328p-xx (1E 95 0F)

I tried to load the optiboot and the demillinauve bootloaders via the arduino ide v22 but all i could get was this message - Expected signature for ATMEGA328P is 1E 95 0F Double check chip, or use -F to override this ...

After much searching I found you need to modify the avrdude.conf file ( mac = arduino -show package contents - resources/java/hardware/tools/avr/etc )

Make a backup copy of this file in case something gets messed up.

Open the file with text edit and about 2/3 the way down under atmega 328 find " signature = 0x1e 0x95 0x0F; "

change the 0F to 14 save it and restart the arduino ide, you should now be able to bootload your atmega328-pu chips.

Make sure to change the 14 back to OF and restart when your done loading the bootloaders otherwise it will fail with - Expected signature for ATMEGA328P is 1E 95 14 Double check chip, or use -F to override this ...

Good luck :slight_smile:

thankyou man

As a variation on this theme, I copied the existing ATmega328P entry in avrdude.conf, modified the id, desc, and signature to match the 328, and pasted it before the existing entry.

#------------------------------------------------------------
# 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";
    ;
;

Also, added a new entry in boards.txt like so:

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

uno328.name=Arduino Uno w/ ATmega328 (non-P)
uno328.upload.protocol=arduino
uno328.upload.maximum_size=32256
uno328.upload.speed=115200
uno328.bootloader.low_fuses=0xff
uno328.bootloader.high_fuses=0xde
uno328.bootloader.extended_fuses=0x05
uno328.bootloader.path=optiboot
uno328.bootloader.file=optiboot_atmega328.hex
uno328.bootloader.unlock_bits=0x3F
uno328.bootloader.lock_bits=0x0F
uno328.build.mcu=atmega328
uno328.build.f_cpu=16000000L
uno328.build.core=arduino
uno328.build.variant=standard

This allows selecting my breadboard Uno-clone as a bootloader target. Trying to upload a sketch fails because the compiler doesn't have a matching target, but switching back to the proper Uno target works fine for that anyway. It's still easier than editing the conf file every time I swap chips.

I'm sure this can be made better, so if anyone wants to point out how... :smiley:

Thanks a lot for posting this solution! It totally saved my day! :slight_smile:

Here's a writeup on my experience bootloading this chip Using your Arduino as an ISP.

J

Hi,

Wondering if anyone could help me out...

I was getting the "incorrect signature 0x1e 0x95 0x0F" error at first. I made the changes as per this thread and now all I get is

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
Double check connections and try again, or use -F to override this check.

I don't know what else to do. I've powered my board with an external supply, through the ISP header from the arduino, and nothing works. I also tried both this Arduino Forum and used this sketch Arduino ISP with software spi - Pastebin.com. My board is powered through a 5V regulator. I can see my power LED lighting up, showing the power supply circuit is working. I also verified my traces and connections to the ATMEGA328 (in this case an ATMEGA328 AU (1210) with a 16Mhz crystal). I'm using ArduinoISP.

I'm starting to think I fried my chip, I have very few ideas on what else to do, as this is my first time burning a bootloader.

Any help is greatly appreciated. Thanks!!

Attached is an image of my board's schematics. This is my whole output:

/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328 -cstk500v1 -P/dev/tty.usbmodemfd131 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m 

avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/skumancer/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/tty.usbmodemfd131
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
         AVR Part                      : ATMEGA328
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
avrdude: Send: A [41] . [80]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [02] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [01] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [12] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [98]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
avrdude: Send: A [41] . [84]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [85]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [86]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [87]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [89]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [01] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [12] 
avrdude: Recv: . [10] 
avrdude: Send: B [42] . [86] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [ff] . [ff] . [ff] . [ff] . [00] . [80] . [04] . [00] . [00] . [00] . [80] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: E [45] . [05] . [04] . [d7] . [c2] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: P [50]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
################################## | 100% 0.07s

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

avrdude: Send: Q [51]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 

avrdude done.  Thank you.

How about posting the schematic? You posted a board layout.

Sure thing, here is the schematic! Thanks for your help!

You really should have ALL the gnd and vcc pins of the IC connected. Preferably, each set of power pins should also have its own bypass cap.

It's hard to say whether this is causing your problem. Chip behavior with incomplete power connections is "undefined."

So you mean Pins 3, 6 and 21 need their connection? I could do a quick patch with some thin wire so those are connected.

What do you mean by each set should have its own bypass cap? Is that to say that I should use an x F capacitor for 3 and 4, then 5 and 6?, then one for 21 and ?

When I see implementations of the simplest arduino board you can build, they only connect the minimal set of pins, so that's what I did...I guess I was wrong assuming that was ok?

Assuming that is not the problem, does everything else look sensible and fine?

Most of the "minimal" designs are based on the DIP, so they only have two sets of power connections, but I think most of them DO have both sets connected. It's "standard practice" that all power pins need to be connected, and pretty common to put a bypass cap on each set of power pins. Whether it's necessary or not depends on the internal construction of the chip. Some chips will simply have the multiple external power pins connected to the same internal nets. Some will have the same nets, but with a path on the chip that is higher in resistance than the external power grid ought to have. Some will have separate power nets with only common GND (especially if there is a VCC and an AVCC), but it's not easy to tell from outside exactly which internal parts are connected to which supply, and not connecting the analog supply just because you weren't using what you thought was the analog part of the chip is a bad idea.

Got it, makes sense, thanks for the explanation.

From my schematic, I would have to connect 3, 6 and 21. What capacitor should I use and how should I connect them?

Thanks for all your help, I'm learning a bunch!