Search code examples
arduinoavratmegaavrdude

Programming ATMEGA32A-PU using an Arduino R3


I am just starting out trying to program ATMEL's ATMEGA32A-PU microcontroller using my arduino uno R3 as the ISP programmer. I was following the tutorial found here: http://hackaday.com/2010/10/23/avr-programming-introduction/

This tutorial describes programming an ATMEGA168 chip. I looked up the datasheet for the ATMEGA32 and adjusted the wiring, I believe, correctly and I'm using avrdude to program the chip.

I am running Windows 10 x64. I downloaded WinAVR-20100110.

From the hackaday instructions I loaded my arduino with the ArduinoISP sketch from FILE->examples in the arduino IDE. I made no changes.

The pins on the atmega32 chip are connected thus:
6 (MOSI) to arduino 11
7 (MISO) to arduino 12
8 (SCK) to arduino 13
9 (RST) to arduino 10
10 (VCC) to 5v
11 (GND) to GND
30 (AVCC) to 5v
31 (GND) to GND

I am using the arduino's 5v and GND pins to supply power and ground to the AVR. From a cmd prompt I am running: avrdude -v -P COM3 -b 19200 -c avrisp -p atmega32 -U flash:w:main.hex

avrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\WinAVR-20100110\bin\avrdude.conf"

         Using Port                    : COM3
         Using Programmer              : avrisp
         Overriding Baud Rate          : 19200
         AVR Part                      : ATMEGA32
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         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         4    10    64    0 no       1024    4      0  9000  9000 0xff 0xff
           flash         33     6    64    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel AVR ISP
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e9502
avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as 99
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 "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (144 bytes):

Writing | ################################################## | 100% 0.22s

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

Reading | ################################################## | 100% 0.12s

avrdude: verifying ...
avrdude: 144 bytes of flash verified

avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as 99
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

It goes through the programming and says it succesfully wrote 144 bytes. I've also tried using stk500 since the output of the command above mentions it but I get a timeout error when I do that. For testing purposes all I'm trying to do is get 8 LED's from PORTD to light up. I'm including avr/io.h and

int main(void)
{   
DDRD |= 0xff;       //Set PortD Pins as an output
PORTD |= 0xff;      //Set PortD Pins high to turn on LEDs
while(1) { }        //Loop forever
}

Unfortunately, PD1 is the only led to light up. None of the rest do anything.

I have the microcontroller connected to a breadboard with pins 14-21 each connected to its own 470 ohm resistor. The resistors each connects to its own LED which then connects to ground.


