From 9b47750a0b4df25359d777689e539e5e45380586 Mon Sep 17 00:00:00 2001 From: Patrick Servello Date: Fri, 23 May 2014 07:52:00 -0500 Subject: [PATCH] Added initial files --- Makefile | 251 ++++++++++++++++++++++++++++++++++++ example.c | 26 ++++ usart_printf/usart_printf.c | 32 +++++ usart_printf/usart_printf.h | 18 +++ 4 files changed, 327 insertions(+) create mode 100644 Makefile create mode 100644 example.c create mode 100644 usart_printf/usart_printf.c create mode 100644 usart_printf/usart_printf.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..58f61a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,251 @@ + +######### AVR Project Makefile Template ######### +###### ###### +###### Copyright (C) 2003-2005,Pat Deegan, ###### +###### Psychogenic Inc ###### +###### All Rights Reserved ###### +###### ###### +###### You are free to use this code as part ###### +###### of your own applications provided ###### +###### you keep this copyright notice intact ###### +###### and acknowledge its authorship with ###### +###### the words: ###### +###### ###### +###### "Contains software by Pat Deegan of ###### +###### Psychogenic Inc (www.psychogenic.com)" ###### +###### ###### +###### If you use it as part of a web site ###### +###### please include a link to our site, ###### +###### http://electrons.psychogenic.com or ###### +###### http://www.psychogenic.com ###### +###### ###### +#################################################### + + +##### 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. ##### +##### ##### +#################################################### + +MCU=atmega328p +PROGRAMMER_MCU=atmega328p +F_CPU=16000000 +PROJECTNAME=usartprintf +PRJSRC=example.c usart_printf/usart_printf.c +LIBS= +OPTLEVEL=s + +AVRDUDE_PROGRAMMERID=usbasp +AVRDUDE_PORT=/dev/usb + + + +HEXFORMAT=ihex + +CFLAGS=-I. $(INC) -g -mmcu=$(MCU) -DF_CPU=$(F_CPU) -O$(OPTLEVEL) \ + -fpack-struct -fshort-enums \ + -funsigned-bitfields -funsigned-char \ + -Wall -Wstrict-prototypes \ + -Wa,-ahlms=$(firstword \ + $(filter %.lst, $(<:.c=.lst))) + +CPPFLAGS=-fno-exceptions \ + -Wa,-ahlms=$(firstword \ + $(filter %.lst, $(<:.cpp=.lst))\ + $(filter %.lst, $(<:.cc=.lst)) \ + $(filter %.lst, $(<:.C=.lst))) + +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) + +##### 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 + +# 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) -c $(AVRDUDE_PROGRAMMERID) \ + -p $(PROGRAMMER_MCU) -P $(AVRDUDE_PORT) -e \ + -U flash:w:$(HEXROMTRG) + +install: writeflash + +$(DUMPTRG): $(TRG) + $(OBJDUMP) -S $< > $@ + + +$(TRG): $(OBJDEPS) + $(CC) $(LDFLAGS) -o $(TRG) $(OBJDEPS) + + +#### Generating assembly #### +# asm from C +%.s: %.c + $(CC) -S $(CFLAGS) $< -o $@ + +# asm from (hand coded) asm +%.s: %.S + $(CC) -S $(ASMFLAGS) $< > $@ + + +# asm from C++ +.cpp.s .cc.s .C.s : + $(CC) -S $(CFLAGS) $(CPPFLAGS) $< -o $@ + + + +#### Generating object files #### +# object from C +.c.o: + $(CC) $(CFLAGS) -c $< -o $@ + + +# object from C++ (.cc, .cpp, .C files) +.cc.o .cpp.o .C.o : + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +# object from asm +.S.o : + $(CC) $(ASMFLAGS) -c $< -o $@ + + +#### Generating hex files #### +# hex files from elf +##### Generating a gdb initialisation file ##### +.out.hex: + $(OBJCOPY) -j .text \ + -j .data \ + -O $(HEXFORMAT) $< $@ + +.out.ee.hex: + $(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) + + + +##### EOF ##### \ No newline at end of file diff --git a/example.c b/example.c new file mode 100644 index 0000000..6ff43f6 --- /dev/null +++ b/example.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include "usart_printf/usart_printf.h" + +#define FAULT_VCC_SHORT 3 +#define FAULT_GND_SHORT 2 +#define FAULT_OPEN_CONN 1 +#define NO_FAULT 0 + +int main(void) { + + usart_initialize(); + stdout = &uart_output; + _delay_ms(10); + + for(;;) { + + printf("Hello AVR printf"); + _delay_ms(1000); + } + + +} + + diff --git a/usart_printf/usart_printf.c b/usart_printf/usart_printf.c new file mode 100644 index 0000000..f146ecc --- /dev/null +++ b/usart_printf/usart_printf.c @@ -0,0 +1,32 @@ +#include +#include +#include + +#define BAUD_RATE 9600 +#define BAUD_PRESCALE (F_CPU/16/BAUD_RATE-1) + +void usart_initialize(void) { + UBRR0H = (BAUD_PRESCALE >> 8); + UBRR0L = BAUD_PRESCALE; + + //Enable receive and transmit + UCSR0B = (1< + + + +void usart_send_byte(char byte, FILE *stream); +char usart_get_byte(FILE *stream); +void usart_initialize(void); + + +FILE uart_output = FDEV_SETUP_STREAM(usart_send_byte, NULL, _FDEV_SETUP_WRITE); +FILE uart_input = FDEV_SETUP_STREAM(NULL, usart_get_byte, _FDEV_SETUP_READ); + + + + +#endif \ No newline at end of file