Add initial code for the base station
This commit is contained in:
parent
a897a71eac
commit
4e6115560c
223
Makefile
223
Makefile
@ -1,221 +1,10 @@
|
|||||||
# AVR-GCC Makefile template, derived from the WinAVR template (which
|
TARGETS = robot base_station
|
||||||
# is public domain), believed to be neutral to any flavor of "make"
|
|
||||||
# (GNU make, BSD make, SysV make)
|
|
||||||
|
|
||||||
SRC_DIR = src
|
all:
|
||||||
BUILD_DIR = build
|
$(foreach var,$(TARGETS),cd $(var) && make && cd ..;)
|
||||||
INC_DIR = include
|
|
||||||
OBJ_DIR = obj
|
|
||||||
|
|
||||||
MCU = atmega328p
|
debug: $(TARGETS)
|
||||||
FORMAT = ihex
|
$(foreach var,$(TARGETS),cd $(var) && make debug && cd ..;)
|
||||||
TARGET = main
|
|
||||||
SRC = $(wildcard $(SRC_DIR)/*.c)
|
|
||||||
OBJ = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
|
||||||
LST = $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.lst)
|
|
||||||
OPT = s
|
|
||||||
|
|
||||||
# Name of this Makefile (used for "make depend").
|
|
||||||
MAKEFILE = Makefile
|
|
||||||
|
|
||||||
# Debugging format.
|
|
||||||
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
|
||||||
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
|
||||||
DEBUG = stabs
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
|
||||||
# c89 - "ANSI" C
|
|
||||||
# gnu89 - c89 plus GCC extensions
|
|
||||||
# c99 - ISO C99 standard (not yet fully implemented)
|
|
||||||
# gnu99 - c99 plus GCC extensions
|
|
||||||
CSTANDARD = -std=gnu99
|
|
||||||
|
|
||||||
# Place -D or -U options here
|
|
||||||
CDEFS = -DF_CPU=16000000L -D__AVR__ -D__AVR_ATmega328P__
|
|
||||||
|
|
||||||
# Place -I options here
|
|
||||||
CINCS = -I $(INC_DIR)
|
|
||||||
|
|
||||||
CDEBUG = -g$(DEBUG)
|
|
||||||
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
|
||||||
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
|
||||||
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CSTANDARD) $(CEXTRA)
|
|
||||||
|
|
||||||
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
|
||||||
|
|
||||||
ifeq ($(BUILD),debug)
|
|
||||||
CFLAGS += -DDEBUG
|
|
||||||
CFLAGS += -Wall -Wextra -Wformat=2 -Wswitch-default \
|
|
||||||
-Wcast-align -Wpointer-arith -Wbad-function-cast \
|
|
||||||
-Wstrict-prototypes -Winline -Wundef -Wnested-externs \
|
|
||||||
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion \
|
|
||||||
-Winit-self -Wstrict-aliasing -Wmissing-declarations \
|
|
||||||
-Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized \
|
|
||||||
-Wold-style-definition -Wmissing-prototypes -Wunreachable-code \
|
|
||||||
-Wno-unused-but-set-variable -Wmaybe-uninitialized
|
|
||||||
CINCS += -I/usr/include/simavr
|
|
||||||
#
|
|
||||||
endif
|
|
||||||
|
|
||||||
#Additional libraries.
|
|
||||||
|
|
||||||
# Minimalistic printf version
|
|
||||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
|
||||||
|
|
||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
|
||||||
|
|
||||||
PRINTF_LIB =
|
|
||||||
|
|
||||||
# Minimalistic scanf version
|
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
|
||||||
|
|
||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
|
||||||
|
|
||||||
SCANF_LIB =
|
|
||||||
|
|
||||||
MATH_LIB = -lm
|
|
||||||
|
|
||||||
# External memory options
|
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
|
||||||
# used for variables (.data/.bss) and heap (malloc()).
|
|
||||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
|
||||||
|
|
||||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
|
||||||
# only used for heap (malloc()).
|
|
||||||
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
|
|
||||||
|
|
||||||
EXTMEMOPTS =
|
|
||||||
|
|
||||||
#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref
|
|
||||||
LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
|
||||||
|
|
||||||
# Programming support using avrdude. Settings and variables.
|
|
||||||
|
|
||||||
AVRDUDE_PROGRAMMER = usbasp
|
|
||||||
AVRDUDE_PORT = usb
|
|
||||||
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(BUILD_DIR)/$(TARGET).hex
|
|
||||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
|
||||||
|
|
||||||
|
|
||||||
# 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_COUNTER = -y
|
|
||||||
|
|
||||||
# Uncomment the following if you do /not/ wish a verification to be
|
|
||||||
# performed after programming the device.
|
|
||||||
AVRDUDE_NO_VERIFY = -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_VERBOSE = -v -v
|
|
||||||
|
|
||||||
AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
|
||||||
AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) \
|
|
||||||
$(AVRDUDE_ERASE_COUNTER)
|
|
||||||
|
|
||||||
|
|
||||||
CC = avr-gcc
|
|
||||||
OBJCOPY = avr-objcopy
|
|
||||||
OBJDUMP = avr-objdump
|
|
||||||
SIZE = avr-size
|
|
||||||
NM = avr-nm
|
|
||||||
AVRDUDE = avrdude
|
|
||||||
REMOVE = rm -rf
|
|
||||||
MV = mv -f
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
|
||||||
# Add target processor to flags.
|
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
|
||||||
all: build
|
|
||||||
|
|
||||||
build: elf hex eep lss sym
|
|
||||||
|
|
||||||
elf: $(BUILD_DIR)/$(TARGET).elf
|
|
||||||
hex: $(BUILD_DIR)/$(TARGET).hex
|
|
||||||
eep: $(BUILD_DIR)/$(TARGET).eep
|
|
||||||
lss: $(BUILD_DIR)/$(TARGET).lss
|
|
||||||
sym: $(BUILD_DIR)/$(TARGET).sym
|
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
|
||||||
program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
|
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
|
||||||
|
|
||||||
|
|
||||||
debug:
|
|
||||||
make "BUILD=debug"
|
|
||||||
|
|
||||||
|
|
||||||
# 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: $(BUILD_DIR)/$(TARGET).elf
|
|
||||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(BUILD_DIR)/$(TARGET).elf
|
|
||||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES: .elf .hex .eep .lss .sym
|
|
||||||
|
|
||||||
%.hex: %.elf
|
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
|
||||||
|
|
||||||
%.eep: %.elf
|
|
||||||
-$(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
|
|
||||||
$(OBJDUMP) -h -S $< > $@
|
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
|
||||||
%.sym: %.elf
|
|
||||||
$(NM) -n $< > $@
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Link: create ELF output file from object files.
|
|
||||||
.SECONDARY: $(OBJ)
|
|
||||||
$(BUILD_DIR)/%.elf: $(OBJ)
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
|
||||||
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
|
||||||
clean:
|
clean:
|
||||||
$(REMOVE) $(BUILD_DIR)/* $(OBJ_DIR)/*
|
$(foreach var,$(TARGETS),cd $(var) && make clean && cd ..;)
|
||||||
|
|
||||||
depend:
|
|
||||||
if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
|
|
||||||
then \
|
|
||||||
sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
|
|
||||||
$(MAKEFILE).$$$$ && \
|
|
||||||
$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
|
|
||||||
fi
|
|
||||||
echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
|
|
||||||
>> $(MAKEFILE); \
|
|
||||||
$(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) >> $(MAKEFILE)
|
|
||||||
|
|
||||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend
|
|
||||||
|
221
base_station/Makefile
Normal file
221
base_station/Makefile
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
# AVR-GCC Makefile template, derived from the WinAVR template (which
|
||||||
|
# is public domain), believed to be neutral to any flavor of "make"
|
||||||
|
# (GNU make, BSD make, SysV make)
|
||||||
|
|
||||||
|
SRC_DIR = src
|
||||||
|
BUILD_DIR = build
|
||||||
|
INC_DIR = include
|
||||||
|
OBJ_DIR = obj
|
||||||
|
|
||||||
|
MCU = atmega328p
|
||||||
|
FORMAT = ihex
|
||||||
|
TARGET = main
|
||||||
|
SRC = $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
OBJ = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
|
LST = $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.lst)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
# Name of this Makefile (used for "make depend").
|
||||||
|
MAKEFILE = Makefile
|
||||||
|
|
||||||
|
# Debugging format.
|
||||||
|
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
||||||
|
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
||||||
|
DEBUG = stabs
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 - "ANSI" C
|
||||||
|
# gnu89 - c89 plus GCC extensions
|
||||||
|
# c99 - ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 - c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=gnu99
|
||||||
|
|
||||||
|
# Place -D or -U options here
|
||||||
|
CDEFS = -DF_CPU=16000000L -D__AVR__ -D__AVR_ATmega328P__
|
||||||
|
|
||||||
|
# Place -I options here
|
||||||
|
CINCS = -I $(INC_DIR)
|
||||||
|
|
||||||
|
CDEBUG = -g$(DEBUG)
|
||||||
|
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||||
|
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
||||||
|
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CSTANDARD) $(CEXTRA)
|
||||||
|
|
||||||
|
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||||
|
|
||||||
|
ifeq ($(BUILD),debug)
|
||||||
|
CFLAGS += -DDEBUG
|
||||||
|
CFLAGS += -Wall -Wextra -Wformat=2 -Wswitch-default \
|
||||||
|
-Wcast-align -Wpointer-arith -Wbad-function-cast \
|
||||||
|
-Wstrict-prototypes -Winline -Wundef -Wnested-externs \
|
||||||
|
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion \
|
||||||
|
-Winit-self -Wstrict-aliasing -Wmissing-declarations \
|
||||||
|
-Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized \
|
||||||
|
-Wold-style-definition -Wmissing-prototypes -Wunreachable-code \
|
||||||
|
-Wno-unused-but-set-variable -Wmaybe-uninitialized
|
||||||
|
CINCS += -I/usr/include/simavr
|
||||||
|
#
|
||||||
|
endif
|
||||||
|
|
||||||
|
#Additional libraries.
|
||||||
|
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
PRINTF_LIB =
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
SCANF_LIB =
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
# External memory options
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# only used for heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
|
||||||
|
# Programming support using avrdude. Settings and variables.
|
||||||
|
|
||||||
|
AVRDUDE_PROGRAMMER = usbasp
|
||||||
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(BUILD_DIR)/$(TARGET).hex
|
||||||
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
|
# 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_COUNTER = -y
|
||||||
|
|
||||||
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
|
# performed after programming the device.
|
||||||
|
AVRDUDE_NO_VERIFY = -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_VERBOSE = -v -v
|
||||||
|
|
||||||
|
AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) \
|
||||||
|
$(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
CC = avr-gcc
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
OBJDUMP = avr-objdump
|
||||||
|
SIZE = avr-size
|
||||||
|
NM = avr-nm
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
REMOVE = rm -rf
|
||||||
|
MV = mv -f
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: build
|
||||||
|
|
||||||
|
build: elf hex eep lss sym
|
||||||
|
|
||||||
|
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
eep: $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
lss: $(BUILD_DIR)/$(TARGET).lss
|
||||||
|
sym: $(BUILD_DIR)/$(TARGET).sym
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
|
|
||||||
|
debug:
|
||||||
|
make "BUILD=debug"
|
||||||
|
|
||||||
|
|
||||||
|
# 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: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
extcoff: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
.SUFFIXES: .elf .hex .eep .lss .sym
|
||||||
|
|
||||||
|
%.hex: %.elf
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
-$(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
|
||||||
|
$(OBJDUMP) -h -S $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY: $(OBJ)
|
||||||
|
$(BUILD_DIR)/%.elf: $(OBJ)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean:
|
||||||
|
$(REMOVE) $(BUILD_DIR)/* $(OBJ_DIR)/*
|
||||||
|
|
||||||
|
depend:
|
||||||
|
if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
|
||||||
|
then \
|
||||||
|
sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
|
||||||
|
$(MAKEFILE).$$$$ && \
|
||||||
|
$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
|
||||||
|
fi
|
||||||
|
echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
|
||||||
|
>> $(MAKEFILE); \
|
||||||
|
$(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) >> $(MAKEFILE)
|
||||||
|
|
||||||
|
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend
|
6
base_station/include/main.h
Normal file
6
base_station/include/main.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#endif
|
BIN
base_station/obj/led.o
Normal file
BIN
base_station/obj/led.o
Normal file
Binary file not shown.
BIN
base_station/obj/main.o
Normal file
BIN
base_station/obj/main.o
Normal file
Binary file not shown.
BIN
base_station/obj/nrf24.o
Normal file
BIN
base_station/obj/nrf24.o
Normal file
Binary file not shown.
BIN
base_station/obj/radioPinFunctions.o
Normal file
BIN
base_station/obj/radioPinFunctions.o
Normal file
Binary file not shown.
23
base_station/src/main.c
Normal file
23
base_station/src/main.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "led.h"
|
||||||
|
#include "nrf24.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#include "debug.h"
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
init_leds();
|
||||||
|
|
||||||
|
// Use green LED as power LED
|
||||||
|
SET(LED_PORT, LED_GREEN_BIT);
|
||||||
|
|
||||||
|
while (1) { }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
221
robot/Makefile
Normal file
221
robot/Makefile
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
# AVR-GCC Makefile template, derived from the WinAVR template (which
|
||||||
|
# is public domain), believed to be neutral to any flavor of "make"
|
||||||
|
# (GNU make, BSD make, SysV make)
|
||||||
|
|
||||||
|
SRC_DIR = src
|
||||||
|
BUILD_DIR = build
|
||||||
|
INC_DIR = include
|
||||||
|
OBJ_DIR = obj
|
||||||
|
|
||||||
|
MCU = atmega328p
|
||||||
|
FORMAT = ihex
|
||||||
|
TARGET = main
|
||||||
|
SRC = $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
OBJ = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
|
LST = $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.lst)
|
||||||
|
OPT = s
|
||||||
|
|
||||||
|
# Name of this Makefile (used for "make depend").
|
||||||
|
MAKEFILE = Makefile
|
||||||
|
|
||||||
|
# Debugging format.
|
||||||
|
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
||||||
|
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
||||||
|
DEBUG = stabs
|
||||||
|
|
||||||
|
# Compiler flag to set the C Standard level.
|
||||||
|
# c89 - "ANSI" C
|
||||||
|
# gnu89 - c89 plus GCC extensions
|
||||||
|
# c99 - ISO C99 standard (not yet fully implemented)
|
||||||
|
# gnu99 - c99 plus GCC extensions
|
||||||
|
CSTANDARD = -std=gnu99
|
||||||
|
|
||||||
|
# Place -D or -U options here
|
||||||
|
CDEFS = -DF_CPU=16000000L -D__AVR__ -D__AVR_ATmega328P__
|
||||||
|
|
||||||
|
# Place -I options here
|
||||||
|
CINCS = -I $(INC_DIR)
|
||||||
|
|
||||||
|
CDEBUG = -g$(DEBUG)
|
||||||
|
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||||
|
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
||||||
|
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CSTANDARD) $(CEXTRA)
|
||||||
|
|
||||||
|
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||||
|
|
||||||
|
ifeq ($(BUILD),debug)
|
||||||
|
CFLAGS += -DDEBUG
|
||||||
|
CFLAGS += -Wall -Wextra -Wformat=2 -Wswitch-default \
|
||||||
|
-Wcast-align -Wpointer-arith -Wbad-function-cast \
|
||||||
|
-Wstrict-prototypes -Winline -Wundef -Wnested-externs \
|
||||||
|
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion \
|
||||||
|
-Winit-self -Wstrict-aliasing -Wmissing-declarations \
|
||||||
|
-Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized \
|
||||||
|
-Wold-style-definition -Wmissing-prototypes -Wunreachable-code \
|
||||||
|
-Wno-unused-but-set-variable -Wmaybe-uninitialized
|
||||||
|
CINCS += -I/usr/include/simavr
|
||||||
|
#
|
||||||
|
endif
|
||||||
|
|
||||||
|
#Additional libraries.
|
||||||
|
|
||||||
|
# Minimalistic printf version
|
||||||
|
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||||
|
|
||||||
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
|
PRINTF_LIB =
|
||||||
|
|
||||||
|
# Minimalistic scanf version
|
||||||
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
|
|
||||||
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
|
SCANF_LIB =
|
||||||
|
|
||||||
|
MATH_LIB = -lm
|
||||||
|
|
||||||
|
# External memory options
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# used for variables (.data/.bss) and heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||||
|
# only used for heap (malloc()).
|
||||||
|
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
|
||||||
|
|
||||||
|
EXTMEMOPTS =
|
||||||
|
|
||||||
|
#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref
|
||||||
|
LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||||
|
|
||||||
|
# Programming support using avrdude. Settings and variables.
|
||||||
|
|
||||||
|
AVRDUDE_PROGRAMMER = usbasp
|
||||||
|
AVRDUDE_PORT = usb
|
||||||
|
|
||||||
|
AVRDUDE_WRITE_FLASH = -U flash:w:$(BUILD_DIR)/$(TARGET).hex
|
||||||
|
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||||
|
|
||||||
|
|
||||||
|
# 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_COUNTER = -y
|
||||||
|
|
||||||
|
# Uncomment the following if you do /not/ wish a verification to be
|
||||||
|
# performed after programming the device.
|
||||||
|
AVRDUDE_NO_VERIFY = -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_VERBOSE = -v -v
|
||||||
|
|
||||||
|
AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) \
|
||||||
|
$(AVRDUDE_ERASE_COUNTER)
|
||||||
|
|
||||||
|
|
||||||
|
CC = avr-gcc
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
OBJDUMP = avr-objdump
|
||||||
|
SIZE = avr-size
|
||||||
|
NM = avr-nm
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
REMOVE = rm -rf
|
||||||
|
MV = mv -f
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: build
|
||||||
|
|
||||||
|
build: elf hex eep lss sym
|
||||||
|
|
||||||
|
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
eep: $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
lss: $(BUILD_DIR)/$(TARGET).lss
|
||||||
|
sym: $(BUILD_DIR)/$(TARGET).sym
|
||||||
|
|
||||||
|
|
||||||
|
# Program the device.
|
||||||
|
program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
|
|
||||||
|
debug:
|
||||||
|
make "BUILD=debug"
|
||||||
|
|
||||||
|
|
||||||
|
# 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: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
extcoff: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||||
|
|
||||||
|
|
||||||
|
.SUFFIXES: .elf .hex .eep .lss .sym
|
||||||
|
|
||||||
|
%.hex: %.elf
|
||||||
|
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
-$(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
|
||||||
|
$(OBJDUMP) -h -S $< > $@
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY: $(OBJ)
|
||||||
|
$(BUILD_DIR)/%.elf: $(OBJ)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean:
|
||||||
|
$(REMOVE) $(BUILD_DIR)/* $(OBJ_DIR)/*
|
||||||
|
|
||||||
|
depend:
|
||||||
|
if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
|
||||||
|
then \
|
||||||
|
sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
|
||||||
|
$(MAKEFILE).$$$$ && \
|
||||||
|
$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
|
||||||
|
fi
|
||||||
|
echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
|
||||||
|
>> $(MAKEFILE); \
|
||||||
|
$(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) >> $(MAKEFILE)
|
||||||
|
|
||||||
|
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend
|
12
robot/include/common.h
Normal file
12
robot/include/common.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef COMMON_H
|
||||||
|
#define COMMON_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define BIT(mask) (1 << (mask))
|
||||||
|
#define SET(var, mask) ((var) |= (uint8_t)BIT(mask))
|
||||||
|
#define CLR(var, mask) ((var) &= (uint8_t)~(BIT(mask)))
|
||||||
|
#define CHK(var, mask) ((var) & (uint8_t)BIT(mask))
|
||||||
|
#define TOG(var, mask) ((var) ^= (uint8_t)BIT(mask))
|
||||||
|
|
||||||
|
#endif /* COMMON_H */
|
16
robot/include/debug.h
Normal file
16
robot/include/debug.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef DEBUG_H
|
||||||
|
#define DEBUG_H
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/avr_mcu_section.h>
|
||||||
|
|
||||||
|
AVR_MCU(F_CPU, "atmega328p");
|
||||||
|
const struct avr_mmcu_vcd_trace_t _mytrace[] _MMCU_ = {
|
||||||
|
{ AVR_MCU_VCD_SYMBOL("DDRD"), .what = (void *) &DDRD, },
|
||||||
|
{ AVR_MCU_VCD_SYMBOL("TCCR0A"), .what = (void *) &TCCR0A, },
|
||||||
|
{ AVR_MCU_VCD_SYMBOL("TCCR0B"), .what = (void *) &TCCR0B, },
|
||||||
|
{ AVR_MCU_VCD_SYMBOL("OCR0A"), .what = (void *) &OCR0A, },
|
||||||
|
{ AVR_MCU_VCD_SYMBOL("OCR0B"), .what = (void *) &OCR0B, },
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DEBUG_H */
|
11
robot/include/led.h
Normal file
11
robot/include/led.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef LED_H
|
||||||
|
#define LED_H
|
||||||
|
|
||||||
|
#define LED_DDR DDRD
|
||||||
|
#define LED_PORT PORTD
|
||||||
|
#define LED_GREEN_BIT PD3
|
||||||
|
#define LED_BLUE_BIT PD4
|
||||||
|
|
||||||
|
void init_leds(void);
|
||||||
|
|
||||||
|
#endif /* LED_H */
|
130
robot/include/nRF24L01.h
Normal file
130
robot/include/nRF24L01.h
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2007 Stefan Engelke <mbox@stefanengelke.de>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use, copy,
|
||||||
|
modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory Map */
|
||||||
|
#define CONFIG 0x00
|
||||||
|
#define EN_AA 0x01
|
||||||
|
#define EN_RXADDR 0x02
|
||||||
|
#define SETUP_AW 0x03
|
||||||
|
#define SETUP_RETR 0x04
|
||||||
|
#define RF_CH 0x05
|
||||||
|
#define RF_SETUP 0x06
|
||||||
|
#define STATUS 0x07
|
||||||
|
#define OBSERVE_TX 0x08
|
||||||
|
#define CD 0x09
|
||||||
|
#define RX_ADDR_P0 0x0A
|
||||||
|
#define RX_ADDR_P1 0x0B
|
||||||
|
#define RX_ADDR_P2 0x0C
|
||||||
|
#define RX_ADDR_P3 0x0D
|
||||||
|
#define RX_ADDR_P4 0x0E
|
||||||
|
#define RX_ADDR_P5 0x0F
|
||||||
|
#define TX_ADDR 0x10
|
||||||
|
#define RX_PW_P0 0x11
|
||||||
|
#define RX_PW_P1 0x12
|
||||||
|
#define RX_PW_P2 0x13
|
||||||
|
#define RX_PW_P3 0x14
|
||||||
|
#define RX_PW_P4 0x15
|
||||||
|
#define RX_PW_P5 0x16
|
||||||
|
#define FIFO_STATUS 0x17
|
||||||
|
#define DYNPD 0x1C
|
||||||
|
|
||||||
|
/* Bit Mnemonics */
|
||||||
|
|
||||||
|
/* configuratio nregister */
|
||||||
|
#define MASK_RX_DR 6
|
||||||
|
#define MASK_TX_DS 5
|
||||||
|
#define MASK_MAX_RT 4
|
||||||
|
#define EN_CRC 3
|
||||||
|
#define CRCO 2
|
||||||
|
#define PWR_UP 1
|
||||||
|
#define PRIM_RX 0
|
||||||
|
|
||||||
|
/* enable auto acknowledgment */
|
||||||
|
#define ENAA_P5 5
|
||||||
|
#define ENAA_P4 4
|
||||||
|
#define ENAA_P3 3
|
||||||
|
#define ENAA_P2 2
|
||||||
|
#define ENAA_P1 1
|
||||||
|
#define ENAA_P0 0
|
||||||
|
|
||||||
|
/* enable rx addresses */
|
||||||
|
#define ERX_P5 5
|
||||||
|
#define ERX_P4 4
|
||||||
|
#define ERX_P3 3
|
||||||
|
#define ERX_P2 2
|
||||||
|
#define ERX_P1 1
|
||||||
|
#define ERX_P0 0
|
||||||
|
|
||||||
|
/* setup of address width */
|
||||||
|
#define AW 0 /* 2 bits */
|
||||||
|
|
||||||
|
/* setup of auto re-transmission */
|
||||||
|
#define ARD 4 /* 4 bits */
|
||||||
|
#define ARC 0 /* 4 bits */
|
||||||
|
|
||||||
|
/* RF setup register */
|
||||||
|
#define PLL_LOCK 4
|
||||||
|
#define RF_DR 3
|
||||||
|
#define RF_PWR 1 /* 2 bits */
|
||||||
|
|
||||||
|
/* general status register */
|
||||||
|
#define RX_DR 6
|
||||||
|
#define TX_DS 5
|
||||||
|
#define MAX_RT 4
|
||||||
|
#define RX_P_NO 1 /* 3 bits */
|
||||||
|
#define TX_FULL 0
|
||||||
|
|
||||||
|
/* transmit observe register */
|
||||||
|
#define PLOS_CNT 4 /* 4 bits */
|
||||||
|
#define ARC_CNT 0 /* 4 bits */
|
||||||
|
|
||||||
|
/* fifo status */
|
||||||
|
#define TX_REUSE 6
|
||||||
|
#define FIFO_FULL 5
|
||||||
|
#define TX_EMPTY 4
|
||||||
|
#define RX_FULL 1
|
||||||
|
#define RX_EMPTY 0
|
||||||
|
|
||||||
|
/* dynamic length */
|
||||||
|
#define DPL_P0 0
|
||||||
|
#define DPL_P1 1
|
||||||
|
#define DPL_P2 2
|
||||||
|
#define DPL_P3 3
|
||||||
|
#define DPL_P4 4
|
||||||
|
#define DPL_P5 5
|
||||||
|
|
||||||
|
/* Instruction Mnemonics */
|
||||||
|
#define R_REGISTER 0x00 /* last 4 bits will indicate reg. address */
|
||||||
|
#define W_REGISTER 0x20 /* last 4 bits will indicate reg. address */
|
||||||
|
#define REGISTER_MASK 0x1F
|
||||||
|
#define R_RX_PAYLOAD 0x61
|
||||||
|
#define W_TX_PAYLOAD 0xA0
|
||||||
|
#define FLUSH_TX 0xE1
|
||||||
|
#define FLUSH_RX 0xE2
|
||||||
|
#define REUSE_TX_PL 0xE3
|
||||||
|
#define ACTIVATE 0x50
|
||||||
|
#define R_RX_PL_WID 0x60
|
||||||
|
#define NOP 0xFF
|
116
robot/include/nrf24.h
Normal file
116
robot/include/nrf24.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* “THE COFFEEWARE LICENSE” (Revision 1):
|
||||||
|
* <ihsan@kehribar.me> wrote this file. As long as you retain this notice you
|
||||||
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||||
|
* this stuff is worth it, you can buy me a coffee in return.
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
* This library is based on this library:
|
||||||
|
* https://github.com/aaronds/arduino-nrf24l01
|
||||||
|
* Which is based on this library:
|
||||||
|
* http://www.tinkerer.eu/AVRLib/nRF24L01
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#ifndef NRF24
|
||||||
|
#define NRF24
|
||||||
|
|
||||||
|
#include "nRF24L01.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define LOW 0
|
||||||
|
#define HIGH 1
|
||||||
|
|
||||||
|
#define nrf24_ADDR_LEN 5
|
||||||
|
#define nrf24_CONFIG ((1<<EN_CRC)|(0<<CRCO))
|
||||||
|
|
||||||
|
#define NRF24_TRANSMISSON_OK 0
|
||||||
|
#define NRF24_MESSAGE_LOST 1
|
||||||
|
|
||||||
|
/* adjustment functions */
|
||||||
|
void nrf24_init();
|
||||||
|
void nrf24_rx_address(uint8_t *adr);
|
||||||
|
void nrf24_tx_address(uint8_t *adr);
|
||||||
|
void nrf24_config(uint8_t channel, uint8_t pay_length);
|
||||||
|
|
||||||
|
/* state check functions */
|
||||||
|
uint8_t nrf24_dataReady();
|
||||||
|
uint8_t nrf24_isSending();
|
||||||
|
uint8_t nrf24_getStatus();
|
||||||
|
uint8_t nrf24_rxFifoEmpty();
|
||||||
|
|
||||||
|
/* core TX / RX functions */
|
||||||
|
void nrf24_send(uint8_t *value);
|
||||||
|
void nrf24_getData(uint8_t *data);
|
||||||
|
|
||||||
|
/* use in dynamic length mode */
|
||||||
|
uint8_t nrf24_payloadLength();
|
||||||
|
|
||||||
|
/* post transmission analysis */
|
||||||
|
uint8_t nrf24_lastMessageStatus();
|
||||||
|
uint8_t nrf24_retransmissionCount();
|
||||||
|
|
||||||
|
/* Returns the payload length */
|
||||||
|
uint8_t nrf24_payload_length();
|
||||||
|
|
||||||
|
/* power management */
|
||||||
|
void nrf24_powerUpRx();
|
||||||
|
void nrf24_powerUpTx();
|
||||||
|
void nrf24_powerDown();
|
||||||
|
|
||||||
|
/* low level interface ... */
|
||||||
|
uint8_t spi_transfer(uint8_t tx);
|
||||||
|
void nrf24_transmitSync(uint8_t *dataout, uint8_t len);
|
||||||
|
void nrf24_transferSync(uint8_t *dataout, uint8_t *datain, uint8_t len);
|
||||||
|
void nrf24_configRegister(uint8_t reg, uint8_t value);
|
||||||
|
void nrf24_readRegister(uint8_t reg, uint8_t *value, uint8_t len);
|
||||||
|
void nrf24_writeRegister(uint8_t reg, uint8_t *value, uint8_t len);
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* You should implement the platform spesific functions in your code */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* In this function you should do the following things:
|
||||||
|
* - Set MISO pin input
|
||||||
|
* - Set MOSI pin output
|
||||||
|
* - Set SCK pin output
|
||||||
|
* - Set CSN pin output
|
||||||
|
* - Set CE pin output */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern void nrf24_setupPins();
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* nrf24 CE pin control function
|
||||||
|
* - state:1 => Pin HIGH
|
||||||
|
* - state:0 => Pin LOW */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern void nrf24_ce_digitalWrite(uint8_t state);
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* nrf24 CE pin control function
|
||||||
|
* - state:1 => Pin HIGH
|
||||||
|
* - state:0 => Pin LOW */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern void nrf24_csn_digitalWrite(uint8_t state);
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* nrf24 SCK pin control function
|
||||||
|
* - state:1 => Pin HIGH
|
||||||
|
* - state:0 => Pin LOW */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern void nrf24_sck_digitalWrite(uint8_t state);
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* nrf24 MOSI pin control function
|
||||||
|
* - state:1 => Pin HIGH
|
||||||
|
* - state:0 => Pin LOW */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern void nrf24_mosi_digitalWrite(uint8_t state);
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* nrf24 MISO pin read function
|
||||||
|
* - returns: Non-zero if the pin is high */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
extern uint8_t nrf24_miso_digitalRead();
|
||||||
|
|
||||||
|
#endif
|
@ -9,10 +9,13 @@
|
|||||||
|
|
||||||
#define SERVO_MIN 930 // (us). Go backwards
|
#define SERVO_MIN 930 // (us). Go backwards
|
||||||
#define SERVO_MAX 1930 // (us). Go forwards
|
#define SERVO_MAX 1930 // (us). Go forwards
|
||||||
#define SERVO_MID (SERVO_MIN + SERVO_MAX) / 2 // Stop
|
#define SERVO_MID (SERVO_MIN + SERVO_MAX) / 2 // (us). Stop
|
||||||
#define PWM_PERIOD 16384 // (1000000 / F_CPU) * PRESCALER * 256) / F_CPU (us)
|
|
||||||
|
|
||||||
#define US2TIMER0(us) (255 * (uint32_t)us) / PWM_PERIOD
|
#define PRESCALER 1024L
|
||||||
|
#define PWM_CLOCK F_CPU / (256 * PRESCALER)
|
||||||
|
#define PWM_PERIOD_US 1000000 / PWM_CLOCK
|
||||||
|
|
||||||
|
#define US2TIMER0(us) (255 * (uint32_t)us) / PWM_PERIOD_US
|
||||||
|
|
||||||
|
|
||||||
void init_servos(void);
|
void init_servos(void);
|
9
robot/src/led.c
Normal file
9
robot/src/led.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
void init_leds(void)
|
||||||
|
{
|
||||||
|
SET(LED_DDR, LED_GREEN_BIT);
|
||||||
|
SET(LED_DDR, LED_BLUE_BIT);
|
||||||
|
}
|
@ -37,7 +37,7 @@ int main(void)
|
|||||||
// Use green LED as power LED
|
// Use green LED as power LED
|
||||||
SET(LED_PORT, LED_GREEN_BIT);
|
SET(LED_PORT, LED_GREEN_BIT);
|
||||||
|
|
||||||
/* run_servos(); */
|
run_servos();
|
||||||
/* read_temp(); */
|
/* read_temp(); */
|
||||||
while (1) {
|
while (1) {
|
||||||
uint16_t distance_int_cm = read_sonar();
|
uint16_t distance_int_cm = read_sonar();
|
339
robot/src/nrf24.c
Normal file
339
robot/src/nrf24.c
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* “THE COFFEEWARE LICENSE” (Revision 1):
|
||||||
|
* <ihsan@kehribar.me> wrote this file. As long as you retain this notice you
|
||||||
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||||
|
* this stuff is worth it, you can buy me a coffee in return.
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
* This library is based on this library:
|
||||||
|
* https://github.com/aaronds/arduino-nrf24l01
|
||||||
|
* Which is based on this library:
|
||||||
|
* http://www.tinkerer.eu/AVRLib/nRF24L01
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#include "nrf24.h"
|
||||||
|
|
||||||
|
uint8_t payload_len;
|
||||||
|
|
||||||
|
/* init the hardware pins */
|
||||||
|
void nrf24_init()
|
||||||
|
{
|
||||||
|
nrf24_setupPins();
|
||||||
|
nrf24_ce_digitalWrite(LOW);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* configure the module */
|
||||||
|
void nrf24_config(uint8_t channel, uint8_t pay_length)
|
||||||
|
{
|
||||||
|
/* Use static payload length ... */
|
||||||
|
payload_len = pay_length;
|
||||||
|
|
||||||
|
// Set RF channel
|
||||||
|
nrf24_configRegister(RF_CH, channel);
|
||||||
|
|
||||||
|
// Set length of incoming payload
|
||||||
|
nrf24_configRegister(RX_PW_P0, 0x00); // Auto-ACK pipe ...
|
||||||
|
nrf24_configRegister(RX_PW_P1, payload_len); // Data payload pipe
|
||||||
|
nrf24_configRegister(RX_PW_P2, 0x00); // Pipe not used
|
||||||
|
nrf24_configRegister(RX_PW_P3, 0x00); // Pipe not used
|
||||||
|
nrf24_configRegister(RX_PW_P4, 0x00); // Pipe not used
|
||||||
|
nrf24_configRegister(RX_PW_P5, 0x00); // Pipe not used
|
||||||
|
|
||||||
|
// 1 Mbps, TX gain: 0dbm
|
||||||
|
nrf24_configRegister(RF_SETUP, (0 << RF_DR) | ((0x03) << RF_PWR));
|
||||||
|
|
||||||
|
// CRC enable, 1 byte CRC length
|
||||||
|
nrf24_configRegister(CONFIG, nrf24_CONFIG);
|
||||||
|
|
||||||
|
// Auto Acknowledgment
|
||||||
|
nrf24_configRegister(EN_AA, (1 << ENAA_P0) | (1 << ENAA_P1) | (0 << ENAA_P2) | (0 << ENAA_P3) | (0 << ENAA_P4) | (0 << ENAA_P5));
|
||||||
|
|
||||||
|
// Enable RX addresses
|
||||||
|
nrf24_configRegister(EN_RXADDR, (1 << ERX_P0) | (1 << ERX_P1) | (0 << ERX_P2) | (0 << ERX_P3) | (0 << ERX_P4) | (0 << ERX_P5));
|
||||||
|
|
||||||
|
// Auto retransmit delay: 1000 us and Up to 15 retransmit trials
|
||||||
|
nrf24_configRegister(SETUP_RETR, (0x04 << ARD) | (0x0F << ARC));
|
||||||
|
|
||||||
|
// Dynamic length configurations: No dynamic length
|
||||||
|
nrf24_configRegister(DYNPD, (0 << DPL_P0) | (0 << DPL_P1) | (0 << DPL_P2) | (0 << DPL_P3) | (0 << DPL_P4) | (0 << DPL_P5));
|
||||||
|
|
||||||
|
// Start listening
|
||||||
|
nrf24_powerUpRx();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the RX address */
|
||||||
|
void nrf24_rx_address(uint8_t *adr)
|
||||||
|
{
|
||||||
|
nrf24_ce_digitalWrite(LOW);
|
||||||
|
nrf24_writeRegister(RX_ADDR_P1, adr, nrf24_ADDR_LEN);
|
||||||
|
nrf24_ce_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the payload length */
|
||||||
|
uint8_t nrf24_payload_length()
|
||||||
|
{
|
||||||
|
return payload_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the TX address */
|
||||||
|
void nrf24_tx_address(uint8_t *adr)
|
||||||
|
{
|
||||||
|
/* RX_ADDR_P0 must be set to the sending addr for auto ack to work. */
|
||||||
|
nrf24_writeRegister(RX_ADDR_P0, adr, nrf24_ADDR_LEN);
|
||||||
|
nrf24_writeRegister(TX_ADDR, adr, nrf24_ADDR_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks if data is available for reading */
|
||||||
|
/* Returns 1 if data is ready ... */
|
||||||
|
uint8_t nrf24_dataReady()
|
||||||
|
{
|
||||||
|
// See note in getData() function - just checking RX_DR isn't good enough
|
||||||
|
uint8_t status = nrf24_getStatus();
|
||||||
|
|
||||||
|
// We can short circuit on RX_DR, but if it's not set, we still need
|
||||||
|
// to check the FIFO for any pending packets
|
||||||
|
if (status & (1 << RX_DR)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !nrf24_rxFifoEmpty();;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks if receive FIFO is empty or not */
|
||||||
|
uint8_t nrf24_rxFifoEmpty()
|
||||||
|
{
|
||||||
|
uint8_t fifoStatus;
|
||||||
|
|
||||||
|
nrf24_readRegister(FIFO_STATUS, &fifoStatus, 1);
|
||||||
|
|
||||||
|
return (fifoStatus & (1 << RX_EMPTY));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the length of data waiting in the RX fifo */
|
||||||
|
uint8_t nrf24_payloadLength()
|
||||||
|
{
|
||||||
|
uint8_t status;
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
spi_transfer(R_RX_PL_WID);
|
||||||
|
status = spi_transfer(0x00);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reads payload bytes into data array */
|
||||||
|
void nrf24_getData(uint8_t *data)
|
||||||
|
{
|
||||||
|
/* Pull down chip select */
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
|
||||||
|
/* Send cmd to read rx payload */
|
||||||
|
spi_transfer(R_RX_PAYLOAD);
|
||||||
|
|
||||||
|
/* Read payload */
|
||||||
|
nrf24_transferSync(data, data, payload_len);
|
||||||
|
|
||||||
|
/* Pull up chip select */
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
|
||||||
|
/* Reset status register */
|
||||||
|
nrf24_configRegister(STATUS, (1 << RX_DR));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the number of retransmissions occured for the last message */
|
||||||
|
uint8_t nrf24_retransmissionCount()
|
||||||
|
{
|
||||||
|
uint8_t rv;
|
||||||
|
nrf24_readRegister(OBSERVE_TX, &rv, 1);
|
||||||
|
rv = rv & 0x0F;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sends a data package to the default address. Be sure to send the correct
|
||||||
|
// amount of bytes as configured as payload on the receiver.
|
||||||
|
void nrf24_send(uint8_t *value)
|
||||||
|
{
|
||||||
|
/* Go to Standby-I first */
|
||||||
|
nrf24_ce_digitalWrite(LOW);
|
||||||
|
|
||||||
|
/* Set to transmitter mode , Power up if needed */
|
||||||
|
nrf24_powerUpTx();
|
||||||
|
|
||||||
|
/* Do we really need to flush TX fifo each time ? */
|
||||||
|
#if 1
|
||||||
|
/* Pull down chip select */
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
|
||||||
|
/* Write cmd to flush transmit FIFO */
|
||||||
|
spi_transfer(FLUSH_TX);
|
||||||
|
|
||||||
|
/* Pull up chip select */
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Pull down chip select */
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
|
||||||
|
/* Write cmd to write payload */
|
||||||
|
spi_transfer(W_TX_PAYLOAD);
|
||||||
|
|
||||||
|
/* Write payload */
|
||||||
|
nrf24_transmitSync(value, payload_len);
|
||||||
|
|
||||||
|
/* Pull up chip select */
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
|
||||||
|
/* Start the transmission */
|
||||||
|
nrf24_ce_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t nrf24_isSending()
|
||||||
|
{
|
||||||
|
uint8_t status;
|
||||||
|
|
||||||
|
/* read the current status */
|
||||||
|
status = nrf24_getStatus();
|
||||||
|
|
||||||
|
/* if sending successful (TX_DS) or max retries exceded (MAX_RT). */
|
||||||
|
if ((status & ((1 << TX_DS) | (1 << MAX_RT)))) {
|
||||||
|
return 0; /* false */
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; /* true */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t nrf24_getStatus()
|
||||||
|
{
|
||||||
|
uint8_t rv;
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
rv = spi_transfer(NOP);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t nrf24_lastMessageStatus()
|
||||||
|
{
|
||||||
|
uint8_t rv;
|
||||||
|
|
||||||
|
rv = nrf24_getStatus();
|
||||||
|
|
||||||
|
/* Transmission went OK */
|
||||||
|
if ((rv & ((1 << TX_DS)))) {
|
||||||
|
return NRF24_TRANSMISSON_OK;
|
||||||
|
}
|
||||||
|
/* Maximum retransmission count is reached */
|
||||||
|
/* Last message probably went missing ... */
|
||||||
|
else if ((rv & ((1 << MAX_RT)))) {
|
||||||
|
return NRF24_MESSAGE_LOST;
|
||||||
|
}
|
||||||
|
/* Probably still sending ... */
|
||||||
|
else {
|
||||||
|
return 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void nrf24_powerUpRx()
|
||||||
|
{
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
spi_transfer(FLUSH_RX);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
|
||||||
|
nrf24_configRegister(STATUS, (1 << RX_DR) | (1 << TX_DS) | (1 << MAX_RT));
|
||||||
|
|
||||||
|
nrf24_ce_digitalWrite(LOW);
|
||||||
|
nrf24_configRegister(CONFIG, nrf24_CONFIG | ((1 << PWR_UP) | (1 << PRIM_RX)));
|
||||||
|
nrf24_ce_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nrf24_powerUpTx()
|
||||||
|
{
|
||||||
|
nrf24_configRegister(STATUS, (1 << RX_DR) | (1 << TX_DS) | (1 << MAX_RT));
|
||||||
|
|
||||||
|
nrf24_configRegister(CONFIG, nrf24_CONFIG | ((1 << PWR_UP) | (0 << PRIM_RX)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void nrf24_powerDown()
|
||||||
|
{
|
||||||
|
nrf24_ce_digitalWrite(LOW);
|
||||||
|
nrf24_configRegister(CONFIG, nrf24_CONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* software spi routine */
|
||||||
|
uint8_t spi_transfer(uint8_t tx)
|
||||||
|
{
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t rx = 0;
|
||||||
|
|
||||||
|
nrf24_sck_digitalWrite(LOW);
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
|
||||||
|
if (tx & (1 << (7 - i))) {
|
||||||
|
nrf24_mosi_digitalWrite(HIGH);
|
||||||
|
} else {
|
||||||
|
nrf24_mosi_digitalWrite(LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
nrf24_sck_digitalWrite(HIGH);
|
||||||
|
|
||||||
|
rx = rx << 1;
|
||||||
|
if (nrf24_miso_digitalRead()) {
|
||||||
|
rx |= 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
nrf24_sck_digitalWrite(LOW);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return rx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send and receive multiple bytes over SPI */
|
||||||
|
void nrf24_transferSync(uint8_t *dataout, uint8_t *datain, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
datain[i] = spi_transfer(dataout[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send multiple bytes over SPI */
|
||||||
|
void nrf24_transmitSync(uint8_t *dataout, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
spi_transfer(dataout[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clocks only one byte into the given nrf24 register */
|
||||||
|
void nrf24_configRegister(uint8_t reg, uint8_t value)
|
||||||
|
{
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
spi_transfer(W_REGISTER | (REGISTER_MASK & reg));
|
||||||
|
spi_transfer(value);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read single register from nrf24 */
|
||||||
|
void nrf24_readRegister(uint8_t reg, uint8_t *value, uint8_t len)
|
||||||
|
{
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
spi_transfer(R_REGISTER | (REGISTER_MASK & reg));
|
||||||
|
nrf24_transferSync(value, value, len);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write to a single register of nrf24 */
|
||||||
|
void nrf24_writeRegister(uint8_t reg, uint8_t *value, uint8_t len)
|
||||||
|
{
|
||||||
|
nrf24_csn_digitalWrite(LOW);
|
||||||
|
spi_transfer(W_REGISTER | (REGISTER_MASK & reg));
|
||||||
|
nrf24_transmitSync(value, len);
|
||||||
|
nrf24_csn_digitalWrite(HIGH);
|
||||||
|
}
|
74
robot/src/radioPinFunctions.c
Normal file
74
robot/src/radioPinFunctions.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* “THE COFFEEWARE LICENSE” (Revision 1):
|
||||||
|
* <ihsan@kehribar.me> wrote this file. As long as you retain this notice you
|
||||||
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||||
|
* this stuff is worth it, you can buy me a coffee in return.
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
* Please define your platform spesific functions in this file ...
|
||||||
|
* -----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define REG DDRB
|
||||||
|
#define PORT PORTB
|
||||||
|
#define PIN PINB
|
||||||
|
#define PIN_CE PB0
|
||||||
|
#define PIN_CSN PB1
|
||||||
|
#define PIN_SCK PB5
|
||||||
|
#define PIN_MOSI PB3
|
||||||
|
#define PIN_MISO PB4
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
void nrf24_setupPins(void)
|
||||||
|
{
|
||||||
|
SET(REG, PIN_CE);
|
||||||
|
SET(REG, PIN_CSN);
|
||||||
|
SET(REG, PIN_SCK);
|
||||||
|
SET(REG, PIN_MOSI);
|
||||||
|
CLR(REG, PIN_MISO);
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
void nrf24_ce_digitalWrite(uint8_t state)
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
SET(PORT, PIN_CE);
|
||||||
|
} else {
|
||||||
|
CLR(PORT, PIN_CE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
void nrf24_csn_digitalWrite(uint8_t state)
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
SET(PORT, PIN_CSN);
|
||||||
|
} else {
|
||||||
|
CLR(PORT, PIN_CSN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
void nrf24_sck_digitalWrite(uint8_t state)
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
SET(PORT, PIN_SCK);
|
||||||
|
} else {
|
||||||
|
CLR(PORT, PIN_SCK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
void nrf24_mosi_digitalWrite(uint8_t state)
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
SET(PORT, PIN_MOSI);
|
||||||
|
} else {
|
||||||
|
CLR(PORT, PIN_MOSI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
uint8_t nrf24_miso_digitalRead(void)
|
||||||
|
{
|
||||||
|
return CHK(PIN, PIN_MISO);
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------- */
|
@ -15,9 +15,9 @@ void init_servos(void)
|
|||||||
SET(TCCR0A, WGM00);
|
SET(TCCR0A, WGM00);
|
||||||
SET(TCCR0A, WGM01);
|
SET(TCCR0A, WGM01);
|
||||||
|
|
||||||
// Prescaler. clkPWM = clkIO / 64
|
// Prescaler = 1024
|
||||||
SET(TCCR0B, CS00);
|
SET(TCCR0B, CS00);
|
||||||
SET(TCCR0B, CS01);
|
SET(TCCR0B, CS02);
|
||||||
}
|
}
|
||||||
|
|
||||||
void run_servos(void)
|
void run_servos(void)
|
@ -5,7 +5,7 @@
|
|||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
volatile uint32_t trig_counter;
|
volatile uint32_t trig_counter;
|
||||||
volatile uint32_t no_of_ticks;
|
uint32_t no_of_ticks;
|
||||||
|
|
||||||
void init_sonar(void)
|
void init_sonar(void)
|
||||||
{
|
{
|
||||||
@ -36,19 +36,15 @@ uint16_t read_sonar(void)
|
|||||||
sei();
|
sei();
|
||||||
// Count cycles until ECHO goes low
|
// Count cycles until ECHO goes low
|
||||||
while (CHK(ECHO_PIN, ECHO_BIT)) {
|
while (CHK(ECHO_PIN, ECHO_BIT)) {
|
||||||
if (no_of_ticks + TCNT1 > SONAR_TIMEOUT) {
|
++no_of_ticks;
|
||||||
|
if (no_of_ticks > SONAR_TIMEOUT) {
|
||||||
return SONAR_ERROR;
|
return SONAR_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TCCR1B = 0x00;
|
TCCR1B = 0x00;
|
||||||
cli();
|
cli();
|
||||||
|
|
||||||
no_of_ticks += TCNT1;
|
|
||||||
|
|
||||||
return (uint16_t)(no_of_ticks / (CYCLES_PER_US * 58));
|
return (uint16_t)(no_of_ticks / (CYCLES_PER_US * 58));
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(TIMER1_OVF_vect)
|
|
||||||
{
|
|
||||||
no_of_ticks += TIMER_MAX;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user