I have two ATMEGA328's and I'm experiencing a very strange problem. I have a very simple code to blink a LED:

        #define F_CPU 8000000UL

        #include <avr/io.h>
        #include <util/delay.h>
        #include <stdlib.h>

        void delayms( uint16_t millis ) 
        {
                while ( millis ) 
                {
                        _delay_ms( 1 );
                        millis--;
                }
        }

        int main( void ) 
        {
                DDRD = 0b11111111;

                int interval = 1000;

                while ( 1 ) 
                {
                        PORTD = 0b11111111;
                        delayms( interval );
                        PORTD = 0b00000000;
                        delayms( interval );
                }

                return 0;
        }

And here is the Makefile:

        CC=/usr/bin/avr-gcc
        MEGA=328p
        CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega$(MEGA)
        OBJ2HEX=/usr/bin/avr-objcopy 
        PROG=/usr/bin/avrdude
        TARGET=blink

        program : $(TARGET).hex
                $(PROG) -c avrispv2 -p m$(MEGA) -P /dev/ttyACM2 -e
                $(PROG) -c avrispv2 -p m$(MEGA) -P /dev/ttyACM2 -U flash:w:$(TARGET).hex

        %.obj : %.o
                $(CC) $(CFLAGS) $< -o $@

        %.hex : %.obj
                $(OBJ2HEX) -R .eeprom -O ihex $< $@

        clean :
                rm -f *.hex *.obj *.o

The code works perfectly, but here's the strange part: 

ATMEGA #1:

 - Works as expected when connected straight to the 5V source. Meaning it executes the last code, that was written to it. 
 - Can't be programmed. avrdude: stk500v2_command(): command failed. Can't connect.

ATMEGA #2:

 - Works only through Arduino case. When connected straight to the 5V source, PORTD outputs nothing.
 - Can be programmed.

This mystery has happened so many times before. All I can think of is that it has something to do with the fuse bits or possibly the frequency is 'hardcoded' for one chip at 8Mhz and 16Mhz for the other one. I was expecting that F_CPU defines that and avrdude uses that definition to set the fuses correctly.

I don't want to use an external oscillator. Any hints on what's going on?

**UPDATE:** Here's the output for one of the ATMEGAs that failed to program.

    /usr/bin/avrdude -c avrispv2 -p m328p -P /dev/ttyACM0 -e -U lfuse:w:0xe2:m -B 250.0 -U hfuse:w:0xd9:m

    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.07s

    avrdude: Device signature = 0x1e950f
    avrdude: erasing chip
    avrdude: reading input file "0xe2"
    avrdude: writing lfuse (1 bytes):

    Writing | ################################################## | 100% 0.07s

    avrdude: 1 bytes of lfuse written
    avrdude: verifying lfuse memory against 0xe2:
    avrdude: load data lfuse data from input file 0xe2:
    avrdude: input file 0xe2 contains 1 bytes
    avrdude: reading on-chip lfuse data:

    Reading | ################################################## | 100% 0.02s

    avrdude: verifying ...
    avrdude: 1 bytes of lfuse verified
    avrdude: reading input file "0xd9"
    avrdude: writing hfuse (1 bytes):

    Writing | ################################################## | 100% 0.02s

    avrdude: 1 bytes of hfuse written
    avrdude: verifying hfuse memory against 0xd9:
    avrdude: load data hfuse data from input file 0xd9:
    avrdude: input file 0xd9 contains 1 bytes
    avrdude: reading on-chip hfuse data:

    Reading | ################################################## | 100% 0.02s

    avrdude: verifying ...
    avrdude: 1 bytes of hfuse verified

    avrdude: safemode: Fuses OK (E:07, H:D9, L:E2)

    avrdude done.  Thank you.

    /usr/bin/avrdude -c avrispv2 -p m328p -P /dev/ttyACM0 -U flash:w:serial.hex

    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.07s

    avrdude: Device signature = 0x1e950f
    avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "serial.hex"
    avrdude: input file serial.hex auto detected as Intel Hex
    avrdude: writing flash (912 bytes):

    Writing |                                                    | 0% 0.00s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ######                                             | 12% 2.84s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | #############                                      | 25% 5.68s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ###################                                | 37% 8.52s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ###############################                    | 62% 14.20s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ######################################             | 75% 17.04s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ############################################       | 87% 19.89s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Writing | ################################################## | 100% 22.73s

    avrdude: 912 bytes of flash written
    avrdude: verifying flash memory against serial.hex:
    avrdude: load data flash data from input file serial.hex:
    avrdude: input file serial.hex auto detected as Intel Hex
    avrdude: input file serial.hex contains 912 bytes
    avrdude: reading on-chip flash data:

    Reading |                                                    | 0% 0.00s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | ######                                             | 12% 2.80s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | ###################                                | 37% 8.39s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | #########################                          | 50% 11.18s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | ###############################                    | 62% 13.98s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | ############################################       | 87% 19.57s
    avrdude: stk500v2_ReceiveMessage(): timeout
    Reading | ################################################## | 100% 22.37s

    avrdude: verifying ...
    avrdude: verification error, first mismatch at byte 0x0000
             0x80 != 0x0c
    avrdude: verification error; content mismatch

    avrdude: safemode: Fuses OK (E:07, H:D9, L:E2)

    avrdude done.  Thank you.

    Makefile:9: recipe for target 'program' failed
    make: *** [program] Error 1