diff --git a/Makefile.base b/Makefile.base new file mode 100644 index 0000000..c43e477 --- /dev/null +++ b/Makefile.base @@ -0,0 +1,452 @@ +### MARKHAM'S NOTES: + +# This Makefile includes the Arduino core sources. (Set ARDDIR here:) +ARDDIR = /home/mrh/Downloads/arduino-1.8.8-linux64/arduino-1.8.8/ +#ARDDIR = /home/mrh/Downloads/arduino-1.8.8-linux64/arduino-1.8.8/hardware/arduino/avr + +# You should build a tiny Makefile for each of your projects and just declare a few +# things in it, then include this Makefile in it. Your Makefile should be in the same +# directory as your TARGET file (see below). +# +# Exemplia gratia: +# +# TARGET = foo # the name of your main file, with no extension +# SRC = foo.c bar.c # the C source files +# PSRC = baz.cpp qux.cpp # the C++ source files +# ARDLIBS = SoftwareSerial # extra Arduino libraries +# include /d/dev/avr/Makefile.base # this line includes the Makefile.base + +# A number of necessary variables are set to defaults below, but you can override them +# in your own Makefile: +# F_CPU (default is 16000000) +# MCU (default is atmega328p) +# AVRDUDE_PORT (default is com8) +# +# To include Arduino libraries, define +# ARDLIBS = SoftwareSerial Servo... +# +# This Makefile requires that you have no spaces in your file paths, including +# your Arduino directory (where you core, variants, and libs are stored). If +# necessary, copy your Arduino source files to another directory and define that +# directory in the variables for this file. + +# This Makefile is modified from +# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al. +# Modified (bringing often-changed options to the top) by Elliot Williams + +# The following tasks are defined in this Makefile: +# make all = Make software and program +# make clean = Clean out built project files. +# make program = Download the hex file to the device, using avrdude. + +# Supply the following variables: +# SRC = source files ending with .c +# PSRC = source files ending with .cpp + +### These macros pertain to compiler flags +# Target file name (without extension). +ifndef TARGET +TARGET = main +endif +# List any extra directories to look for include files here. +ifndef EXTRAINCDIRS +EXTRAINCDIRS = +endif +ifndef LDFLAGS +LDFLAGS = +endif +ifndef CFLAGS +CFLAGS = +endif + + +### These macros pertain to hardware settings +ifndef MCU +MCU = atmega328p +endif +ifndef AVRDUDE_PROGRAMMER +AVRDUDE_PROGRAMMER = stk500v1 +endif +ifndef AVRDUDE_PORT +AVRDUDE_PORT = com8 +endif +ifndef BAUDRATE +BAUDRATE = 19200 +endif +ifndef F_CPU +F_CPU = 16000000 +endif +CFLAGS += -D F_CPU=$(F_CPU) -D ARDUINO + +# hardware/arduino/avr/libraries/SPI/src/SPI.cpp: + +ARDLIBS2 = SPI +### These macros pertain to supporting Arduino libs +ifndef NO_ARDUINO + LDFLAGS += -lm # -lm = math library + ARDLIBDIR = $(ARDDIR)/libraries + ARDLIBDIR2 = $(ARDDIR)/hardware/arduino/avr/libraries + ARDCOREDIR = $(ARDDIR)/hardware/arduino/avr/cores/arduino + ifeq ($(MCU),atmega328p) + EXTRAINCDIRS += $(ARDDIR)/hardware/arduino/variants/standard + endif + ifeq ($(MCU),atmega2560) + EXTRAINCDIRS += $(ARDDIR)/hardware/arduino/variants/mega + endif + ifeq ($(MCU),attiny85) + EXTRAINCDIRS += $(ARDDIR)/hardware/attiny/variants/tiny8 + endif + # add Arduino sources and include directories to PSRC and EXTRAINCDIRS + PSRC += $(wildcard $(ARDCOREDIR)/*.cpp) + SRC += $(wildcard $(ARDCOREDIR)/*.c) + EXTRAINCDIRS += $(ARDCOREDIR) + PSRC += $(foreach lib,$(ARDLIBS),$(ARDLIBDIR)/$(lib)/$(lib).cpp) + PSRC += $(foreach lib,$(ARDLIBS2),$(ARDLIBDIR2)/$(lib)/src/$(lib).cpp) + EXTRAINCDIRS += $(foreach lib,$(ARDLIBS),$(ARDLIBDIR)/$(lib)) +endif + + +############# 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 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 = #$(ARDDIR)/hardware/arduino/avr/cores/arduino/wiring_pulse.S + +# 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 -DBAUD=9600UL \ +$(patsubst %,-I%,$(EXTRAINCDIRS)) + + +# 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 + + +# 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 +# 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) -A $(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) $(PSRC:.cpp=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) $(PSRC:.cpp=.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -Wa,-adhlns=$(<:.c=.lst) +ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -Wa,-adhlns=$(<:.cpp=.lst) +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 + +# 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 + @echo + @echo $(OBJ) + + + + +# 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) -b $(BAUDRATE) $(AVRDUDE_WRITE_EEPROM) -vvvv + + + + +# 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 $@ + + +# Compile: create object files from C++ source files +%.o: %.cpp + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CXXFLAGS) $< -o $@ + +# Compile: create assembler files from C source files. +%.s: %.cpp + $(CC) -S $(ALL_CXXFLAGS) $< -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) $(TARGET).lst + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(PSRC:.cpp=.s) + $(REMOVE) $(PSRC:.cpp=.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 $@ + +%.d: %.cpp + 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) + +-include $(PSRC:.cpp=.d) + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ + clean clean_list program diff --git a/Makefile.mk b/Makefile.mk new file mode 100644 index 0000000..d6aaac3 --- /dev/null +++ b/Makefile.mk @@ -0,0 +1,26 @@ +# This is the name of the file that shall be created. (It is also the name of my primary source file, without the file extension.) +TARGET = main + +# create a variable that only pertains to this project +#MY_OWN_LIBRARY_DIR = /usr/home/MJ/Arduino/libraries/mj_midi + +base = /home/mrh/Downloads/arduino-1.8.8-linux64/arduino-1.8.8 + +# "EXTRAINCDIRS" is a variable used by the base makefile. The base makefile creates a -I compiler flag for every item in the "EXTRAINCDIRS" list. +EXTRAINCDIRS = \ + ${base}/hardware/arduino/avr/libraries/SPI/src \ + ${base}/hardware/arduino/avr/cores/arduino \ + ${base}/hardware/arduino/avr/variants/standard \ + ${base}/libraries/RF24 \ + +# specify *.c source files pertaining to my project +SRC = + +# specify *.cpp source files pertaining to my project +PSRC = main.cpp + +# specify additional (non-core) Arduino libraries to include +ARDLIBS = RF24 + +# include my base makefile +include ./Makefile.base diff --git a/main.c b/main.cpp similarity index 85% rename from main.c rename to main.cpp index 1a9c2da..717200e 100644 --- a/main.c +++ b/main.cpp @@ -3,6 +3,13 @@ #include #include #include +#include + +#include +#include +#include +#define CE_PIN 7 +#define CSN_PIN 8 #define LED PORTD2 #define PULL PORTD3 @@ -38,9 +45,12 @@ void uart_putstr(char *data) { } +const char thisSlaveAddress[5] = {'R','x','A','A','A'}; int main(void) { - + digitalWrite(10, 10); + + RF24 value(CE_PIN, CSN_PIN); uart_init(); DDRC &= ~(1<<0); // Input diff --git a/main2.c b/main2.c deleted file mode 100644 index 1479080..0000000 --- a/main2.c +++ /dev/null @@ -1,118 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define LED PORTB5 -#define RELAY PORTB0 - -uint16_t adc_read(uint8_t adcx); -void uart_init(); -void uart_putchar(char c); -void uart_putstr(char *data); - -int main(void) { - - uart_init(); - - /* Enable the ADC */ - ADCSRA |= _BV(ADEN); - - /* Set the LED pin as an output. */ - DDRB |= _BV(LED); - DDRB |= _BV(RELAY); - - const int ring_buf_size = 20; - uint16_t ring_buf[ring_buf_size]; - int index = 0; - - float average = 10; - const int threshold = 50; - - for (;;_delay_ms(200)) { - - uint16_t pin_value = adc_read(0); - - if (index > ring_buf_size) - index = 0; - ring_buf[index] = pin_value; - index++; - - average = 0; - for (int i = 0; i < ring_buf_size; i++){ - average += ring_buf[i]; - } - average /= ring_buf_size; - - // Print the value to serial - char buff[10]; - itoa(pin_value, buff, 10); - uart_putstr(buff); - uart_putstr("\n"); - - itoa(average, buff, 10); - uart_putstr(buff); - uart_putstr("\n"); - -// PORTD |= (1 << WIRE); -// PORTD &= (0 << WIRE); - - if (abs(pin_value - average) > threshold) - PORTB |= _BV(LED); - else - PORTB &= ~_BV(LED); - - } -} - -uint16_t adc_read(uint8_t adcx) { - /* adcx is the analog pin we want to use. ADMUX's first few bits are - * the binary representations of the numbers of the pins so we can - * just 'OR' the pin's number with ADMUX to select that pin. - * We first zero the four bits by setting ADMUX equal to its higher - * four bits. */ - ADMUX = _BV(REFS0) | adcx; - /* This starts the conversion. */ - ADCSRA |= _BV(ADSC); - - /* This is an idle loop that just wait around until the conversion - * is finished. It constantly checks ADCSRA's ADSC bit, which we just - * set above, to see if it is still set. This bit is automatically - * reset (zeroed) when the conversion is ready so if we do this in - * a loop the loop will just go until the conversion is ready. */ - while ( (ADCSRA & _BV(ADSC)) ); - - /* Finally, we return the converted value to the calling function. */ - return ADC; -} - -void uart_init() { - // Upper and lower bytes of the calculated prescaler value for baud. - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - - // Configure data frame size to 8-bits. - UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); - - // Configure to enable transmitter. - UCSR0B = _BV(TXEN0); -} - -void uart_putchar(char c) { - // Wait until the register to write to is free. - loop_until_bit_is_set(UCSR0A, UDRE0); - - // Write the byte to the register. - UDR0 = c; -} - -void uart_putstr(char *data) { - // Loop until end of string writing char by char. - while(*data){ - uart_putchar(*data++); - } -}