From c75086ea009abb9b66f1fcd866babdf332189688 Mon Sep 17 00:00:00 2001 From: MightyPork Date: Wed, 29 Apr 2015 11:14:42 +0200 Subject: [PATCH] added examples folder --- examples/Makefile | 137 +++++++++++++++++++++++++++++++++++++++++ examples/README.md | 8 +++ examples/lib | 1 + examples/uart_isr.c | 38 ++++++++++++ examples/uart_simple.c | 58 +++++++++++++++++ lib/uart.h | 10 +-- 6 files changed, 247 insertions(+), 5 deletions(-) create mode 100644 examples/Makefile create mode 100644 examples/README.md create mode 120000 examples/lib create mode 100644 examples/uart_isr.c create mode 100644 examples/uart_simple.c diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..2bd0c16 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,137 @@ +## === CPU settings === +# CPU type +MCU = atmega328p +# CPU frequency +F_CPU = 16000000 +# Fuses +LFUSE = 0xFF +HFUSE = 0xDE +EFUSE = 0x05 + + +## === Source files === +# Main C file +MAIN = uart_isr.c +# Extra C files in this folder +LOCAL_SOURCE = + +# Library directory (with C files) +EXTRA_SOURCE_DIR = lib/ +# C files in the library directory +EXTRA_SOURCE_FILES = uart.c + + +## === Programmer === +PROGRAMMER_TYPE = arduino +PROGRAMMER_ARGS = -b 57600 -P /dev/ttyUSB0 + + +## === C flags === + +CFLAGS = -std=gnu99 -mmcu=$(MCU) -DF_CPU=$(F_CPU)UL -I. -I$(EXTRA_SOURCE_DIR) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wno-main -Wno-strict-prototypes -Wno-comment +CFLAGS += -g2 -Wextra -Wfatal-errors -Wno-unused-but-set-variable +CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax +# CFLAGS += -lm ## Math +# CFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +# CFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +CFLAGS_BUILD = $(CFLAGS) -Os + + +# --------------------------------------------------------------------------- + +## Defined programs / locations +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +## === File lists === +TARGET = $(strip $(basename $(MAIN))) +SRC1 = $(TARGET).c +SRC = $(SRC1) +EXTRA_SOURCE = $(addprefix $(EXTRA_SOURCE_DIR), $(EXTRA_SOURCE_FILES)) +SRC += $(EXTRA_SOURCE) +SRC += $(LOCAL_SOURCE) + +HEADERS = $(SRC:.c=.h) +OBJ = $(SRC:.c=.o) + + +## === File generation === +all: $(TARGET).hex size +pre: $(TARGET).pre + +%.hex: %.elf + $(OBJCOPY) -R .eeprom -O ihex $< $@ + +%.elf: $(SRC) + $(CC) $(CFLAGS_BUILD) $(SRC) --output $@ + +%.pre: $(SRC1) + $(CC) $(CFLAGS) -E $(SRC1) --output $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +# Show debug info +debug: + @echo + @echo "Source files:" $(SRC) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + + +# Disassemble the ELF +disassemble: $(TARGET).lst +dis: disassemble +lst: disassemble + +# Make eeprom file +eeprom: $(TARGET).eeprom + +# Show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +# Clean all produced trash +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +# Clean all trash +purge: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ + + +## === avrdude === + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +flashe: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +shell: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + + +# === fuses === + +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..bc85502 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,8 @@ +Library usage examples +====================== + +Those examples should work, but they are mostly just a reference on how to +use different parts of the library. + +To try to build and flash an example, first change the `MAIN` field in the Makefile +to it's name. diff --git a/examples/lib b/examples/lib new file mode 120000 index 0000000..386215c --- /dev/null +++ b/examples/lib @@ -0,0 +1 @@ +/home/ondra/elektro/avr-lib/lib \ No newline at end of file diff --git a/examples/uart_isr.c b/examples/uart_isr.c new file mode 100644 index 0000000..c52000d --- /dev/null +++ b/examples/uart_isr.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "lib/uart.h" + + +// UART receive interrupt vector +ISR(USART_RX_vect) +{ + uint8_t c = uart_rx(); + + // print character and it's code + uart_putc(c); + uart_putc(' '); + uart_putu(c); + uart_nl(); +} + + +void main() +{ + // Set up UART at speed 9600 baud + uart_init(9600); + // Enable receive ISR + uart_isr_rx(1); + // Enable interrupts + sei(); + + // Greeter string + uart_puts_pgm(PSTR("UART receiver with ISR\r\n")); + + while(1); +} diff --git a/examples/uart_simple.c b/examples/uart_simple.c new file mode 100644 index 0000000..9973224 --- /dev/null +++ b/examples/uart_simple.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "lib/uart.h" + +void main() +{ + // Enable UART with baud rate 9600 + uart_init(9600); + + + + // --- some examples of printing functions --- + + + // Printing a string + uart_puts("Simple UART example!\r\n"); + + // You can put your string literals in the program memory + // and use the _pgm variant: + uart_puts_pgm(PSTR("Program memory string example\r\n")); + + // print a char. This is an alias for uart_tx + uart_putc('a'); + + // print a newline + uart_nl(); + + // Printing numbers is also easy + // Look in the library file for more info + uart_putn(123); + uart_nl(); + + // Print int as float (adds decimal point) + uart_puti(31415, 4); + uart_nl(); + + + + // --- receive example --- + + // Example of listening for input + while(1) { + // If something is received + if (uart_rx_ready()) { + // Get the received byte + char c = uart_rx(); + // Send it back, twice + uart_tx(c); + uart_tx(c); + } + } +} diff --git a/lib/uart.h b/lib/uart.h index 1a44d6e..fc0a45d 100644 --- a/lib/uart.h +++ b/lib/uart.h @@ -65,10 +65,10 @@ void uart_puts_pgm(const char* str); // Numbers /** Send unsigned int */ -void uart_putn(const int8_t num); +void uart_putu(const uint8_t num); /** Send signed int */ -void uart_putu(const uint8_t num); +void uart_putn(const int8_t num); /** Send unsigned int */ void uart_puti(const int16_t num, const uint8_t places); @@ -76,12 +76,12 @@ void uart_puti(const int16_t num, const uint8_t places); /** Send signed int */ void uart_putiu(const uint16_t num, const uint8_t places); -/** Send unsigned long */ -void uart_putlu(const uint32_t num, const uint8_t places); - /** Send signed long */ void uart_putl(const int32_t num, const uint8_t places); +/** Send unsigned long */ +void uart_putlu(const uint32_t num, const uint8_t places); + // Extras /** Send CRLF */