# TAKEN FROM: http://www.roxlu.com/blog/entry/59/attiny2313,-avrdude-and-arduino-&-avrisp # See: http://electrons.psychogenic.com/modules/arms/view.php?w=art&idx=8&page=2 ##### This Makefile will make compiling Atmel AVR ##### micro controller projects simple with Linux ##### or other Unix workstations and the AVR-GCC ##### tools. ##### ##### It supports C, C++ and Assembly source files. ##### ##### Customize the values as indicated below and : ##### make ##### make disasm ##### make stats ##### make hex ##### make writeflash ##### make gdbinit ##### or make clean ##### ##### See the http://electrons.psychogenic.com/ ##### website for detailed instructions #################################################### ##### ##### ##### Configuration ##### ##### ##### ##### Customize the values in this section for ##### ##### your project. MCU, PROJECTNAME and ##### ##### PRJSRC must be setup for all projects, ##### ##### the remaining variables are only ##### ##### relevant to those needing additional ##### ##### include dirs or libraries and those ##### ##### who wish to use the avrdude programmer ##### ##### ##### ##### See http://electrons.psychogenic.com/ ##### ##### for further details. ##### ##### ##### #################################################### ##### Target Specific Details ##### ##### Customize these for your project ##### # Name of target controller # (e.g. 'at90s8515', see the available avr-gcc mmcu # options for possible values) MCU=attiny2313 # Name of our project # (use a single word, e.g. 'myproject') PROJECTNAME=avr-clock # Source files # List C/C++/Assembly source files: # (list all files to compile, e.g. 'a.c b.cpp as.S'): # Use .cc, .cpp or .C suffix for C++ files, use .S # (NOT .s !!!) for assembly source code files. PRJSRC=avr-clock.c # additional includes (e.g. -I/path/to/mydir) INC= # libraries to link in (e.g. -lmylib) LIBS= # Optimization level, # use s (size opt), 1, 2, 3 or 0 (off) OPTLEVEL=s # Fuse values (careful now!) # external 4MHz osc, divide clock by 8, max start-up time, no brown-out detection, serial programming enabled HFUSE=0xdf LFUSE=0x7d ## eeprom data # override this when calling make for eeprom target, like # $ make eeprom EEP=3,0 # meanings: # byte 0... which part of the time to display, 0=seconds units, 5=hours tens # byte 1... whether to flash the decimal point with each second # byte 2... is this the master? (i.e. should it handle input and be the master in TWI setups?) EEP=2,1,1 ##### AVR Dude 'writeflash' options ##### ##### If you are using the avrdude program ##### (http://www.bsdhome.com/avrdude/) to write ##### to the MCU, you can set the following config ##### options and use 'make writeflash' to program ##### the device. # programmer id--check the avrdude for complete list # of available opts. These should include stk500, # avr910, avrisp, bsd, pony and more. Set this to # one of the valid "-c PROGRAMMER-ID" values # described in the avrdude info page. # AVRDUDE_PROGRAMMERID=avrisp # port--serial or parallel port to which your # hardware programmer is attached # AVRDUDE_PORT=/dev/tty.usbserial-A1001MPB #################################################### ##### Config Done ##### ##### ##### ##### You should not need to edit anything ##### ##### below to use the makefile but may wish ##### ##### to override a few of the flags ##### ##### nonetheless ##### ##### ##### #################################################### ##### Flags #### # HEXFORMAT -- format for .hex file output HEXFORMAT=ihex # compiler CFLAGS=-I. $(INC) -g -mmcu=$(MCU) -O$(OPTLEVEL) \ -std=c99 \ -fpack-struct -fshort-enums \ -funsigned-bitfields -funsigned-char \ -Wall -Werror \ -Wa,-ahlms=$(firstword \ $(filter %.lst, $(<:.c=.lst))) # c++ specific flags CPPFLAGS=-fno-exceptions \ -Wa,-ahlms=$(firstword \ $(filter %.lst, $(<:.cpp=.lst))\ $(filter %.lst, $(<:.cc=.lst)) \ $(filter %.lst, $(<:.C=.lst))) # assembler ASMFLAGS =-I. $(INC) -mmcu=$(MCU) \ -x assembler-with-cpp \ -Wa,-gstabs,-ahlms=$(firstword \ $(<:.S=.lst) $(<.s=.lst)) # linker LDFLAGS=-Wl,-Map,$(TRG).map -mmcu=$(MCU) \ -lm $(LIBS) # avrdude flags AVRDUDEFLAGS=-c $(AVRDUDE_PROGRAMMERID) \ -p $(MCU) -P $(AVRDUDE_PORT) \ -b 19200 ##### executables #### CC=avr-gcc OBJCOPY=avr-objcopy OBJDUMP=avr-objdump SIZE=avr-size AVRDUDE=avrdude REMOVE=rm -f ##### automatic target names #### TRG=$(PROJECTNAME).out DUMPTRG=$(PROJECTNAME).s HEXROMTRG=$(PROJECTNAME).hex HEXTRG=$(HEXROMTRG) $(PROJECTNAME).ee.hex GDBINITFILE=gdbinit-$(PROJECTNAME) # Define all object files. # Start by splitting source files by type # C++ CPPFILES=$(filter %.cpp, $(PRJSRC)) CCFILES=$(filter %.cc, $(PRJSRC)) BIGCFILES=$(filter %.C, $(PRJSRC)) # C CFILES=$(filter %.c, $(PRJSRC)) # Assembly ASMFILES=$(filter %.S, $(PRJSRC)) # List all object files we need to create OBJDEPS=$(CFILES:.c=.o) \ $(CPPFILES:.cpp=.o)\ $(BIGCFILES:.C=.o) \ $(CCFILES:.cc=.o) \ $(ASMFILES:.S=.o) # Define all lst files. LST=$(filter %.lst, $(OBJDEPS:.o=.lst)) # All the possible generated assembly # files (.s files) GENASMFILES=$(filter %.s, $(OBJDEPS:.o=.s)) .SUFFIXES : .c .cc .cpp .C .o .out .s .S \ .hex .ee.hex .h .hh .hpp .PHONY: writeflash clean stats gdbinit stats eeprom # Make targets: # all, disasm, stats, hex, writeflash/install, clean all: $(TRG) disasm: $(DUMPTRG) stats stats: $(TRG) $(OBJDUMP) -h $(TRG) $(SIZE) $(TRG) hex: $(HEXTRG) writeflash: hex $(AVRDUDE) $(AVRDUDEFLAGS) \ -e \ -U flash:w:$(HEXROMTRG) \ -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m \ -U eeprom:w:$(EEP):m # write just eeprom eeprom: $(AVRDUDE) $(AVRDUDEFLAGS) -U eeprom:w:$(EEP):m install: writeflash $(DUMPTRG): $(TRG) $(OBJDUMP) -S $< > $@ $(TRG): $(OBJDEPS) Makefile $(CC) $(LDFLAGS) -o $(TRG) $(OBJDEPS) #### Generating assembly #### # asm from C %.s: %.c Makefile $(CC) -S $(CFLAGS) $< -o $@ # asm from (hand coded) asm %.s: %.S Makefile $(CC) -S $(ASMFLAGS) $< > $@ # asm from C++ .cpp.s .cc.s .C.s : Makefile $(CC) -S $(CFLAGS) $(CPPFLAGS) $< -o $@ #### Generating object files #### # object from C .c.o: Makefile $(CC) $(CFLAGS) -c $< # object from C++ (.cc, .cpp, .C files) .cc.o .cpp.o .C.o : Makefile $(CC) $(CFLAGS) $(CPPFLAGS) -c $< # object from asm .S.o : Makefile $(CC) $(ASMFLAGS) -c $< -o $@ #### Generating hex files #### # hex files from elf ##### Generating a gdb initialisation file ##### .out.hex: Makefile $(OBJCOPY) -j .text \ -j .data \ -O $(HEXFORMAT) $< $@ .out.ee.hex: Makefile $(OBJCOPY) -j .eeprom \ --change-section-lma .eeprom=0 \ -O $(HEXFORMAT) $< $@ ##### Generating a gdb initialisation file ##### ##### Use by launching simulavr and avr-gdb: ##### ##### avr-gdb -x gdbinit-myproject ##### gdbinit: $(GDBINITFILE) $(GDBINITFILE): $(TRG) @echo "file $(TRG)" > $(GDBINITFILE) @echo "target remote localhost:1212" \ >> $(GDBINITFILE) @echo "load" >> $(GDBINITFILE) @echo "break main" >> $(GDBINITFILE) @echo "continue" >> $(GDBINITFILE) @echo @echo "Use 'avr-gdb -x $(GDBINITFILE)'" #### Cleanup #### clean: $(REMOVE) $(TRG) $(TRG).map $(DUMPTRG) $(REMOVE) $(OBJDEPS) $(REMOVE) $(LST) $(GDBINITFILE) $(REMOVE) $(GENASMFILES) $(REMOVE) $(HEXTRG)