Solution

  • So the problem was in the makefile. I didn't realize the AVR was listed in the makefile that I downloaded from the instructions from the hackaday tutorial. Once I changed the MCU, AVRDUDE_PROGRAMMER, and PORT in the makefile it worked like a charm.

    # WinAVR Sample makefile written by Eric B. Weddington, J�rg Wunsch, et al.
    # Modified (bringing often-changed options to the top) by Elliot Williams
    
    # make all = Make software and program
    # make clean = Clean out built project files.
    # make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
    # make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
    #                4.07 or greater).
    # make program = Download the hex file to the device, using avrdude.  Please
    #                customize the avrdude settings below first!
    # make filename.s = Just compile filename.c into the assembler code only
    # To rebuild project do "make clean" then "make all".
    
    # Microcontroller Type
    # MCU = attiny13
    # MCU = attiny2313
    # MCU = atmega8
    # MCU = atmega168
    MCU = atmega32 # CHANGED THIS TO THE MCU THAT I'M TRYING TO PROGRAM
    
    # Target file name (without extension).
    TARGET = main
    
    # Programming hardware: type avrdude -c ?
    # to get a full listing.
    # AVRDUDE_PROGRAMMER = dapa              # official name of 
    # AVRDUDE_PROGRAMMER = dragon_isp
    AVRDUDE_PROGRAMMER = avrisp # CHANGED THIS TO THE ISP I'M USING TO PROGRAM
    
    AVRDUDE_PORT = COM3         # CHANGED THIS TO THE PORT ARDUINO IS CONNECTED TO
    #AVRDUDE_PORT = usb         # linux for dragon
    #AVRDUDE_PORT = /dev/parport0           # linux
    #AVRDUDE_PORT = lpt1               # windows
    
    ############# Don't need to change below here for most purposes  (Elliot)
    
    # Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
    # (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
    OPT = s
    
    # Output format. (can be srec, ihex, binary)
    FORMAT = ihex
    
    # List C source files here. (C dependencies are automatically generated.)
    SRC = $(TARGET).c
    
    # If there is more than one source file, append them above, or modify and
    # uncomment the following:
    #SRC += foo.c bar.c
    
    # You can also wrap lines by appending a backslash to the end of the line:
    #SRC += baz.c \
    #xyzzy.c
    
    
    
    # List Assembler source files here.
    # Make them always end in a capital .S.  Files ending in a lowercase .s
    # will not be considered source files but generated files (assembler
    # output from the compiler), and will be deleted upon "make clean"!
    # Even though the DOS/Win* filesystem matches both .s and .S the same,
    # it will preserve the spelling of the filenames, and gcc itself does
    # care about how the name is spelled on its command-line.
    ASRC = 
    
    
    # List any extra directories to look for include files here.
    #     Each directory must be seperated by a space.
    EXTRAINCDIRS = 
    
    
    # Optional compiler flags.
    #  -g:        generate debugging information (for GDB, or for COFF conversion)
    #  -O*:       optimization level
    #  -f...:     tuning, see gcc manual and avr-libc documentation
    #  -Wall...:  warning level
    #  -Wa,...:   tell GCC to pass this to the assembler.
    #    -ahlms:  create assembler listing
    CFLAGS = -g -O$(OPT) \
    -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
    -Wall -Wstrict-prototypes \
    -Wa,-adhlns=$(<:.c=.lst) \
    $(patsubst %,-I%,$(EXTRAINCDIRS))
    
    
    # Set a "language standard" compiler flag.
    #   Unremark just one line below to set the language standard to use.
    #   gnu99 = C99 + GNU extensions. See GCC manual for more information.
    #CFLAGS += -std=c89
    #CFLAGS += -std=gnu89
    #CFLAGS += -std=c99
    CFLAGS += -std=gnu99
    
    
    
    # Optional assembler flags.
    #  -Wa,...:   tell GCC to pass this to the assembler.
    #  -ahlms:    create listing
    #  -gstabs:   have the assembler create line number information; note that
    #             for use in COFF files, additional information about filenames
    #             and function names needs to be present in the assembler source
    #             files -- see avr-libc docs [FIXME: not yet described there]
    ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
    
    
    
    # Optional linker flags.
    #  -Wl,...:   tell GCC to pass this to linker.
    #  -Map:      create map file
    #  --cref:    add cross reference to  map file
    LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
    
    
    
    # Additional libraries
    
    # Minimalistic printf version
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_min
    
    # Floating point printf version (requires -lm below)
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
    
    # -lm = math library
    LDFLAGS += -lm
    
    
    # Programming support using avrdude. Settings and variables.
    
    
    AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
    #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
    
    AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
    
    # Uncomment the following if you want avrdude's erase cycle counter.
    # Note that this counter needs to be initialized first using -Yn,
    # see avrdude manual.
    #AVRDUDE_ERASE += -y
    
    # Uncomment the following if you do /not/ wish a verification to be
    # performed after programming the device.
    #AVRDUDE_FLAGS += -V
    
    # Increase verbosity level.  Please use this when submitting bug
    # reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
    # to submit bug reports.
    #AVRDUDE_FLAGS += -v -v
    
    #Run while cable attached or don't
    #AVRDUDE_FLAGS += -E reset #keep chip disabled while cable attached
    #AVRDUDE_FLAGS += -E noreset
    
    #AVRDUDE_WRITE_FLASH = -U lfuse:w:0x04:m #run with 8 Mhz clock
    
    #AVRDUDE_WRITE_FLASH = -U lfuse:w:0x21:m #run with 1 Mhz clock #default clock mode
    
    #AVRDUDE_WRITE_FLASH = -U lfuse:w:0x01:m #run with 1 Mhz clock no start up time
    
    # ---------------------------------------------------------------------------
    
    # Define directories, if needed.
    DIRAVR = c:/winavr
    DIRAVRBIN = $(DIRAVR)/bin
    DIRAVRUTILS = $(DIRAVR)/utils/bin
    DIRINC = .
    DIRLIB = $(DIRAVR)/avr/lib
    
    
    # Define programs and commands.
    SHELL = sh
    
    CC = avr-gcc
    
    OBJCOPY = avr-objcopy
    OBJDUMP = avr-objdump
    SIZE = avr-size
    
    
    # Programming support using avrdude.
    AVRDUDE = avrdude
    
    
    REMOVE = rm -f
    COPY = cp
    
    HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
    ELFSIZE = $(SIZE) -AC --mcu=$(MCU) $(TARGET).elf
    
    
    
    # Define Messages
    # English
    MSG_ERRORS_NONE = Errors: none
    MSG_BEGIN = -------- begin --------
    MSG_END = --------  end  --------
    MSG_SIZE_BEFORE = Size before: 
    MSG_SIZE_AFTER = Size after:
    MSG_COFF = Converting to AVR COFF:
    MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
    MSG_FLASH = Creating load file for Flash:
    MSG_EEPROM = Creating load file for EEPROM:
    MSG_EXTENDED_LISTING = Creating Extended Listing:
    MSG_SYMBOL_TABLE = Creating Symbol Table:
    MSG_LINKING = Linking:
    MSG_COMPILING = Compiling:
    MSG_ASSEMBLING = Assembling:
    MSG_CLEANING = Cleaning project:
    
    
    
    
    # Define all object files.
    OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 
    
    # Define all listing files.
    LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
    
    # Combine all necessary flags and optional flags.
    # Add target processor to flags.
    ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
    ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
    
    
    
    # Default target: make program!
    all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
        $(TARGET).lss $(TARGET).sym sizeafter finished end
        $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
    
    # Eye candy.
    # AVR Studio 3.x does not check make's exit code but relies on
    # the following magic strings to be generated by the compile job.
    begin:
        @echo
        @echo $(MSG_BEGIN)
    
    finished:
        @echo $(MSG_ERRORS_NONE)
    
    end:
        @echo $(MSG_END)
        @echo
    
    
    # Display size of file.
    sizebefore:
        @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
    
    sizeafter:
        @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
    
    
    
    # Display compiler version information.
    gccversion : 
        @$(CC) --version
    
    
    
    
    # Convert ELF to COFF for use in debugging / simulating in
    # AVR Studio or VMLAB.
    COFFCONVERT=$(OBJCOPY) --debugging \
        --change-section-address .data-0x800000 \
        --change-section-address .bss-0x800000 \
        --change-section-address .noinit-0x800000 \
        --change-section-address .eeprom-0x810000 
    
    
    coff: $(TARGET).elf
        @echo
        @echo $(MSG_COFF) $(TARGET).cof
        $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
    
    
    extcoff: $(TARGET).elf
        @echo
        @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
        $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
    
    
    
    
    # Program the device.  
    program: $(TARGET).hex $(TARGET).eep
        $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
    
    
    
    
    # Create final output files (.hex, .eep) from ELF output file.
    %.hex: %.elf
        @echo
        @echo $(MSG_FLASH) $@
        $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
    
    %.eep: %.elf
        @echo
        @echo $(MSG_EEPROM) $@
        -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
        --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
    
    # Create extended listing file from ELF output file.
    %.lss: %.elf
        @echo
        @echo $(MSG_EXTENDED_LISTING) $@
        $(OBJDUMP) -h -S $< > $@
    
    # Create a symbol table from ELF output file.
    %.sym: %.elf
        @echo
        @echo $(MSG_SYMBOL_TABLE) $@
        avr-nm -n $< > $@
    
    
    
    # Link: create ELF output file from object files.
    .SECONDARY : $(TARGET).elf
    .PRECIOUS : $(OBJ)
    %.elf: $(OBJ)
        @echo
        @echo $(MSG_LINKING) $@
        $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
    
    
    # Compile: create object files from C source files.
    %.o : %.c
        @echo
        @echo $(MSG_COMPILING) $<
        $(CC) -c $(ALL_CFLAGS) $< -o $@
    
    
    # Compile: create assembler files from C source files.
    %.s : %.c
        $(CC) -S $(ALL_CFLAGS) $< -o $@
    
    
    # Assemble: create object files from assembler source files.
    %.o : %.S
        @echo
        @echo $(MSG_ASSEMBLING) $<
        $(CC) -c $(ALL_ASFLAGS) $< -o $@
    
    
    
    
    
    
    # Target: clean project.
    clean: begin clean_list finished end
    
    clean_list :
        @echo
        @echo $(MSG_CLEANING)
        $(REMOVE) $(TARGET).hex
        $(REMOVE) $(TARGET).eep
        $(REMOVE) $(TARGET).obj
        $(REMOVE) $(TARGET).cof
        $(REMOVE) $(TARGET).elf
        $(REMOVE) $(TARGET).map
        $(REMOVE) $(TARGET).obj
        $(REMOVE) $(TARGET).a90
        $(REMOVE) $(TARGET).sym
        $(REMOVE) $(TARGET).lnk
        $(REMOVE) $(TARGET).lss
        $(REMOVE) $(OBJ)
        $(REMOVE) $(LST)
        $(REMOVE) $(SRC:.c=.s)
        $(REMOVE) $(SRC:.c=.d)
        $(REMOVE) *~
    
    # Automatically generate C source code dependencies. 
    # (Code originally taken from the GNU make user manual and modified 
    # (See README.txt Credits).)
    #
    # Note that this will work with sh (bash) and sed that is shipped with WinAVR
    # (see the SHELL variable defined above).
    # This may not work with other shells or other seds.
    #
    %.d: %.c
        set -e; $(CC) -MM $(ALL_CFLAGS) $< \
        | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
        [ -s $@ ] || rm -f $@
    
    
    # Remove the '-' if you want to see the dependency files generated.
    -include $(SRC:.c=.d)
    
    
    
    # Listing of phony targets.
    .PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
        clean clean_list program