From 0f2b6c2e307650bf47f9d226e57344a84d3cb0ea Mon Sep 17 00:00:00 2001 From: Max Braungardt Date: Tue, 27 Mar 2018 01:59:25 +0200 Subject: [PATCH] Added pendulum --- sketches/pendulum/.dep/color_hsv.o.d | 3 + sketches/pendulum/.dep/pendulum.o.d | 3 + sketches/pendulum/Makefile | 621 +++++++++ sketches/pendulum/Makefile_old | 31 + sketches/pendulum/color_hsv.c | 62 + sketches/pendulum/color_hsv.h | 26 + sketches/pendulum/color_hsv.lst | 662 +++++++++ sketches/pendulum/color_hsv.o | Bin 0 -> 8484 bytes sketches/pendulum/pendulum.c | 228 +++ sketches/pendulum/pendulum.eep | 1 + sketches/pendulum/pendulum.elf | Bin 0 -> 15764 bytes sketches/pendulum/pendulum.hex | 216 +++ sketches/pendulum/pendulum.lss | 1929 ++++++++++++++++++++++++++ sketches/pendulum/pendulum.lst | 1078 ++++++++++++++ sketches/pendulum/pendulum.map | 772 +++++++++++ sketches/pendulum/pendulum.o | Bin 0 -> 11412 bytes sketches/pendulum/pendulum.sym | 109 ++ 17 files changed, 5741 insertions(+) create mode 100644 sketches/pendulum/.dep/color_hsv.o.d create mode 100644 sketches/pendulum/.dep/pendulum.o.d create mode 100644 sketches/pendulum/Makefile create mode 100644 sketches/pendulum/Makefile_old create mode 100644 sketches/pendulum/color_hsv.c create mode 100644 sketches/pendulum/color_hsv.h create mode 100644 sketches/pendulum/color_hsv.lst create mode 100644 sketches/pendulum/color_hsv.o create mode 100644 sketches/pendulum/pendulum.c create mode 100644 sketches/pendulum/pendulum.eep create mode 100755 sketches/pendulum/pendulum.elf create mode 100644 sketches/pendulum/pendulum.hex create mode 100644 sketches/pendulum/pendulum.lss create mode 100644 sketches/pendulum/pendulum.lst create mode 100644 sketches/pendulum/pendulum.map create mode 100644 sketches/pendulum/pendulum.o create mode 100644 sketches/pendulum/pendulum.sym diff --git a/sketches/pendulum/.dep/color_hsv.o.d b/sketches/pendulum/.dep/color_hsv.o.d new file mode 100644 index 0000000..a89a8ee --- /dev/null +++ b/sketches/pendulum/.dep/color_hsv.o.d @@ -0,0 +1,3 @@ +color_hsv.o: color_hsv.c color_hsv.h + +color_hsv.h: diff --git a/sketches/pendulum/.dep/pendulum.o.d b/sketches/pendulum/.dep/pendulum.o.d new file mode 100644 index 0000000..45ae2d3 --- /dev/null +++ b/sketches/pendulum/.dep/pendulum.o.d @@ -0,0 +1,3 @@ +pendulum.o: pendulum.c color_hsv.h + +color_hsv.h: diff --git a/sketches/pendulum/Makefile b/sketches/pendulum/Makefile new file mode 100644 index 0000000..8a7d1de --- /dev/null +++ b/sketches/pendulum/Makefile @@ -0,0 +1,621 @@ +# $ cat ~/windows/Makefile.glove +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, J�rg Wunsch, et al. +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = atmega328p + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# Typical values are: +# F_CPU = 1000000 +# F_CPU = 1843200 +# F_CPU = 2000000 +# F_CPU = 3686400 +# F_CPU = 4000000 +# F_CPU = 7372800 +# F_CPU = 8000000 +# F_CPU = 11059200 +# F_CPU = 14745600 +# F_CPU = 16000000 +# F_CPU = 18432000 +# F_CPU = 20000000 +F_CPU = 20000000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = pendulum + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# List C source files here. (C dependencies are automatically generated.) +SRC = ${wildcard *.c} + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# 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 = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = + + +# 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=c11 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: 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] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# 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 + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# 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 + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -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 +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500v2 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(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 +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# 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 C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# 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) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --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 + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + + +flash: pendulum.hex + avrdude -p $(MCU) -c arduino -B 115200 -P /dev/ttyACM0 -v -v -e -Uflash:w:pendulum.hex:a + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program debug gdb-config diff --git a/sketches/pendulum/Makefile_old b/sketches/pendulum/Makefile_old new file mode 100644 index 0000000..2ffa115 --- /dev/null +++ b/sketches/pendulum/Makefile_old @@ -0,0 +1,31 @@ +CFLAGS = -Os -Wall --std=c11 -g +CHIP = atmega328p +SOURCE_FILES = ${wildcard *.c} +OBJ_FILES = $(SOURCE_FILES:%.c=%.o) +BIN = pendulum.bin +HEX = pendulum.hex +ASM = pendulum.asm + +default: $(HEX) + +%.o: %.c + avr-gcc $(CFLAGS) -mmcu=$(CHIP) -o $@ $< + +$(BIN): $(OBJ_FILES) + avr-gcc $(CFLAGS) -o $@ $^ + +$(ASM): $(BIN) + avr-objdump -d -g -l -S $^ > $@ + +$(HEX): $(BIN) + avr-objcopy -O ihex -j .text -j .data $^ $@ + +asm: $(ASM) + +flash: $(HEX) + avrdude -p $(CHIP) -c arduino -B 115200 -P /dev/ttyACM0 -v -v -e -Uflash:w:$(HEX):a + +clean: + $(RM) $(OBJ_FILES) $(BIN) $(HEX) $(ASM) + + diff --git a/sketches/pendulum/color_hsv.c b/sketches/pendulum/color_hsv.c new file mode 100644 index 0000000..bdd1228 --- /dev/null +++ b/sketches/pendulum/color_hsv.c @@ -0,0 +1,62 @@ +#include "color_hsv.h" + +void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors) { + if( steps == 1 ) { + colors[0] = start; + return; + } + + for( size_t i = 0; i < steps; i++ ) { + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + colors[i] = tmp; + } +} + +void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count) { + for(size_t i = 0; i < count; ++i) { + rgbList[i] = hsv2rgb(&hsvList[i]); + } +} + +rgb_t hsv2rgb(hsv_t* hsv) { + rgb_t res; + + if(hsv->sat == 0) { + res.r = res.g = res.b = hsv->val; + } else { + float hue = (float) (hsv->hue<360?hsv->hue:hsv->hue-360); + float val = ((float) hsv->val ) / 100.0; + float sat = ((float) hsv->sat ) / 100.0; + + uint8_t h = hue / 60; + float f = ( hue / 60 ) - h; + + uint8_t p = RGB_MAX * ( val * ( 1 - sat )); + uint8_t q = RGB_MAX * ( val * ( 1 - sat * f )); + uint8_t t = RGB_MAX * ( val * ( 1 - sat * ( 1 - f ))); + + switch(h) { + case 0: + case 6: res.r = hsv->val; res.g = t; res.b = p; break; + case 1: res.r = q; res.g = hsv->val; res.b = p; break; + case 2: res.r = p; res.g = hsv->val; res.b = t; break; + case 3: res.r = p; res.g = q; res.b = hsv->val; break; + case 4: res.r = t; res.g = p; res.b = hsv->val; break; + case 5: res.r = hsv->hue; res.g = p; res.b = q; break; + + } + } + return res; +} + +hsv_t init_hsv_t(uint16_t hue, uint8_t sat, uint8_t val) { + hsv_t tmp; + tmp.hue = hue; + tmp.sat = sat; + tmp.val = val; + + return tmp; +} diff --git a/sketches/pendulum/color_hsv.h b/sketches/pendulum/color_hsv.h new file mode 100644 index 0000000..d2e351d --- /dev/null +++ b/sketches/pendulum/color_hsv.h @@ -0,0 +1,26 @@ +#ifndef _COLOR_HSV_H_ +#define _COLOR_HSV_H_ + +#include +#include + +#define RGB_MAX 128 + +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; +} rgb_t; + +typedef struct { + uint16_t hue; + uint8_t sat; + uint8_t val; +} hsv_t; + +hsv_t init_hsv_t(uint16_t hue, uint8_t sat, uint8_t val); +rgb_t hsv2rgb(hsv_t* hsv); +void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count); +void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors); + +#endif diff --git a/sketches/pendulum/color_hsv.lst b/sketches/pendulum/color_hsv.lst new file mode 100644 index 0000000..0976998 --- /dev/null +++ b/sketches/pendulum/color_hsv.lst @@ -0,0 +1,662 @@ + 1 .file "color_hsv.c" + 2 __SP_H__ = 0x3e + 3 __SP_L__ = 0x3d + 4 __SREG__ = 0x3f + 5 __tmp_reg__ = 0 + 6 __zero_reg__ = 1 + 9 .text + 10 .Ltext0: + 103 .global interpolate + 105 interpolate: + 106 .stabd 46,0,0 + 1:color_hsv.c **** #include "color_hsv.h" + 2:color_hsv.c **** + 3:color_hsv.c **** void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors) { + 108 .LM0: + 109 .LFBB1: + 110 0000 2F92 push r2 + 111 0002 3F92 push r3 + 112 0004 4F92 push r4 + 113 0006 5F92 push r5 + 114 0008 6F92 push r6 + 115 000a 7F92 push r7 + 116 000c 8F92 push r8 + 117 000e 9F92 push r9 + 118 0010 AF92 push r10 + 119 0012 BF92 push r11 + 120 0014 CF92 push r12 + 121 0016 DF92 push r13 + 122 0018 EF92 push r14 + 123 001a FF92 push r15 + 124 001c 0F93 push r16 + 125 001e 1F93 push r17 + 126 0020 CF93 push r28 + 127 0022 DF93 push r29 + 128 0024 CDB7 in r28,__SP_L__ + 129 0026 DEB7 in r29,__SP_H__ + 130 0028 2A97 sbiw r28,10 + 131 002a 0FB6 in __tmp_reg__,__SREG__ + 132 002c F894 cli + 133 002e DEBF out __SP_H__,r29 + 134 0030 0FBE out __SREG__,__tmp_reg__ + 135 0032 CDBF out __SP_L__,r28 + 136 /* prologue: function */ + 137 /* frame size = 10 */ + 138 /* stack size = 28 */ + 139 .L__stack_usage = 28 + 140 0034 D82E mov r13,r24 + 141 0036 C92E mov r12,r25 + 142 0038 F701 movw r30,r14 + 4:color_hsv.c **** if( steps == 1 ) { + 144 .LM1: + 145 003a 0130 cpi r16,1 + 146 003c 1105 cpc r17,__zero_reg__ + 147 003e 01F0 breq .L2 + 148 .LBB2: + 149 .LBB3: + 5:color_hsv.c **** colors[0] = start; + 6:color_hsv.c **** return; + 7:color_hsv.c **** } + 8:color_hsv.c **** + 9:color_hsv.c **** for( size_t i = 0; i < steps; i++ ) { + 10:color_hsv.c **** hsv_t tmp; + 11:color_hsv.c **** tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / + 151 .LM2: + 152 0040 3B01 movw r6,r22 + 153 0042 2901 movw r4,r18 + 154 0044 461A sub r4,r22 + 155 0046 570A sbc r5,r23 + 156 0048 842F mov r24,r20 + 157 004a 90E0 ldi r25,0 + 12:color_hsv.c **** tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ( + 159 .LM3: + 160 004c BC01 movw r22,r24 + 161 004e 6D19 sub r22,r13 + 162 0050 7109 sbc r23,__zero_reg__ + 163 0052 7E83 std Y+6,r23 + 164 0054 6D83 std Y+5,r22 + 165 0056 852F mov r24,r21 + 166 0058 90E0 ldi r25,0 + 13:color_hsv.c **** tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ( + 168 .LM4: + 169 005a 9C01 movw r18,r24 + 170 005c 2C19 sub r18,r12 + 171 005e 3109 sbc r19,__zero_reg__ + 172 0060 3887 std Y+8,r19 + 173 0062 2F83 std Y+7,r18 + 174 0064 3396 adiw r30,3 + 175 0066 1A86 std Y+10,__zero_reg__ + 176 0068 1986 std Y+9,__zero_reg__ + 177 006a E12C mov r14,__zero_reg__ + 178 006c F12C mov r15,__zero_reg__ + 179 006e 80E0 ldi r24,0 + 180 0070 90E0 ldi r25,0 + 181 0072 20E0 ldi r18,0 + 182 0074 30E0 ldi r19,0 + 11:color_hsv.c **** tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ( + 184 .LM5: + 185 0076 5801 movw r10,r16 + 186 0078 41E0 ldi r20,1 + 187 007a A41A sub r10,r20 + 188 007c B108 sbc r11,__zero_reg__ + 189 007e 00C0 rjmp .L3 + 190 .L2: + 191 .LBE3: + 192 .LBE2: + 5:color_hsv.c **** return; + 194 .LM6: + 195 0080 6083 st Z,r22 + 196 0082 7183 std Z+1,r23 + 197 0084 8283 std Z+2,r24 + 198 0086 9383 std Z+3,r25 + 6:color_hsv.c **** } + 200 .LM7: + 201 0088 00C0 rjmp .L1 + 202 .L3: + 203 008a 1C01 movw r2,r24 + 204 008c 240C add r2,r4 + 205 008e 351C adc r3,r5 + 206 0090 4D81 ldd r20,Y+5 + 207 0092 5E81 ldd r21,Y+6 + 208 0094 4E0D add r20,r14 + 209 0096 5F1D adc r21,r15 + 210 0098 5A83 std Y+2,r21 + 211 009a 4983 std Y+1,r20 + 212 009c 4F81 ldd r20,Y+7 + 213 009e 5885 ldd r21,Y+8 + 214 00a0 6985 ldd r22,Y+9 + 215 00a2 7A85 ldd r23,Y+10 + 216 00a4 460F add r20,r22 + 217 00a6 571F adc r21,r23 + 218 00a8 5C83 std Y+4,r21 + 219 00aa 4B83 std Y+3,r20 + 220 .LBB5: + 9:color_hsv.c **** hsv_t tmp; + 222 .LM8: + 223 00ac 2017 cp r18,r16 + 224 00ae 3107 cpc r19,r17 + 225 00b0 01F0 breq .L1 + 226 00b2 4F01 movw r8,r30 + 227 00b4 53E0 ldi r21,3 + 228 00b6 851A sub r8,r21 + 229 00b8 9108 sbc r9,__zero_reg__ + 230 .LBB4: + 11:color_hsv.c **** tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ( + 232 .LM9: + 233 00ba B501 movw r22,r10 + 234 00bc 0E94 0000 call __divmodhi4 + 235 00c0 660D add r22,r6 + 236 00c2 771D adc r23,r7 + 14:color_hsv.c **** colors[i] = tmp; + 238 .LM10: + 239 00c4 D401 movw r26,r8 + 240 00c6 6D93 st X+,r22 + 241 00c8 7C93 st X,r23 + 242 00ca 4F01 movw r8,r30 + 243 00cc B1E0 ldi r27,1 + 244 00ce 8B1A sub r8,r27 + 245 00d0 9108 sbc r9,__zero_reg__ + 12:color_hsv.c **** tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ( + 247 .LM11: + 248 00d2 C701 movw r24,r14 + 249 00d4 B501 movw r22,r10 + 250 00d6 0E94 0000 call __divmodhi4 + 251 00da 6D0D add r22,r13 + 253 .LM12: + 254 00dc D401 movw r26,r8 + 255 00de 6C93 st X,r22 + 13:color_hsv.c **** colors[i] = tmp; + 257 .LM13: + 258 00e0 8985 ldd r24,Y+9 + 259 00e2 9A85 ldd r25,Y+10 + 260 00e4 B501 movw r22,r10 + 261 00e6 0E94 0000 call __divmodhi4 + 262 00ea 6C0D add r22,r12 + 264 .LM14: + 265 00ec 6083 st Z,r22 + 266 .LBE4: + 9:color_hsv.c **** hsv_t tmp; + 268 .LM15: + 269 00ee 2F5F subi r18,-1 + 270 00f0 3F4F sbci r19,-1 + 271 00f2 3496 adiw r30,4 + 272 00f4 4B81 ldd r20,Y+3 + 273 00f6 5C81 ldd r21,Y+4 + 274 00f8 5A87 std Y+10,r21 + 275 00fa 4987 std Y+9,r20 + 276 00fc E980 ldd r14,Y+1 + 277 00fe FA80 ldd r15,Y+2 + 278 0100 C101 movw r24,r2 + 279 0102 00C0 rjmp .L3 + 280 .L1: + 281 /* epilogue start */ + 282 .LBE5: + 15:color_hsv.c **** } + 16:color_hsv.c **** } + 284 .LM16: + 285 0104 2A96 adiw r28,10 + 286 0106 0FB6 in __tmp_reg__,__SREG__ + 287 0108 F894 cli + 288 010a DEBF out __SP_H__,r29 + 289 010c 0FBE out __SREG__,__tmp_reg__ + 290 010e CDBF out __SP_L__,r28 + 291 0110 DF91 pop r29 + 292 0112 CF91 pop r28 + 293 0114 1F91 pop r17 + 294 0116 0F91 pop r16 + 295 0118 FF90 pop r15 + 296 011a EF90 pop r14 + 297 011c DF90 pop r13 + 298 011e CF90 pop r12 + 299 0120 BF90 pop r11 + 300 0122 AF90 pop r10 + 301 0124 9F90 pop r9 + 302 0126 8F90 pop r8 + 303 0128 7F90 pop r7 + 304 012a 6F90 pop r6 + 305 012c 5F90 pop r5 + 306 012e 4F90 pop r4 + 307 0130 3F90 pop r3 + 308 0132 2F90 pop r2 + 309 0134 0895 ret + 317 .Lscope1: + 319 .stabd 78,0,0 + 320 .global __floatunsisf + 321 .global __divsf3 + 322 .global __fixunssfsi + 323 .global __floatsisf + 324 .global __subsf3 + 325 .global __mulsf3 + 328 .global hsv2rgb + 330 hsv2rgb: + 331 .stabd 46,0,0 + 17:color_hsv.c **** + 18:color_hsv.c **** void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count) { + 19:color_hsv.c **** for(size_t i = 0; i < count; ++i) { + 20:color_hsv.c **** rgbList[i] = hsv2rgb(&hsvList[i]); + 21:color_hsv.c **** } + 22:color_hsv.c **** } + 23:color_hsv.c **** + 24:color_hsv.c **** rgb_t hsv2rgb(hsv_t* hsv) { + 333 .LM17: + 334 .LFBB2: + 335 0136 2F92 push r2 + 336 0138 3F92 push r3 + 337 013a 4F92 push r4 + 338 013c 5F92 push r5 + 339 013e 6F92 push r6 + 340 0140 7F92 push r7 + 341 0142 8F92 push r8 + 342 0144 9F92 push r9 + 343 0146 AF92 push r10 + 344 0148 BF92 push r11 + 345 014a CF92 push r12 + 346 014c DF92 push r13 + 347 014e EF92 push r14 + 348 0150 FF92 push r15 + 349 0152 0F93 push r16 + 350 0154 1F93 push r17 + 351 0156 CF93 push r28 + 352 0158 DF93 push r29 + 353 015a 00D0 rcall . + 354 015c 00D0 rcall . + 355 015e CDB7 in r28,__SP_L__ + 356 0160 DEB7 in r29,__SP_H__ + 357 /* prologue: function */ + 358 /* frame size = 4 */ + 359 /* stack size = 22 */ + 360 .L__stack_usage = 22 + 25:color_hsv.c **** rgb_t res; + 26:color_hsv.c **** + 27:color_hsv.c **** if(hsv->sat == 0) { + 362 .LM18: + 363 0162 FC01 movw r30,r24 + 364 0164 B280 ldd r11,Z+2 + 365 0166 3380 ldd r3,Z+3 + 366 0168 B110 cpse r11,__zero_reg__ + 367 016a 00C0 rjmp .L8 + 28:color_hsv.c **** res.r = res.g = res.b = hsv->val; + 369 .LM19: + 370 016c 232C mov r2,r3 + 371 016e 3B82 std Y+3,r3 + 372 0170 3C82 std Y+4,r3 + 373 0172 00C0 rjmp .L9 + 374 .L8: + 375 0174 FC01 movw r30,r24 + 376 .LBB6: + 29:color_hsv.c **** } else { + 30:color_hsv.c **** float hue = (float) (hsv->hue<360?hsv->hue:hsv->hue-360); + 378 .LM20: + 379 0176 0081 ld r16,Z + 380 0178 1181 ldd r17,Z+1 + 381 017a B801 movw r22,r16 + 382 017c 0836 cpi r16,104 + 383 017e F1E0 ldi r31,1 + 384 0180 1F07 cpc r17,r31 + 385 0182 00F0 brlo .L20 + 387 .LM21: + 388 0184 6856 subi r22,104 + 389 0186 7140 sbci r23,1 + 390 .L20: + 391 0188 80E0 ldi r24,0 + 392 018a 90E0 ldi r25,0 + 393 018c 0E94 0000 call __floatunsisf + 394 0190 2B01 movw r4,r22 + 395 0192 3C01 movw r6,r24 + 31:color_hsv.c **** float val = ((float) hsv->val ) / 100.0; + 397 .LM22: + 398 0194 632D mov r22,r3 + 399 0196 70E0 ldi r23,0 + 400 0198 80E0 ldi r24,0 + 401 019a 90E0 ldi r25,0 + 402 019c 0E94 0000 call __floatunsisf + 403 01a0 20E0 ldi r18,0 + 404 01a2 30E0 ldi r19,0 + 405 01a4 48EC ldi r20,lo8(-56) + 406 01a6 52E4 ldi r21,lo8(66) + 407 01a8 0E94 0000 call __divsf3 + 408 01ac 6B01 movw r12,r22 + 409 01ae 7C01 movw r14,r24 + 32:color_hsv.c **** float sat = ((float) hsv->sat ) / 100.0; + 411 .LM23: + 412 01b0 6B2D mov r22,r11 + 413 01b2 70E0 ldi r23,0 + 414 01b4 80E0 ldi r24,0 + 415 01b6 90E0 ldi r25,0 + 416 01b8 0E94 0000 call __floatunsisf + 417 01bc 20E0 ldi r18,0 + 418 01be 30E0 ldi r19,0 + 419 01c0 48EC ldi r20,lo8(-56) + 420 01c2 52E4 ldi r21,lo8(66) + 421 01c4 0E94 0000 call __divsf3 + 422 01c8 4B01 movw r8,r22 + 423 01ca 5C01 movw r10,r24 + 33:color_hsv.c **** + 34:color_hsv.c **** uint8_t h = hue / 60; + 425 .LM24: + 426 01cc 20E0 ldi r18,0 + 427 01ce 30E0 ldi r19,0 + 428 01d0 40E7 ldi r20,lo8(112) + 429 01d2 52E4 ldi r21,lo8(66) + 430 01d4 C301 movw r24,r6 + 431 01d6 B201 movw r22,r4 + 432 01d8 0E94 0000 call __divsf3 + 433 01dc 2B01 movw r4,r22 + 434 01de 3C01 movw r6,r24 + 435 01e0 0E94 0000 call __fixunssfsi + 436 01e4 6A83 std Y+2,r22 + 35:color_hsv.c **** float f = ( hue / 60 ) - h; + 438 .LM25: + 439 01e6 70E0 ldi r23,0 + 440 01e8 80E0 ldi r24,0 + 441 01ea 90E0 ldi r25,0 + 442 01ec 0E94 0000 call __floatsisf + 443 01f0 9B01 movw r18,r22 + 444 01f2 AC01 movw r20,r24 + 445 01f4 C301 movw r24,r6 + 446 01f6 B201 movw r22,r4 + 447 01f8 0E94 0000 call __subsf3 + 448 01fc 2B01 movw r4,r22 + 449 01fe 3C01 movw r6,r24 + 36:color_hsv.c **** + 37:color_hsv.c **** uint8_t p = RGB_MAX * ( val * ( 1 - sat )); + 451 .LM26: + 452 0200 A501 movw r20,r10 + 453 0202 9401 movw r18,r8 + 454 0204 60E0 ldi r22,0 + 455 0206 70E0 ldi r23,0 + 456 0208 80E8 ldi r24,lo8(-128) + 457 020a 9FE3 ldi r25,lo8(63) + 458 020c 0E94 0000 call __subsf3 + 459 0210 9B01 movw r18,r22 + 460 0212 AC01 movw r20,r24 + 461 0214 C701 movw r24,r14 + 462 0216 B601 movw r22,r12 + 463 0218 0E94 0000 call __mulsf3 + 464 021c 20E0 ldi r18,0 + 465 021e 30E0 ldi r19,0 + 466 0220 40E0 ldi r20,0 + 467 0222 53E4 ldi r21,lo8(67) + 468 0224 0E94 0000 call __mulsf3 + 469 0228 0E94 0000 call __fixunssfsi + 470 022c 262E mov r2,r22 + 38:color_hsv.c **** uint8_t q = RGB_MAX * ( val * ( 1 - sat * f )); + 472 .LM27: + 473 022e A301 movw r20,r6 + 474 0230 9201 movw r18,r4 + 475 0232 C501 movw r24,r10 + 476 0234 B401 movw r22,r8 + 477 0236 0E94 0000 call __mulsf3 + 478 023a 9B01 movw r18,r22 + 479 023c AC01 movw r20,r24 + 480 023e 60E0 ldi r22,0 + 481 0240 70E0 ldi r23,0 + 482 0242 80E8 ldi r24,lo8(-128) + 483 0244 9FE3 ldi r25,lo8(63) + 484 0246 0E94 0000 call __subsf3 + 485 024a 9B01 movw r18,r22 + 486 024c AC01 movw r20,r24 + 487 024e C701 movw r24,r14 + 488 0250 B601 movw r22,r12 + 489 0252 0E94 0000 call __mulsf3 + 490 0256 20E0 ldi r18,0 + 491 0258 30E0 ldi r19,0 + 492 025a 40E0 ldi r20,0 + 493 025c 53E4 ldi r21,lo8(67) + 494 025e 0E94 0000 call __mulsf3 + 495 0262 0E94 0000 call __fixunssfsi + 496 0266 6983 std Y+1,r22 + 39:color_hsv.c **** uint8_t t = RGB_MAX * ( val * ( 1 - sat * ( 1 - f ))); + 498 .LM28: + 499 0268 A301 movw r20,r6 + 500 026a 9201 movw r18,r4 + 501 026c 60E0 ldi r22,0 + 502 026e 70E0 ldi r23,0 + 503 0270 80E8 ldi r24,lo8(-128) + 504 0272 9FE3 ldi r25,lo8(63) + 505 0274 0E94 0000 call __subsf3 + 506 0278 9B01 movw r18,r22 + 507 027a AC01 movw r20,r24 + 508 027c C501 movw r24,r10 + 509 027e B401 movw r22,r8 + 510 0280 0E94 0000 call __mulsf3 + 511 0284 9B01 movw r18,r22 + 512 0286 AC01 movw r20,r24 + 513 0288 60E0 ldi r22,0 + 514 028a 70E0 ldi r23,0 + 515 028c 80E8 ldi r24,lo8(-128) + 516 028e 9FE3 ldi r25,lo8(63) + 517 0290 0E94 0000 call __subsf3 + 518 0294 9B01 movw r18,r22 + 519 0296 AC01 movw r20,r24 + 520 0298 C701 movw r24,r14 + 521 029a B601 movw r22,r12 + 522 029c 0E94 0000 call __mulsf3 + 523 02a0 20E0 ldi r18,0 + 524 02a2 30E0 ldi r19,0 + 525 02a4 40E0 ldi r20,0 + 526 02a6 53E4 ldi r21,lo8(67) + 527 02a8 0E94 0000 call __mulsf3 + 528 02ac 0E94 0000 call __fixunssfsi + 40:color_hsv.c **** + 41:color_hsv.c **** switch(h) { + 530 .LM29: + 531 02b0 2A81 ldd r18,Y+2 + 532 02b2 822F mov r24,r18 + 533 02b4 90E0 ldi r25,0 + 534 02b6 8730 cpi r24,7 + 535 02b8 9105 cpc r25,__zero_reg__ + 536 02ba 00F4 brsh .L19 + 538 .LM30: + 539 02bc FC01 movw r30,r24 + 540 02be E050 subi r30,lo8(-(gs(.L13))) + 541 02c0 F040 sbci r31,hi8(-(gs(.L13))) + 542 02c2 0C94 0000 jmp __tablejump2__ + 543 .section .progmem.gcc_sw_table,"a",@progbits + 544 .p2align 1 + 545 .L13: + 546 0000 0000 .word gs(.L12) + 547 0002 0000 .word gs(.L14) + 548 0004 0000 .word gs(.L15) + 549 0006 0000 .word gs(.L16) + 550 0008 0000 .word gs(.L17) + 551 000a 0000 .word gs(.L18) + 552 000c 0000 .word gs(.L12) + 553 .text + 554 .L12: + 42:color_hsv.c **** case 0: + 43:color_hsv.c **** case 6: res.r = hsv->val; res.g = t; res.b = p; break; + 556 .LM31: + 557 02c6 2B82 std Y+3,r2 + 558 02c8 6C83 std Y+4,r22 + 559 02ca 232C mov r2,r3 + 560 02cc 00C0 rjmp .L9 + 561 .L14: + 44:color_hsv.c **** case 1: res.r = q; res.g = hsv->val; res.b = p; break; + 563 .LM32: + 564 02ce 2B82 std Y+3,r2 + 565 02d0 3C82 std Y+4,r3 + 566 02d2 2980 ldd r2,Y+1 + 567 02d4 00C0 rjmp .L9 + 568 .L15: + 45:color_hsv.c **** case 2: res.r = p; res.g = hsv->val; res.b = t; break; + 570 .LM33: + 571 02d6 6B83 std Y+3,r22 + 572 02d8 3C82 std Y+4,r3 + 573 02da 00C0 rjmp .L9 + 574 .L16: + 46:color_hsv.c **** case 3: res.r = p; res.g = q; res.b = hsv->val; break; + 576 .LM34: + 577 02dc 3B82 std Y+3,r3 + 578 02de 8981 ldd r24,Y+1 + 579 02e0 8C83 std Y+4,r24 + 580 02e2 00C0 rjmp .L9 + 581 .L17: + 47:color_hsv.c **** case 4: res.r = t; res.g = p; res.b = hsv->val; break; + 583 .LM35: + 584 02e4 3B82 std Y+3,r3 + 585 02e6 2C82 std Y+4,r2 + 586 02e8 262E mov r2,r22 + 587 02ea 00C0 rjmp .L9 + 588 .L18: + 48:color_hsv.c **** case 5: res.r = hsv->hue; res.g = p; res.b = q; break; + 590 .LM36: + 591 02ec E981 ldd r30,Y+1 + 592 02ee EB83 std Y+3,r30 + 593 02f0 2C82 std Y+4,r2 + 594 02f2 202E mov r2,r16 + 595 02f4 00C0 rjmp .L9 + 596 .L19: + 41:color_hsv.c **** case 0: + 598 .LM37: + 599 02f6 212C mov r2,__zero_reg__ + 600 .L9: + 601 .LBE6: + 49:color_hsv.c **** + 50:color_hsv.c **** } + 51:color_hsv.c **** } + 52:color_hsv.c **** return res; + 53:color_hsv.c **** } + 603 .LM38: + 604 02f8 622D mov r22,r2 + 605 02fa 7C81 ldd r23,Y+4 + 606 02fc 8B81 ldd r24,Y+3 + 607 /* epilogue start */ + 608 02fe 0F90 pop __tmp_reg__ + 609 0300 0F90 pop __tmp_reg__ + 610 0302 0F90 pop __tmp_reg__ + 611 0304 0F90 pop __tmp_reg__ + 612 0306 DF91 pop r29 + 613 0308 CF91 pop r28 + 614 030a 1F91 pop r17 + 615 030c 0F91 pop r16 + 616 030e FF90 pop r15 + 617 0310 EF90 pop r14 + 618 0312 DF90 pop r13 + 619 0314 CF90 pop r12 + 620 0316 BF90 pop r11 + 621 0318 AF90 pop r10 + 622 031a 9F90 pop r9 + 623 031c 8F90 pop r8 + 624 031e 7F90 pop r7 + 625 0320 6F90 pop r6 + 626 0322 5F90 pop r5 + 627 0324 4F90 pop r4 + 628 0326 3F90 pop r3 + 629 0328 2F90 pop r2 + 630 032a 0895 ret + 635 .Lscope2: + 637 .stabd 78,0,0 + 641 .global hsv2rgbList + 643 hsv2rgbList: + 644 .stabd 46,0,0 + 18:color_hsv.c **** for(size_t i = 0; i < count; ++i) { + 646 .LM39: + 647 .LFBB3: + 648 032c CF92 push r12 + 649 032e DF92 push r13 + 650 0330 EF92 push r14 + 651 0332 FF92 push r15 + 652 0334 0F93 push r16 + 653 0336 1F93 push r17 + 654 0338 CF93 push r28 + 655 033a DF93 push r29 + 656 /* prologue: function */ + 657 /* frame size = 0 */ + 658 /* stack size = 8 */ + 659 .L__stack_usage = 8 + 660 033c 6A01 movw r12,r20 + 661 033e EB01 movw r28,r22 + 662 0340 7C01 movw r14,r24 + 663 .LBB7: + 19:color_hsv.c **** rgbList[i] = hsv2rgb(&hsvList[i]); + 665 .LM40: + 666 0342 00E0 ldi r16,0 + 667 0344 10E0 ldi r17,0 + 668 .L22: + 19:color_hsv.c **** rgbList[i] = hsv2rgb(&hsvList[i]); + 670 .LM41: + 671 0346 0C15 cp r16,r12 + 672 0348 1D05 cpc r17,r13 + 673 034a 01F0 breq .L24 + 20:color_hsv.c **** } + 675 .LM42: + 676 034c C701 movw r24,r14 + 677 034e 0E94 0000 call hsv2rgb + 678 0352 6993 st Y+,r22 + 679 0354 7993 st Y+,r23 + 680 0356 8993 st Y+,r24 + 19:color_hsv.c **** rgbList[i] = hsv2rgb(&hsvList[i]); + 682 .LM43: + 683 0358 0F5F subi r16,-1 + 684 035a 1F4F sbci r17,-1 + 685 035c 84E0 ldi r24,4 + 686 035e E80E add r14,r24 + 687 0360 F11C adc r15,__zero_reg__ + 688 0362 00C0 rjmp .L22 + 689 .L24: + 690 /* epilogue start */ + 691 .LBE7: + 22:color_hsv.c **** + 693 .LM44: + 694 0364 DF91 pop r29 + 695 0366 CF91 pop r28 + 696 0368 1F91 pop r17 + 697 036a 0F91 pop r16 + 698 036c FF90 pop r15 + 699 036e EF90 pop r14 + 700 0370 DF90 pop r13 + 701 0372 CF90 pop r12 + 702 0374 0895 ret + 707 .Lscope3: + 709 .stabd 78,0,0 + 713 .global init_hsv_t + 715 init_hsv_t: + 716 .stabd 46,0,0 + 54:color_hsv.c **** + 55:color_hsv.c **** hsv_t init_hsv_t(uint16_t hue, uint8_t sat, uint8_t val) { + 718 .LM45: + 719 .LFBB4: + 720 /* prologue: function */ + 721 /* frame size = 0 */ + 722 /* stack size = 0 */ + 723 .L__stack_usage = 0 + 724 0376 282F mov r18,r24 + 725 0378 862F mov r24,r22 + 56:color_hsv.c **** hsv_t tmp; + 57:color_hsv.c **** tmp.hue = hue; + 58:color_hsv.c **** tmp.sat = sat; + 59:color_hsv.c **** tmp.val = val; + 60:color_hsv.c **** + 61:color_hsv.c **** return tmp; + 62:color_hsv.c **** } + 727 .LM46: + 728 037a 622F mov r22,r18 + 729 037c 792F mov r23,r25 + 730 037e 942F mov r25,r20 + 731 0380 0895 ret + 733 .Lscope4: + 735 .stabd 78,0,0 + 737 .Letext0: + 738 .ident "GCC: (GNU) 4.9.2" +DEFINED SYMBOLS + *ABS*:0000000000000000 color_hsv.c + /tmp/cclIci1E.s:2 *ABS*:000000000000003e __SP_H__ + /tmp/cclIci1E.s:3 *ABS*:000000000000003d __SP_L__ + /tmp/cclIci1E.s:4 *ABS*:000000000000003f __SREG__ + /tmp/cclIci1E.s:5 *ABS*:0000000000000000 __tmp_reg__ + /tmp/cclIci1E.s:6 *ABS*:0000000000000001 __zero_reg__ + /tmp/cclIci1E.s:105 .text:0000000000000000 interpolate + /tmp/cclIci1E.s:330 .text:0000000000000136 hsv2rgb + /tmp/cclIci1E.s:643 .text:000000000000032c hsv2rgbList + /tmp/cclIci1E.s:715 .text:0000000000000376 init_hsv_t + +UNDEFINED SYMBOLS +__divmodhi4 +__floatunsisf +__divsf3 +__fixunssfsi +__floatsisf +__subsf3 +__mulsf3 +__tablejump2__ diff --git a/sketches/pendulum/color_hsv.o b/sketches/pendulum/color_hsv.o new file mode 100644 index 0000000000000000000000000000000000000000..0f9b198125801f30d44c5b891ea1ca0ed411645c GIT binary patch literal 8484 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 literal 0 HcmV?d00001 diff --git a/sketches/pendulum/pendulum.c b/sketches/pendulum/pendulum.c new file mode 100644 index 0000000..71b8934 --- /dev/null +++ b/sketches/pendulum/pendulum.c @@ -0,0 +1,228 @@ +#define F_CPU 20000000UL +#include +#include +#include + +#include +#include +#include + +#include "color_hsv.h" +#define HUE_MAX 610 +#define HUE_MIN 350 +#define HUE_MID ((HUE_MAX + HUE_MIN) / 2) +#define HUE_DIF (HUE_MAX - HUE_MIN) +#define HUE_SAT 100 // 0 = white, 100 = color +#define HUE_VAL 20 // 0 = black, 100 = color +#define HUE_STEP 8 // 8 +const uint32_t colorSteps = HUE_DIF / HUE_STEP; +//~ const uint32_t colorSteps = 5; + +#define LEDS 30 + +// Prototypes: +void writeZero(void); +void writeOne(void); +void writeRGB(uint8_t red, uint8_t green, uint8_t blue); + +// Interrupt variables: +int8_t volatile status = 1; +uint16_t volatile min = HUE_MID; +uint16_t volatile max = HUE_MID; +uint32_t volatile time = 0; +uint32_t volatile T_half = 0; +uint32_t volatile oldTime = 0; +uint32_t volatile cooldown = 0; +//~ uint32_t volatile delay = 0; + +// On External Interrupt: +ISR(INT1_vect) { + EIMSK &= 0xfd; // Disable INT1 + T_half = time + TCNT1; + //~ delay = T_half / 16; + cooldown = T_half / 2; + TCNT1 = 0; // Reset Timer/Counter1 + time = 0; + oldTime = 0; + PORTC ^= 0x02; + //~ min = HUE_MID; + //~ max = HUE_MID; + //~ status = (status == 1 ? -1 : 1); +} + +// On Timer Overflow Interrupt: +ISR(TIMER1_OVF_vect) { + time += 0x00010000; +} + +int main(void) { + + EIMSK |= 0x02; // External Interrupt Mask Register + // Enable INT1 (PIN5) for interrupt + EICRA |= 0x0c; // External Interrupt Control Register + // INT1 on rising edge + + TIMSK1 |= 0x01; // Timer/Counter1 Interrupt Mask Register + // Enable overflow interrupt + TCCR1B |= 0x01; // Timer/Counter1 Control Register B + // Prescale Factor 1 + + SREG |= 0x80; // Status Register + // Enable global interrupts + + DDRC = 0x3f; // Digital Direction PORTC[5:0] = output + PORTC = 0x00; + + // Init color + hsv_t colorsHSV[LEDS]; + rgb_t colorsRGB[LEDS]; + interpolate( + init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + // Assign color + for(int i = 0; i < LEDS; i++) { + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + } + + // Next color + int8_t sign = 1; + min += sign * HUE_STEP; + max -= sign * HUE_STEP; + interpolate( + init_hsv_t(min, HUE_SAT, HUE_VAL),// from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + + while(1) { + uint32_t now = time + TCNT1; + //~ if(now > delay) { + //~ PORTC |= 0x08; // PORTC3 = HIGH + //~ } + //~ if(now > delay * 2) { + //~ PORTC &= 0xf7; // PORTC3 = LOW + //~ } + + if(now > cooldown) { + EIMSK |= 0x02; // Enable INT1 + } + + uint32_t T_step = T_half / colorSteps; + + // Check if it is time for next color + if(now > oldTime + T_step) { + oldTime += T_step; + PORTC ^= 0x04; + // Assign color + cli(); + for(int i = 0; i < LEDS; i++) { + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + } + sei(); + //~ _delay_us(51); + + // Next color + min += sign * HUE_STEP; + max -= sign * HUE_STEP; + interpolate( + init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + // Check if reached amplitude + if(sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + sign = -1; + } else if(sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + sign = 1; + } + //~ if(status == 1 && sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + //~ sign = -1; + //~ } else if(status == 1 && sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + //~ sign = 1; + //~ } else if(status == -1 && sign == 1 && (min <= HUE_MIN || max >= HUE_MAX)) { + //~ sign = -1; + //~ } else if(status == -1 && sign == -1 && (min >= HUE_MAX || max <= HUE_MIN)) { + //~ sign = 1; + //~ } + } + } +} + +/*********************************************************************** +* +* TIMING +* +************************************************************************ +* f=20MHz -> T=0,05 µs = 50 ns +* +* 0,05 µs * 6 == 0.3 µs ~ 0.4 µs (+- 150ns) == [0.25, 0.55] µs +* 0,05 µs * 14 == 0.7 µs ~ 0.8 µs (+- 150ns) == [0.65, 0.95] µs +* 0,05 µs * 15 == 0.75 µs ~ 0.85 µs (+- 150ns) == [0.70, 1.00] µs +* 0,05 µs * 8 == 0.35 µs ~ 0.45 µs (+- 150ns) == [0.30, 0.60] µs +* 51 µs > 50 µs +************************************************************************/ +// AVR-GCC optimizes multiple "nop"s on every optimization level +// So we use timing from: +// https://github.com/cpldcpu/light_ws2812/blob/master/light_ws2812_AVR/Light_WS2812/light_ws2812.c +#define w_nop1 __asm__("nop \n\t") +#define w_nop2 __asm__("rjmp .+0 \n\t") +#define w_nop4 w_nop2; w_nop2 +#define w_nop8 w_nop4; w_nop4 +#define w_nop16 w_nop8; w_nop8 // Not used + +#define wait6 w_nop2; w_nop4 +#define wait8 w_nop8 +#define wait14 wait8; wait6 +#define wait15 wait14; w_nop1 + +// WS2812B protocol +inline void writeZero() { + PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + wait6; + PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + wait15; +} + +// WS2812B protocol +inline void writeOne() { + PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + wait14; + PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + wait8; +} + +inline void writeRGB(uint8_t red, uint8_t green, uint8_t blue) { + int i; + + for( i = 128; i > 0; i >>= 1 ) { + if( green & i ){ + writeOne(); + } else { + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + if( red & i ){ + writeOne(); + } else { + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + if( blue & i ){ + writeOne(); + } else { + writeZero(); + } + } +} diff --git a/sketches/pendulum/pendulum.eep b/sketches/pendulum/pendulum.eep new file mode 100644 index 0000000..1996e8f --- /dev/null +++ b/sketches/pendulum/pendulum.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/sketches/pendulum/pendulum.elf b/sketches/pendulum/pendulum.elf new file mode 100755 index 0000000000000000000000000000000000000000..4b90eb1d081a50ac1fbd7fa1b5c98343360f5568 GIT binary patch literal 15764 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 VJ&K=}U)kQd62>m-gF&X-`(Ltr9NGW? literal 0 HcmV?d00001 diff --git a/sketches/pendulum/pendulum.hex b/sketches/pendulum/pendulum.hex new file mode 100644 index 0000000..da2db86 --- /dev/null +++ b/sketches/pendulum/pendulum.hex @@ -0,0 +1,216 @@ +:100000000C943B000C9458000C945A000C9458002B +:100010000C9458000C9458000C9458000C94580000 +:100020000C9458000C9458000C9458000C945800F0 +:100030000C9458000C94B7000C9458000C94580081 +:100040000C9458000C9458000C9458000C945800D0 +:100050000C9458000C9458000C9458000C945800C0 +:100060000C9458000C945800AA02AE02B202B502D9 +:10007000B902BD02AA0211241FBECFEFD8E0DEBF35 +:10008000CDBF11E0A0E0B1E0E0E6FDE002C00590E8 +:100090000D92AA30B107D9F721E0AAE0B1E001C082 +:1000A0001D92AA31B207E1F70E9408030C94AE0634 +:1000B0000C9400001F920F920FB60F9211242F93F1 +:1000C0003F938F939F93AF93BF93EF93FF93E998E1 +:1000D0008091160190911701A0911801B09119011A +:1000E000E4E8F0E020813181820F931FA11DB11D52 +:1000F0008093120190931301A0931401B093150102 +:100100008091120190911301A0911401B0911501F9 +:10011000B695A7959795879580930A0190930B01C3 +:10012000A0930C01B0930D01118210821092160160 +:1001300010921701109218011092190110920E01DD +:1001400010920F01109210011092110198B182E0EB +:10015000892788B9FF91EF91BF91AF919F918F91BE +:100160003F912F910F900FBE0F901F9018951F92E7 +:100170000F920FB60F9211248F939F93AF93BF935B +:100180008091160190911701A0911801B091190169 +:1001900011968093160190931701A0931801B093C4 +:1001A0001901BF91AF919F918F910F900FBE0F904A +:1001B0001F901895409A00C000C000C0409800C031 +:1001C00000C000C000C000C000C000C00000089512 +:1001D000409A00C000C000C000C000C000C000C005 +:1001E000409800C000C000C000C00895AF92BF9208 +:1001F000CF92DF92EF92FF920F931F93CF93DF93F3 +:10020000C82EE42EC8E0D0E000E810E0A62EB12C05 +:10021000C8018A219B21892B19F00E94E80002C0A5 +:100220000E94DA0015950795219791F7C8E0D0E074 +:1002300000E810E0D12CC8018C219D21892B19F0F8 +:100240000E94E80002C00E94DA00159507952197E8 +:1002500091F7C8E0D0E000E810E0F12CC8018E2151 +:100260009F21892B19F00E94E80002C00E94DA0049 +:1002700015950795219791F7DF91CF911F910F91D8 +:10028000FF90EF90DF90CF90BF90AF9008952F92A6 +:100290003F924F925F926F927F928F929F92AF9216 +:1002A000BF92CF92DF92EF92FF920F931F93CF9363 +:1002B000DF93CDB7DEB72A970FB6F894DEBF0FBE37 +:1002C000CDBFD82EC92EF7010130110501F13B0138 +:1002D0002901461A570A842F90E0BC016D19710953 +:1002E0007E836D83852F90E09C012C19310938871E +:1002F0002F8333961A861986E12CF12C80E090E04A +:1003000020E030E0580141E0A41AB10805C0608344 +:100310007183828393833DC01C01240C351C4D8165 +:100320005E814E0D5F1D5A8349834F8158856985D3 +:100330007A85460F571F5C834B832017310749F19D +:100340004F0153E0851A9108B5010E948006660DA1 +:10035000771DD4016D937C934F01B1E08B1A910806 +:10036000C701B5010E9480066D0DD4016C9389858B +:100370009A85B5010E9480066C0D60832F5F3F4F08 +:1003800034964B815C815A874987E980FA80C101A4 +:10039000C3CF2A960FB6F894DEBF0FBECDBFDF9154 +:1003A000CF911F910F91FF90EF90DF90CF90BF9072 +:1003B000AF909F908F907F906F905F904F903F9005 +:1003C0002F9008952F923F924F925F926F927F925B +:1003D0008F929F92AF92BF92CF92DF92EF92FF9255 +:1003E0000F931F93CF93DF9300D000D0CDB7DEB72C +:1003F000FC01B2803380B11004C0232C3B823C82CC +:10040000C2C0FC0100811181B8010836F1E01F076C +:1004100010F06856714080E090E00E9485052B0145 +:100420003C01632D70E080E090E00E94850520E0B3 +:1004300030E048EC52E40E94E4046B017C016B2D37 +:1004400070E080E090E00E94850520E030E048EC1C +:1004500052E40E94E4044B015C0120E030E040E7FC +:1004600052E4C301B2010E94E4042B013C010E944A +:1004700056056A8370E080E090E00E9487059B014A +:10048000AC01C301B2010E9477042B013C01A5011C +:10049000940160E070E080E89FE30E9477049B0194 +:1004A000AC01C701B6010E94130620E030E040E035 +:1004B00053E40E9413060E945605262EA3019201C2 +:1004C000C501B4010E9413069B01AC0160E070E01D +:1004D00080E89FE30E9477049B01AC01C701B6014D +:1004E0000E94130620E030E040E053E40E9413062F +:1004F0000E9456056983A301920160E070E080E8E4 +:100500009FE30E9477049B01AC01C501B4010E94E6 +:1005100013069B01AC0160E070E080E89FE30E945D +:1005200077049B01AC01C701B6010E94130620E0CD +:1005300030E040E053E40E9413060E9456052A81F1 +:10054000822F90E087309105E8F4FC01EC5CFF4FCE +:100550000C9494062B826C83232C15C02B823C8236 +:10056000298011C06B833C820EC03B8289818C83C1 +:100570000AC03B822C82262E06C0E981EB832C82A6 +:10058000202E01C0212C622D7C818B810F900F9039 +:100590000F900F90DF91CF911F910F91FF90EF90EF +:1005A000DF90CF90BF90AF909F908F907F906F9093 +:1005B0005F904F903F902F900895CF92DF92EF92EF +:1005C000FF920F931F93CF93DF936A01EB017C019E +:1005D00000E010E00C151D0561F0C7010E94E2016A +:1005E0006993799389930F5F1F4F84E0E80EF11CA4 +:1005F000F1CFDF91CF911F910F91FF90EF90DF909E +:10060000CF900895282F862F622F792F942F089549 +:10061000CF93DF93CDB7DEB7C25DD1090FB6F894A3 +:10062000DEBF0FBECDBFE99A809169008C608093D8 +:10063000690080916F00816080936F0080918100DC +:100640008160809381008FB780688FBF8FE387B907 +:1006500018B8809100019091010144E164E60E9484 +:1006600002034B015C01809102019091030144E17E +:1006700064E60E9402039E012F5F3F4F79010EE165 +:1006800010E0A50194010E9447014EE150E0BE0137 +:1006900067587F4FC7010E94DD0249E7A42EB12CA5 +:1006A000AC0EBD1E32E0A30EB11C4E0185ED880ECE +:1006B000911C8501D8011197C8010297F80140816A +:1006C0006C91FC0180810E94F6000D5F1F4F0815A0 +:1006D000190581F78091020190910301089690938A +:1006E000030180930201809100019091010108971C +:1006F000909301018093000180910001909101018C +:1007000044E164E60E9402032B013C018091020156 +:100710009091030144E164E60E9402039E012F5F71 +:100720003F4F79010EE110E0A30192010E944701C1 +:100730004EE150E0BE0167587F4FC7010E94DD02C5 +:10074000DD24D39434E0C32E40911601509117015B +:100750006091180170911901809184009091850039 +:10076000480F591F611D711D80910A0190910B0165 +:10077000A0910C01B0910D0184179507A607B7074A +:1007800008F4E99A8091120190911301A09114014B +:10079000B091150125E0B695A795979587952A956F +:1007A000D1F700910E0110910F01209110013091AD +:1007B0001101080F191F2A1F3B1F041715072607D1 +:1007C000370710F640910E0150910F016091100112 +:1007D00070911101840F951FA61FB71F80930E0102 +:1007E00090930F01A0931001B093110188B18C2553 +:1007F00088B9F8948501D8011197C8010297F801CA +:1008000040816C91FC0180810E94F6000D5F1F4FBA +:100810000815190581F778948091020190910301E0 +:10082000FD2D28E0F202800D911D1124909303010B +:1008300080930201809100019091010138E0F30260 +:1008400080199109112490930101809300018091F6 +:1008500000019091010144E164E60E9402032B0132 +:100860003C01809102019091030144E164E60E9401 +:100870000203FE0131967F010EE110E0A301920117 +:100880000E9447014EE150E0BE0167587F4FC7010B +:100890000E94DD02F1E0DF1212C08091020190910E +:1008A00003018236924018F0DD24DA944DCF809116 +:1008B0000001909101018F359140B0F345CF8FEF4A +:1008C000D81611F0D12C40CF8091020190910301F4 +:1008D0008F35914018F4DD24D39436CF80910001F8 +:1008E000909101018236924008F42ECFF4CF5058F7 +:1008F000BB27AA270E948F040C94D9050E94CB0520 +:1009000038F00E94D20520F039F49F3F19F426F404 +:100910000C94C8050EF4E095E7FB0C94C205E92F92 +:100920000E94EA0558F3BA17620773078407950710 +:1009300020F079F4A6F50C940C060EF4E0950B2E3D +:10094000BA2FA02D0B01B90190010C01CA01A00121 +:100950001124FF27591B99F0593F50F4503E68F17C +:100960001A16F040A22F232F342F4427585FF3CFBD +:10097000469537952795A795F0405395C9F77EF48E +:100980001F16BA0B620B730B840BBAF09150A1F0D7 +:10099000FF0FBB1F661F771F881FC2F70EC0BA0F5D +:1009A000621F731F841F48F4879577956795B795E5 +:1009B000F7959E3F08F0B0CF9395880F08F09927E0 +:1009C000EE0F9795879508950E94F8040C94D90529 +:1009D0000E94D20558F00E94CB0540F029F45F3FF9 +:1009E00029F00C94C20551110C940D060C94C80505 +:1009F0000E94EA0568F39923B1F3552391F3951BFF +:100A0000550BBB27AA2762177307840738F09F5F2F +:100A10005F4F220F331F441FAA1FA9F335D00E2E9C +:100A20003AF0E0E832D091505040E695001CCAF709 +:100A30002BD0FE2F29D0660F771F881FBB1F2617CC +:100A400037074807AB07B0E809F0BB0B802DBF01A3 +:100A5000FF2793585F4F3AF09E3F510578F00C9472 +:100A6000C2050C940D065F3FE4F3983ED4F38695DF +:100A700077956795B795F7959F5FC9F7880F911D93 +:100A80009695879597F90895E1E0660F771F881F7F +:100A9000BB1F621773078407BA0720F0621B730B32 +:100AA000840BBA0BEE1F88F7E09508950E94F205BB +:100AB00088F09F5798F0B92F9927B751B0F0E1F01F +:100AC000660F771F881F991F1AF0BA95C9F714C0CF +:100AD000B13091F00E940C06B1E008950C940C0620 +:100AE000672F782F8827B85F39F0B93FCCF3869508 +:100AF00077956795B395D9F73EF490958095709565 +:100B000061957F4F8F4F9F4F0895E89409C097FBE1 +:100B10003EF490958095709561957F4F8F4F9F4FD4 +:100B20009923A9F0F92F96E9BB279395F695879518 +:100B300077956795B795F111F8CFFAF4BB0F11F4DB +:100B400060FF1BC06F5F7F4F8F4F9F4F16C0882382 +:100B500011F096E911C0772321F09EE8872F762FB8 +:100B600005C0662371F096E8862F70E060E02AF0F9 +:100B70009A95660F771F881FDAF7880F96958795E5 +:100B800097F9089597F99F6780E870E060E008950D +:100B90009FEF80EC089500240A9416161706180695 +:100BA0000906089500240A94121613061406050671 +:100BB0000895092E0394000C11F4882352F0BB0F02 +:100BC00040F4BF2B11F460FF04C06F5F7F4F8F4F65 +:100BD0009F4F089557FD9058440F551F59F05F3FA0 +:100BE00071F04795880F97FB991F61F09F3F79F04F +:100BF00087950895121613061406551FF2CF4695D1 +:100C0000F1DF08C0161617061806991FF1CF869552 +:100C10007105610508940895E894BB276627772736 +:100C2000CB0197F908950E9426060C94D9050E94DD +:100C3000CB0538F00E94D20520F0952311F00C94DA +:100C4000C2050C94C80511240C940D060E94EA05F7 +:100C500070F3959FC1F3950F50E0551F629FF0010F +:100C6000729FBB27F00DB11D639FAA27F00DB11D28 +:100C7000AA1F649F6627B00DA11D661F829F2227B1 +:100C8000B00DA11D621F739FB00DA11D621F839F38 +:100C9000A00D611D221F749F3327A00D611D231F0E +:100CA000849F600D211D822F762F6A2F11249F575C +:100CB00050409AF0F1F088234AF0EE0FFF1FBB1F5F +:100CC000661F771F881F91505040A9F79E3F51051E +:100CD00080F00C94C2050C940D065F3FE4F3983E3F +:100CE000D4F3869577956795B795F795E7959F5FC8 +:100CF000C1F7FE2B880F911D9695879597F908955A +:100D000097FB072E16F4009407D077FD09D00E94B8 +:100D10009A0607FC05D03EF4909581959F4F089563 +:100D2000709561957F4F0895EE0FFF1F0590F49128 +:100D3000E02D0994AA1BBB1B51E107C0AA1FBB1FD2 +:100D4000A617B70710F0A61BB70B881F991F5A9557 +:100D5000A9F780959095BC01CD010895F894FFCF37 +:0A0D6000E001E001012000000000A6 +:00000001FF diff --git a/sketches/pendulum/pendulum.lss b/sketches/pendulum/pendulum.lss new file mode 100644 index 0000000..d13a71a --- /dev/null +++ b/sketches/pendulum/pendulum.lss @@ -0,0 +1,1929 @@ + +pendulum.elf: Dateiformat elf32-avr + +Sektionen: +Idx Name Größe VMA LMA Datei-Off Ausr. + 0 .data 0000000a 00800100 00000d1e 00000db2 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 00000d1e 00000000 00000000 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .bss 0000000c 0080010a 0080010a 00000dbc 2**0 + ALLOC + 3 .stab 000010d4 00000000 00000000 00000dbc 2**2 + CONTENTS, READONLY, DEBUGGING + 4 .stabstr 00000f4b 00000000 00000000 00001e90 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .comment 00000011 00000000 00000000 00002ddb 2**0 + CONTENTS, READONLY + 6 .note.gnu.avr.deviceinfo 00000040 00000000 00000000 00002dec 2**2 + CONTENTS, READONLY + +Disassembly of section .text: + +00000000 <__vectors>: + 0: 0c 94 3b 00 jmp 0x76 ; 0x76 <__ctors_end> + 4: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 8: 0c 94 5a 00 jmp 0xb4 ; 0xb4 <__vector_2> + c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 10: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 14: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 18: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 1c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 20: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 24: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 28: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 2c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 30: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 34: 0c 94 a3 00 jmp 0x146 ; 0x146 <__vector_13> + 38: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 3c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 40: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 44: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 48: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 4c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 50: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 54: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 58: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 5c: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 60: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 64: 0c 94 58 00 jmp 0xb0 ; 0xb0 <__bad_interrupt> + 68: 96 02 muls r25, r22 + 6a: 9a 02 muls r25, r26 + 6c: 9e 02 muls r25, r30 + 6e: a1 02 muls r26, r17 + 70: a5 02 muls r26, r21 + 72: a9 02 muls r26, r25 + 74: 96 02 muls r25, r22 + +00000076 <__ctors_end>: + 76: 11 24 eor r1, r1 + 78: 1f be out 0x3f, r1 ; 63 + 7a: cf ef ldi r28, 0xFF ; 255 + 7c: d8 e0 ldi r29, 0x08 ; 8 + 7e: de bf out 0x3e, r29 ; 62 + 80: cd bf out 0x3d, r28 ; 61 + +00000082 <__do_copy_data>: + 82: 11 e0 ldi r17, 0x01 ; 1 + 84: a0 e0 ldi r26, 0x00 ; 0 + 86: b1 e0 ldi r27, 0x01 ; 1 + 88: ee e1 ldi r30, 0x1E ; 30 + 8a: fd e0 ldi r31, 0x0D ; 13 + 8c: 02 c0 rjmp .+4 ; 0x92 <__do_copy_data+0x10> + 8e: 05 90 lpm r0, Z+ + 90: 0d 92 st X+, r0 + 92: aa 30 cpi r26, 0x0A ; 10 + 94: b1 07 cpc r27, r17 + 96: d9 f7 brne .-10 ; 0x8e <__do_copy_data+0xc> + +00000098 <__do_clear_bss>: + 98: 21 e0 ldi r18, 0x01 ; 1 + 9a: aa e0 ldi r26, 0x0A ; 10 + 9c: b1 e0 ldi r27, 0x01 ; 1 + 9e: 01 c0 rjmp .+2 ; 0xa2 <.do_clear_bss_start> + +000000a0 <.do_clear_bss_loop>: + a0: 1d 92 st X+, r1 + +000000a2 <.do_clear_bss_start>: + a2: a6 31 cpi r26, 0x16 ; 22 + a4: b2 07 cpc r27, r18 + a6: e1 f7 brne .-8 ; 0xa0 <.do_clear_bss_loop> + a8: 0e 94 f4 02 call 0x5e8 ; 0x5e8
+ ac: 0c 94 8d 06 jmp 0xd1a ; 0xd1a <_exit> + +000000b0 <__bad_interrupt>: + b0: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> + +000000b4 <__vector_2>: +uint32_t volatile time = 0; +uint32_t volatile T_half = 0; +uint32_t volatile oldTime = 0; + +// On External Interrupt: +ISR(INT1_vect) { + b4: 1f 92 push r1 + b6: 0f 92 push r0 + b8: 0f b6 in r0, 0x3f ; 63 + ba: 0f 92 push r0 + bc: 11 24 eor r1, r1 + be: 2f 93 push r18 + c0: 3f 93 push r19 + c2: 8f 93 push r24 + c4: 9f 93 push r25 + c6: af 93 push r26 + c8: bf 93 push r27 + ca: ef 93 push r30 + cc: ff 93 push r31 + cli(); + ce: f8 94 cli + T_half = time + TCNT1; + d0: 80 91 12 01 lds r24, 0x0112 + d4: 90 91 13 01 lds r25, 0x0113 + d8: a0 91 14 01 lds r26, 0x0114 + dc: b0 91 15 01 lds r27, 0x0115 + e0: e4 e8 ldi r30, 0x84 ; 132 + e2: f0 e0 ldi r31, 0x00 ; 0 + e4: 20 81 ld r18, Z + e6: 31 81 ldd r19, Z+1 ; 0x01 + e8: 82 0f add r24, r18 + ea: 93 1f adc r25, r19 + ec: a1 1d adc r26, r1 + ee: b1 1d adc r27, r1 + f0: 80 93 0e 01 sts 0x010E, r24 + f4: 90 93 0f 01 sts 0x010F, r25 + f8: a0 93 10 01 sts 0x0110, r26 + fc: b0 93 11 01 sts 0x0111, r27 + TCNT1 = 0; // Reset Timer/Counter1 + 100: 11 82 std Z+1, r1 ; 0x01 + 102: 10 82 st Z, r1 + time = 0; + 104: 10 92 12 01 sts 0x0112, r1 + 108: 10 92 13 01 sts 0x0113, r1 + 10c: 10 92 14 01 sts 0x0114, r1 + 110: 10 92 15 01 sts 0x0115, r1 + oldTime = 0; + 114: 10 92 0a 01 sts 0x010A, r1 + 118: 10 92 0b 01 sts 0x010B, r1 + 11c: 10 92 0c 01 sts 0x010C, r1 + 120: 10 92 0d 01 sts 0x010D, r1 + PORTC ^= 0x02; + 124: 98 b1 in r25, 0x08 ; 8 + 126: 82 e0 ldi r24, 0x02 ; 2 + 128: 89 27 eor r24, r25 + 12a: 88 b9 out 0x08, r24 ; 8 + //~ min = HUE_MID; + //~ max = HUE_MID; + //~ status = (status == 1 ? -1 : 1); +} + 12c: ff 91 pop r31 + 12e: ef 91 pop r30 + 130: bf 91 pop r27 + 132: af 91 pop r26 + 134: 9f 91 pop r25 + 136: 8f 91 pop r24 + 138: 3f 91 pop r19 + 13a: 2f 91 pop r18 + 13c: 0f 90 pop r0 + 13e: 0f be out 0x3f, r0 ; 63 + 140: 0f 90 pop r0 + 142: 1f 90 pop r1 + 144: 18 95 reti + +00000146 <__vector_13>: + +// On Timer Overflow Interrupt: +ISR(TIMER1_OVF_vect) { + 146: 1f 92 push r1 + 148: 0f 92 push r0 + 14a: 0f b6 in r0, 0x3f ; 63 + 14c: 0f 92 push r0 + 14e: 11 24 eor r1, r1 + 150: 8f 93 push r24 + 152: 9f 93 push r25 + 154: af 93 push r26 + 156: bf 93 push r27 + time += 0x00010000; + 158: 80 91 12 01 lds r24, 0x0112 + 15c: 90 91 13 01 lds r25, 0x0113 + 160: a0 91 14 01 lds r26, 0x0114 + 164: b0 91 15 01 lds r27, 0x0115 + 168: 11 96 adiw r26, 0x01 ; 1 + 16a: 80 93 12 01 sts 0x0112, r24 + 16e: 90 93 13 01 sts 0x0113, r25 + 172: a0 93 14 01 sts 0x0114, r26 + 176: b0 93 15 01 sts 0x0115, r27 +} + 17a: bf 91 pop r27 + 17c: af 91 pop r26 + 17e: 9f 91 pop r25 + 180: 8f 91 pop r24 + 182: 0f 90 pop r0 + 184: 0f be out 0x3f, r0 ; 63 + 186: 0f 90 pop r0 + 188: 1f 90 pop r1 + 18a: 18 95 reti + +0000018c : +#define wait14 wait8; wait6 +#define wait15 wait14; w_nop1 + +// WS2812B protocol +inline void writeZero() { + PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + 18c: 40 9a sbi 0x08, 0 ; 8 + wait6; + 18e: 00 c0 rjmp .+0 ; 0x190 + 190: 00 c0 rjmp .+0 ; 0x192 + 192: 00 c0 rjmp .+0 ; 0x194 + PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + 194: 40 98 cbi 0x08, 0 ; 8 + wait15; + 196: 00 c0 rjmp .+0 ; 0x198 + 198: 00 c0 rjmp .+0 ; 0x19a + 19a: 00 c0 rjmp .+0 ; 0x19c + 19c: 00 c0 rjmp .+0 ; 0x19e + 19e: 00 c0 rjmp .+0 ; 0x1a0 + 1a0: 00 c0 rjmp .+0 ; 0x1a2 + 1a2: 00 c0 rjmp .+0 ; 0x1a4 + 1a4: 00 00 nop + 1a6: 08 95 ret + +000001a8 : +} + +// WS2812B protocol +inline void writeOne() { + PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + 1a8: 40 9a sbi 0x08, 0 ; 8 + wait14; + 1aa: 00 c0 rjmp .+0 ; 0x1ac + 1ac: 00 c0 rjmp .+0 ; 0x1ae + 1ae: 00 c0 rjmp .+0 ; 0x1b0 + 1b0: 00 c0 rjmp .+0 ; 0x1b2 + 1b2: 00 c0 rjmp .+0 ; 0x1b4 + 1b4: 00 c0 rjmp .+0 ; 0x1b6 + 1b6: 00 c0 rjmp .+0 ; 0x1b8 + PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + 1b8: 40 98 cbi 0x08, 0 ; 8 + wait8; + 1ba: 00 c0 rjmp .+0 ; 0x1bc + 1bc: 00 c0 rjmp .+0 ; 0x1be + 1be: 00 c0 rjmp .+0 ; 0x1c0 + 1c0: 00 c0 rjmp .+0 ; 0x1c2 + 1c2: 08 95 ret + +000001c4 : +} + +inline void writeRGB(uint8_t red, uint8_t green, uint8_t blue) { + 1c4: af 92 push r10 + 1c6: bf 92 push r11 + 1c8: cf 92 push r12 + 1ca: df 92 push r13 + 1cc: ef 92 push r14 + 1ce: ff 92 push r15 + 1d0: 0f 93 push r16 + 1d2: 1f 93 push r17 + 1d4: cf 93 push r28 + 1d6: df 93 push r29 + 1d8: c8 2e mov r12, r24 + 1da: e4 2e mov r14, r20 + 1dc: c8 e0 ldi r28, 0x08 ; 8 + 1de: d0 e0 ldi r29, 0x00 ; 0 + int i; + + for( i = 128; i > 0; i >>= 1 ) { + 1e0: 00 e8 ldi r16, 0x80 ; 128 + 1e2: 10 e0 ldi r17, 0x00 ; 0 + if( green & i ){ + 1e4: a6 2e mov r10, r22 + 1e6: b1 2c mov r11, r1 + 1e8: c8 01 movw r24, r16 + 1ea: 8a 21 and r24, r10 + 1ec: 9b 21 and r25, r11 + 1ee: 89 2b or r24, r25 + 1f0: 19 f0 breq .+6 ; 0x1f8 + writeOne(); + 1f2: 0e 94 d4 00 call 0x1a8 ; 0x1a8 + 1f6: 02 c0 rjmp .+4 ; 0x1fc + } else { + writeZero(); + 1f8: 0e 94 c6 00 call 0x18c ; 0x18c +} + +inline void writeRGB(uint8_t red, uint8_t green, uint8_t blue) { + int i; + + for( i = 128; i > 0; i >>= 1 ) { + 1fc: 15 95 asr r17 + 1fe: 07 95 ror r16 + 200: 21 97 sbiw r28, 0x01 ; 1 + 202: 91 f7 brne .-28 ; 0x1e8 + 204: c8 e0 ldi r28, 0x08 ; 8 + 206: d0 e0 ldi r29, 0x00 ; 0 + 208: 00 e8 ldi r16, 0x80 ; 128 + 20a: 10 e0 ldi r17, 0x00 ; 0 + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + if( red & i ){ + 20c: d1 2c mov r13, r1 + 20e: c8 01 movw r24, r16 + 210: 8c 21 and r24, r12 + 212: 9d 21 and r25, r13 + 214: 89 2b or r24, r25 + 216: 19 f0 breq .+6 ; 0x21e + writeOne(); + 218: 0e 94 d4 00 call 0x1a8 ; 0x1a8 + 21c: 02 c0 rjmp .+4 ; 0x222 + } else { + writeZero(); + 21e: 0e 94 c6 00 call 0x18c ; 0x18c + } else { + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + 222: 15 95 asr r17 + 224: 07 95 ror r16 + 226: 21 97 sbiw r28, 0x01 ; 1 + 228: 91 f7 brne .-28 ; 0x20e + 22a: c8 e0 ldi r28, 0x08 ; 8 + 22c: d0 e0 ldi r29, 0x00 ; 0 + 22e: 00 e8 ldi r16, 0x80 ; 128 + 230: 10 e0 ldi r17, 0x00 ; 0 + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + if( blue & i ){ + 232: f1 2c mov r15, r1 + 234: c8 01 movw r24, r16 + 236: 8e 21 and r24, r14 + 238: 9f 21 and r25, r15 + 23a: 89 2b or r24, r25 + 23c: 19 f0 breq .+6 ; 0x244 + writeOne(); + 23e: 0e 94 d4 00 call 0x1a8 ; 0x1a8 + 242: 02 c0 rjmp .+4 ; 0x248 + } else { + writeZero(); + 244: 0e 94 c6 00 call 0x18c ; 0x18c + } else { + writeZero(); + } + } + + for( i = 128; i > 0; i >>= 1 ) { + 248: 15 95 asr r17 + 24a: 07 95 ror r16 + 24c: 21 97 sbiw r28, 0x01 ; 1 + 24e: 91 f7 brne .-28 ; 0x234 + writeOne(); + } else { + writeZero(); + } + } +} + 250: df 91 pop r29 + 252: cf 91 pop r28 + 254: 1f 91 pop r17 + 256: 0f 91 pop r16 + 258: ff 90 pop r15 + 25a: ef 90 pop r14 + 25c: df 90 pop r13 + 25e: cf 90 pop r12 + 260: bf 90 pop r11 + 262: af 90 pop r10 + 264: 08 95 ret + +00000266 : +#include "color_hsv.h" + +void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors) { + 266: 2f 92 push r2 + 268: 3f 92 push r3 + 26a: 4f 92 push r4 + 26c: 5f 92 push r5 + 26e: 6f 92 push r6 + 270: 7f 92 push r7 + 272: 8f 92 push r8 + 274: 9f 92 push r9 + 276: af 92 push r10 + 278: bf 92 push r11 + 27a: cf 92 push r12 + 27c: df 92 push r13 + 27e: ef 92 push r14 + 280: ff 92 push r15 + 282: 0f 93 push r16 + 284: 1f 93 push r17 + 286: cf 93 push r28 + 288: df 93 push r29 + 28a: cd b7 in r28, 0x3d ; 61 + 28c: de b7 in r29, 0x3e ; 62 + 28e: 2a 97 sbiw r28, 0x0a ; 10 + 290: 0f b6 in r0, 0x3f ; 63 + 292: f8 94 cli + 294: de bf out 0x3e, r29 ; 62 + 296: 0f be out 0x3f, r0 ; 63 + 298: cd bf out 0x3d, r28 ; 61 + 29a: d8 2e mov r13, r24 + 29c: c9 2e mov r12, r25 + 29e: f7 01 movw r30, r14 + if( steps == 1 ) { + 2a0: 01 30 cpi r16, 0x01 ; 1 + 2a2: 11 05 cpc r17, r1 + 2a4: 01 f1 breq .+64 ; 0x2e6 + return; + } + + for( size_t i = 0; i < steps; i++ ) { + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + 2a6: 3b 01 movw r6, r22 + 2a8: 29 01 movw r4, r18 + 2aa: 46 1a sub r4, r22 + 2ac: 57 0a sbc r5, r23 + 2ae: 84 2f mov r24, r20 + 2b0: 90 e0 ldi r25, 0x00 ; 0 + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + 2b2: bc 01 movw r22, r24 + 2b4: 6d 19 sub r22, r13 + 2b6: 71 09 sbc r23, r1 + 2b8: 7e 83 std Y+6, r23 ; 0x06 + 2ba: 6d 83 std Y+5, r22 ; 0x05 + 2bc: 85 2f mov r24, r21 + 2be: 90 e0 ldi r25, 0x00 ; 0 + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + 2c0: 9c 01 movw r18, r24 + 2c2: 2c 19 sub r18, r12 + 2c4: 31 09 sbc r19, r1 + 2c6: 38 87 std Y+8, r19 ; 0x08 + 2c8: 2f 83 std Y+7, r18 ; 0x07 + 2ca: 33 96 adiw r30, 0x03 ; 3 + 2cc: 1a 86 std Y+10, r1 ; 0x0a + 2ce: 19 86 std Y+9, r1 ; 0x09 + 2d0: e1 2c mov r14, r1 + 2d2: f1 2c mov r15, r1 + 2d4: 80 e0 ldi r24, 0x00 ; 0 + 2d6: 90 e0 ldi r25, 0x00 ; 0 + 2d8: 20 e0 ldi r18, 0x00 ; 0 + 2da: 30 e0 ldi r19, 0x00 ; 0 + return; + } + + for( size_t i = 0; i < steps; i++ ) { + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + 2dc: 58 01 movw r10, r16 + 2de: 41 e0 ldi r20, 0x01 ; 1 + 2e0: a4 1a sub r10, r20 + 2e2: b1 08 sbc r11, r1 + 2e4: 05 c0 rjmp .+10 ; 0x2f0 +#include "color_hsv.h" + +void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors) { + if( steps == 1 ) { + colors[0] = start; + 2e6: 60 83 st Z, r22 + 2e8: 71 83 std Z+1, r23 ; 0x01 + 2ea: 82 83 std Z+2, r24 ; 0x02 + 2ec: 93 83 std Z+3, r25 ; 0x03 + return; + 2ee: 3d c0 rjmp .+122 ; 0x36a + 2f0: 1c 01 movw r2, r24 + 2f2: 24 0c add r2, r4 + 2f4: 35 1c adc r3, r5 + 2f6: 4d 81 ldd r20, Y+5 ; 0x05 + 2f8: 5e 81 ldd r21, Y+6 ; 0x06 + 2fa: 4e 0d add r20, r14 + 2fc: 5f 1d adc r21, r15 + 2fe: 5a 83 std Y+2, r21 ; 0x02 + 300: 49 83 std Y+1, r20 ; 0x01 + 302: 4f 81 ldd r20, Y+7 ; 0x07 + 304: 58 85 ldd r21, Y+8 ; 0x08 + 306: 69 85 ldd r22, Y+9 ; 0x09 + 308: 7a 85 ldd r23, Y+10 ; 0x0a + 30a: 46 0f add r20, r22 + 30c: 57 1f adc r21, r23 + 30e: 5c 83 std Y+4, r21 ; 0x04 + 310: 4b 83 std Y+3, r20 ; 0x03 + } + + for( size_t i = 0; i < steps; i++ ) { + 312: 20 17 cp r18, r16 + 314: 31 07 cpc r19, r17 + 316: 49 f1 breq .+82 ; 0x36a + 318: 4f 01 movw r8, r30 + 31a: 53 e0 ldi r21, 0x03 ; 3 + 31c: 85 1a sub r8, r21 + 31e: 91 08 sbc r9, r1 + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + 320: b5 01 movw r22, r10 + 322: 0e 94 5f 06 call 0xcbe ; 0xcbe <__divmodhi4> + 326: 66 0d add r22, r6 + 328: 77 1d adc r23, r7 + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + colors[i] = tmp; + 32a: d4 01 movw r26, r8 + 32c: 6d 93 st X+, r22 + 32e: 7c 93 st X, r23 + 330: 4f 01 movw r8, r30 + 332: b1 e0 ldi r27, 0x01 ; 1 + 334: 8b 1a sub r8, r27 + 336: 91 08 sbc r9, r1 + } + + for( size_t i = 0; i < steps; i++ ) { + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + 338: c7 01 movw r24, r14 + 33a: b5 01 movw r22, r10 + 33c: 0e 94 5f 06 call 0xcbe ; 0xcbe <__divmodhi4> + 340: 6d 0d add r22, r13 + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + colors[i] = tmp; + 342: d4 01 movw r26, r8 + 344: 6c 93 st X, r22 + + for( size_t i = 0; i < steps; i++ ) { + hsv_t tmp; + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + 346: 89 85 ldd r24, Y+9 ; 0x09 + 348: 9a 85 ldd r25, Y+10 ; 0x0a + 34a: b5 01 movw r22, r10 + 34c: 0e 94 5f 06 call 0xcbe ; 0xcbe <__divmodhi4> + 350: 6c 0d add r22, r12 + colors[i] = tmp; + 352: 60 83 st Z, r22 + if( steps == 1 ) { + colors[0] = start; + return; + } + + for( size_t i = 0; i < steps; i++ ) { + 354: 2f 5f subi r18, 0xFF ; 255 + 356: 3f 4f sbci r19, 0xFF ; 255 + 358: 34 96 adiw r30, 0x04 ; 4 + 35a: 4b 81 ldd r20, Y+3 ; 0x03 + 35c: 5c 81 ldd r21, Y+4 ; 0x04 + 35e: 5a 87 std Y+10, r21 ; 0x0a + 360: 49 87 std Y+9, r20 ; 0x09 + 362: e9 80 ldd r14, Y+1 ; 0x01 + 364: fa 80 ldd r15, Y+2 ; 0x02 + 366: c1 01 movw r24, r2 + 368: c3 cf rjmp .-122 ; 0x2f0 + tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1)); + tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1)); + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + colors[i] = tmp; + } +} + 36a: 2a 96 adiw r28, 0x0a ; 10 + 36c: 0f b6 in r0, 0x3f ; 63 + 36e: f8 94 cli + 370: de bf out 0x3e, r29 ; 62 + 372: 0f be out 0x3f, r0 ; 63 + 374: cd bf out 0x3d, r28 ; 61 + 376: df 91 pop r29 + 378: cf 91 pop r28 + 37a: 1f 91 pop r17 + 37c: 0f 91 pop r16 + 37e: ff 90 pop r15 + 380: ef 90 pop r14 + 382: df 90 pop r13 + 384: cf 90 pop r12 + 386: bf 90 pop r11 + 388: af 90 pop r10 + 38a: 9f 90 pop r9 + 38c: 8f 90 pop r8 + 38e: 7f 90 pop r7 + 390: 6f 90 pop r6 + 392: 5f 90 pop r5 + 394: 4f 90 pop r4 + 396: 3f 90 pop r3 + 398: 2f 90 pop r2 + 39a: 08 95 ret + +0000039c : + for(size_t i = 0; i < count; ++i) { + rgbList[i] = hsv2rgb(&hsvList[i]); + } +} + +rgb_t hsv2rgb(hsv_t* hsv) { + 39c: 2f 92 push r2 + 39e: 3f 92 push r3 + 3a0: 4f 92 push r4 + 3a2: 5f 92 push r5 + 3a4: 6f 92 push r6 + 3a6: 7f 92 push r7 + 3a8: 8f 92 push r8 + 3aa: 9f 92 push r9 + 3ac: af 92 push r10 + 3ae: bf 92 push r11 + 3b0: cf 92 push r12 + 3b2: df 92 push r13 + 3b4: ef 92 push r14 + 3b6: ff 92 push r15 + 3b8: 0f 93 push r16 + 3ba: 1f 93 push r17 + 3bc: cf 93 push r28 + 3be: df 93 push r29 + 3c0: 00 d0 rcall .+0 ; 0x3c2 + 3c2: 00 d0 rcall .+0 ; 0x3c4 + 3c4: cd b7 in r28, 0x3d ; 61 + 3c6: de b7 in r29, 0x3e ; 62 + rgb_t res; + + if(hsv->sat == 0) { + 3c8: fc 01 movw r30, r24 + 3ca: b2 80 ldd r11, Z+2 ; 0x02 + 3cc: 33 80 ldd r3, Z+3 ; 0x03 + 3ce: b1 10 cpse r11, r1 + 3d0: 04 c0 rjmp .+8 ; 0x3da + res.r = res.g = res.b = hsv->val; + 3d2: 23 2c mov r2, r3 + 3d4: 3b 82 std Y+3, r3 ; 0x03 + 3d6: 3c 82 std Y+4, r3 ; 0x04 + 3d8: c2 c0 rjmp .+388 ; 0x55e + 3da: fc 01 movw r30, r24 + } else { + float hue = (float) (hsv->hue<360?hsv->hue:hsv->hue-360); + 3dc: 00 81 ld r16, Z + 3de: 11 81 ldd r17, Z+1 ; 0x01 + 3e0: b8 01 movw r22, r16 + 3e2: 08 36 cpi r16, 0x68 ; 104 + 3e4: f1 e0 ldi r31, 0x01 ; 1 + 3e6: 1f 07 cpc r17, r31 + 3e8: 10 f0 brcs .+4 ; 0x3ee + 3ea: 68 56 subi r22, 0x68 ; 104 + 3ec: 71 40 sbci r23, 0x01 ; 1 + 3ee: 80 e0 ldi r24, 0x00 ; 0 + 3f0: 90 e0 ldi r25, 0x00 ; 0 + 3f2: 0e 94 64 05 call 0xac8 ; 0xac8 <__floatunsisf> + 3f6: 2b 01 movw r4, r22 + 3f8: 3c 01 movw r6, r24 + float val = ((float) hsv->val ) / 100.0; + 3fa: 63 2d mov r22, r3 + 3fc: 70 e0 ldi r23, 0x00 ; 0 + 3fe: 80 e0 ldi r24, 0x00 ; 0 + 400: 90 e0 ldi r25, 0x00 ; 0 + 402: 0e 94 64 05 call 0xac8 ; 0xac8 <__floatunsisf> + 406: 20 e0 ldi r18, 0x00 ; 0 + 408: 30 e0 ldi r19, 0x00 ; 0 + 40a: 48 ec ldi r20, 0xC8 ; 200 + 40c: 52 e4 ldi r21, 0x42 ; 66 + 40e: 0e 94 c3 04 call 0x986 ; 0x986 <__divsf3> + 412: 6b 01 movw r12, r22 + 414: 7c 01 movw r14, r24 + float sat = ((float) hsv->sat ) / 100.0; + 416: 6b 2d mov r22, r11 + 418: 70 e0 ldi r23, 0x00 ; 0 + 41a: 80 e0 ldi r24, 0x00 ; 0 + 41c: 90 e0 ldi r25, 0x00 ; 0 + 41e: 0e 94 64 05 call 0xac8 ; 0xac8 <__floatunsisf> + 422: 20 e0 ldi r18, 0x00 ; 0 + 424: 30 e0 ldi r19, 0x00 ; 0 + 426: 48 ec ldi r20, 0xC8 ; 200 + 428: 52 e4 ldi r21, 0x42 ; 66 + 42a: 0e 94 c3 04 call 0x986 ; 0x986 <__divsf3> + 42e: 4b 01 movw r8, r22 + 430: 5c 01 movw r10, r24 + + uint8_t h = hue / 60; + 432: 20 e0 ldi r18, 0x00 ; 0 + 434: 30 e0 ldi r19, 0x00 ; 0 + 436: 40 e7 ldi r20, 0x70 ; 112 + 438: 52 e4 ldi r21, 0x42 ; 66 + 43a: c3 01 movw r24, r6 + 43c: b2 01 movw r22, r4 + 43e: 0e 94 c3 04 call 0x986 ; 0x986 <__divsf3> + 442: 2b 01 movw r4, r22 + 444: 3c 01 movw r6, r24 + 446: 0e 94 35 05 call 0xa6a ; 0xa6a <__fixunssfsi> + 44a: 6a 83 std Y+2, r22 ; 0x02 + float f = ( hue / 60 ) - h; + 44c: 70 e0 ldi r23, 0x00 ; 0 + 44e: 80 e0 ldi r24, 0x00 ; 0 + 450: 90 e0 ldi r25, 0x00 ; 0 + 452: 0e 94 66 05 call 0xacc ; 0xacc <__floatsisf> + 456: 9b 01 movw r18, r22 + 458: ac 01 movw r20, r24 + 45a: c3 01 movw r24, r6 + 45c: b2 01 movw r22, r4 + 45e: 0e 94 56 04 call 0x8ac ; 0x8ac <__subsf3> + 462: 2b 01 movw r4, r22 + 464: 3c 01 movw r6, r24 + + uint8_t p = RGB_MAX * ( val * ( 1 - sat )); + 466: a5 01 movw r20, r10 + 468: 94 01 movw r18, r8 + 46a: 60 e0 ldi r22, 0x00 ; 0 + 46c: 70 e0 ldi r23, 0x00 ; 0 + 46e: 80 e8 ldi r24, 0x80 ; 128 + 470: 9f e3 ldi r25, 0x3F ; 63 + 472: 0e 94 56 04 call 0x8ac ; 0x8ac <__subsf3> + 476: 9b 01 movw r18, r22 + 478: ac 01 movw r20, r24 + 47a: c7 01 movw r24, r14 + 47c: b6 01 movw r22, r12 + 47e: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 482: 20 e0 ldi r18, 0x00 ; 0 + 484: 30 e0 ldi r19, 0x00 ; 0 + 486: 40 e0 ldi r20, 0x00 ; 0 + 488: 53 e4 ldi r21, 0x43 ; 67 + 48a: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 48e: 0e 94 35 05 call 0xa6a ; 0xa6a <__fixunssfsi> + 492: 26 2e mov r2, r22 + uint8_t q = RGB_MAX * ( val * ( 1 - sat * f )); + 494: a3 01 movw r20, r6 + 496: 92 01 movw r18, r4 + 498: c5 01 movw r24, r10 + 49a: b4 01 movw r22, r8 + 49c: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 4a0: 9b 01 movw r18, r22 + 4a2: ac 01 movw r20, r24 + 4a4: 60 e0 ldi r22, 0x00 ; 0 + 4a6: 70 e0 ldi r23, 0x00 ; 0 + 4a8: 80 e8 ldi r24, 0x80 ; 128 + 4aa: 9f e3 ldi r25, 0x3F ; 63 + 4ac: 0e 94 56 04 call 0x8ac ; 0x8ac <__subsf3> + 4b0: 9b 01 movw r18, r22 + 4b2: ac 01 movw r20, r24 + 4b4: c7 01 movw r24, r14 + 4b6: b6 01 movw r22, r12 + 4b8: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 4bc: 20 e0 ldi r18, 0x00 ; 0 + 4be: 30 e0 ldi r19, 0x00 ; 0 + 4c0: 40 e0 ldi r20, 0x00 ; 0 + 4c2: 53 e4 ldi r21, 0x43 ; 67 + 4c4: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 4c8: 0e 94 35 05 call 0xa6a ; 0xa6a <__fixunssfsi> + 4cc: 69 83 std Y+1, r22 ; 0x01 + uint8_t t = RGB_MAX * ( val * ( 1 - sat * ( 1 - f ))); + 4ce: a3 01 movw r20, r6 + 4d0: 92 01 movw r18, r4 + 4d2: 60 e0 ldi r22, 0x00 ; 0 + 4d4: 70 e0 ldi r23, 0x00 ; 0 + 4d6: 80 e8 ldi r24, 0x80 ; 128 + 4d8: 9f e3 ldi r25, 0x3F ; 63 + 4da: 0e 94 56 04 call 0x8ac ; 0x8ac <__subsf3> + 4de: 9b 01 movw r18, r22 + 4e0: ac 01 movw r20, r24 + 4e2: c5 01 movw r24, r10 + 4e4: b4 01 movw r22, r8 + 4e6: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 4ea: 9b 01 movw r18, r22 + 4ec: ac 01 movw r20, r24 + 4ee: 60 e0 ldi r22, 0x00 ; 0 + 4f0: 70 e0 ldi r23, 0x00 ; 0 + 4f2: 80 e8 ldi r24, 0x80 ; 128 + 4f4: 9f e3 ldi r25, 0x3F ; 63 + 4f6: 0e 94 56 04 call 0x8ac ; 0x8ac <__subsf3> + 4fa: 9b 01 movw r18, r22 + 4fc: ac 01 movw r20, r24 + 4fe: c7 01 movw r24, r14 + 500: b6 01 movw r22, r12 + 502: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 506: 20 e0 ldi r18, 0x00 ; 0 + 508: 30 e0 ldi r19, 0x00 ; 0 + 50a: 40 e0 ldi r20, 0x00 ; 0 + 50c: 53 e4 ldi r21, 0x43 ; 67 + 50e: 0e 94 f2 05 call 0xbe4 ; 0xbe4 <__mulsf3> + 512: 0e 94 35 05 call 0xa6a ; 0xa6a <__fixunssfsi> + + switch(h) { + 516: 2a 81 ldd r18, Y+2 ; 0x02 + 518: 82 2f mov r24, r18 + 51a: 90 e0 ldi r25, 0x00 ; 0 + 51c: 87 30 cpi r24, 0x07 ; 7 + 51e: 91 05 cpc r25, r1 + 520: e8 f4 brcc .+58 ; 0x55c + 522: fc 01 movw r30, r24 + 524: ec 5c subi r30, 0xCC ; 204 + 526: ff 4f sbci r31, 0xFF ; 255 + 528: 0c 94 73 06 jmp 0xce6 ; 0xce6 <__tablejump2__> + case 0: + case 6: res.r = hsv->val; res.g = t; res.b = p; break; + 52c: 2b 82 std Y+3, r2 ; 0x03 + 52e: 6c 83 std Y+4, r22 ; 0x04 + 530: 23 2c mov r2, r3 + 532: 15 c0 rjmp .+42 ; 0x55e + case 1: res.r = q; res.g = hsv->val; res.b = p; break; + 534: 2b 82 std Y+3, r2 ; 0x03 + 536: 3c 82 std Y+4, r3 ; 0x04 + 538: 29 80 ldd r2, Y+1 ; 0x01 + 53a: 11 c0 rjmp .+34 ; 0x55e + case 2: res.r = p; res.g = hsv->val; res.b = t; break; + 53c: 6b 83 std Y+3, r22 ; 0x03 + 53e: 3c 82 std Y+4, r3 ; 0x04 + 540: 0e c0 rjmp .+28 ; 0x55e + case 3: res.r = p; res.g = q; res.b = hsv->val; break; + 542: 3b 82 std Y+3, r3 ; 0x03 + 544: 89 81 ldd r24, Y+1 ; 0x01 + 546: 8c 83 std Y+4, r24 ; 0x04 + 548: 0a c0 rjmp .+20 ; 0x55e + case 4: res.r = t; res.g = p; res.b = hsv->val; break; + 54a: 3b 82 std Y+3, r3 ; 0x03 + 54c: 2c 82 std Y+4, r2 ; 0x04 + 54e: 26 2e mov r2, r22 + 550: 06 c0 rjmp .+12 ; 0x55e + case 5: res.r = hsv->hue; res.g = p; res.b = q; break; + 552: e9 81 ldd r30, Y+1 ; 0x01 + 554: eb 83 std Y+3, r30 ; 0x03 + 556: 2c 82 std Y+4, r2 ; 0x04 + 558: 20 2e mov r2, r16 + 55a: 01 c0 rjmp .+2 ; 0x55e + + uint8_t p = RGB_MAX * ( val * ( 1 - sat )); + uint8_t q = RGB_MAX * ( val * ( 1 - sat * f )); + uint8_t t = RGB_MAX * ( val * ( 1 - sat * ( 1 - f ))); + + switch(h) { + 55c: 21 2c mov r2, r1 + case 5: res.r = hsv->hue; res.g = p; res.b = q; break; + + } + } + return res; +} + 55e: 62 2d mov r22, r2 + 560: 7c 81 ldd r23, Y+4 ; 0x04 + 562: 8b 81 ldd r24, Y+3 ; 0x03 + 564: 0f 90 pop r0 + 566: 0f 90 pop r0 + 568: 0f 90 pop r0 + 56a: 0f 90 pop r0 + 56c: df 91 pop r29 + 56e: cf 91 pop r28 + 570: 1f 91 pop r17 + 572: 0f 91 pop r16 + 574: ff 90 pop r15 + 576: ef 90 pop r14 + 578: df 90 pop r13 + 57a: cf 90 pop r12 + 57c: bf 90 pop r11 + 57e: af 90 pop r10 + 580: 9f 90 pop r9 + 582: 8f 90 pop r8 + 584: 7f 90 pop r7 + 586: 6f 90 pop r6 + 588: 5f 90 pop r5 + 58a: 4f 90 pop r4 + 58c: 3f 90 pop r3 + 58e: 2f 90 pop r2 + 590: 08 95 ret + +00000592 : + tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1)); + colors[i] = tmp; + } +} + +void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count) { + 592: cf 92 push r12 + 594: df 92 push r13 + 596: ef 92 push r14 + 598: ff 92 push r15 + 59a: 0f 93 push r16 + 59c: 1f 93 push r17 + 59e: cf 93 push r28 + 5a0: df 93 push r29 + 5a2: 6a 01 movw r12, r20 + 5a4: eb 01 movw r28, r22 + 5a6: 7c 01 movw r14, r24 + for(size_t i = 0; i < count; ++i) { + 5a8: 00 e0 ldi r16, 0x00 ; 0 + 5aa: 10 e0 ldi r17, 0x00 ; 0 + 5ac: 0c 15 cp r16, r12 + 5ae: 1d 05 cpc r17, r13 + 5b0: 61 f0 breq .+24 ; 0x5ca + rgbList[i] = hsv2rgb(&hsvList[i]); + 5b2: c7 01 movw r24, r14 + 5b4: 0e 94 ce 01 call 0x39c ; 0x39c + 5b8: 69 93 st Y+, r22 + 5ba: 79 93 st Y+, r23 + 5bc: 89 93 st Y+, r24 + colors[i] = tmp; + } +} + +void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count) { + for(size_t i = 0; i < count; ++i) { + 5be: 0f 5f subi r16, 0xFF ; 255 + 5c0: 1f 4f sbci r17, 0xFF ; 255 + 5c2: 84 e0 ldi r24, 0x04 ; 4 + 5c4: e8 0e add r14, r24 + 5c6: f1 1c adc r15, r1 + 5c8: f1 cf rjmp .-30 ; 0x5ac + rgbList[i] = hsv2rgb(&hsvList[i]); + } +} + 5ca: df 91 pop r29 + 5cc: cf 91 pop r28 + 5ce: 1f 91 pop r17 + 5d0: 0f 91 pop r16 + 5d2: ff 90 pop r15 + 5d4: ef 90 pop r14 + 5d6: df 90 pop r13 + 5d8: cf 90 pop r12 + 5da: 08 95 ret + +000005dc : + 5dc: 28 2f mov r18, r24 + 5de: 86 2f mov r24, r22 + 5e0: 62 2f mov r22, r18 + 5e2: 79 2f mov r23, r25 + 5e4: 94 2f mov r25, r20 + 5e6: 08 95 ret + +000005e8
: +// On Timer Overflow Interrupt: +ISR(TIMER1_OVF_vect) { + time += 0x00010000; +} + +int main(void) { + 5e8: cf 93 push r28 + 5ea: df 93 push r29 + 5ec: cd b7 in r28, 0x3d ; 61 + 5ee: de b7 in r29, 0x3e ; 62 + 5f0: c2 5d subi r28, 0xD2 ; 210 + 5f2: d1 09 sbc r29, r1 + 5f4: 0f b6 in r0, 0x3f ; 63 + 5f6: f8 94 cli + 5f8: de bf out 0x3e, r29 ; 62 + 5fa: 0f be out 0x3f, r0 ; 63 + 5fc: cd bf out 0x3d, r28 ; 61 + + EIMSK |= 0x02; // External Interrupt Mask Register + 5fe: e9 9a sbi 0x1d, 1 ; 29 + // Enable INT1 (PIN5) for interrupt + EICRA |= 0x0c; // External Interrupt Control Register + 600: 80 91 69 00 lds r24, 0x0069 + 604: 8c 60 ori r24, 0x0C ; 12 + 606: 80 93 69 00 sts 0x0069, r24 + // INT1 on rising edge + + TIMSK1 |= 0x01; // Timer/Counter1 Interrupt Mask Register + 60a: 80 91 6f 00 lds r24, 0x006F + 60e: 81 60 ori r24, 0x01 ; 1 + 610: 80 93 6f 00 sts 0x006F, r24 + // Enable overflow interrupt + TCCR1B |= 0x01; // Timer/Counter1 Control Register B + 614: 80 91 81 00 lds r24, 0x0081 + 618: 81 60 ori r24, 0x01 ; 1 + 61a: 80 93 81 00 sts 0x0081, r24 + // Prescale Factor 1 + + SREG |= 0x80; // Status Register + 61e: 8f b7 in r24, 0x3f ; 63 + 620: 80 68 ori r24, 0x80 ; 128 + 622: 8f bf out 0x3f, r24 ; 63 + // Enable global interrupts + + DDRC = 0x3f; // Digital Direction PORTC[5:0] = output + 624: 8f e3 ldi r24, 0x3F ; 63 + 626: 87 b9 out 0x07, r24 ; 7 + PORTC = 0x00; + 628: 18 b8 out 0x08, r1 ; 8 + + // Init color + hsv_t colorsHSV[LEDS]; + rgb_t colorsRGB[LEDS]; + interpolate( + 62a: 80 91 00 01 lds r24, 0x0100 + 62e: 90 91 01 01 lds r25, 0x0101 + 632: 44 e1 ldi r20, 0x14 ; 20 + 634: 64 e6 ldi r22, 0x64 ; 100 + 636: 0e 94 ee 02 call 0x5dc ; 0x5dc + 63a: 4b 01 movw r8, r22 + 63c: 5c 01 movw r10, r24 + 63e: 80 91 02 01 lds r24, 0x0102 + 642: 90 91 03 01 lds r25, 0x0103 + 646: 44 e1 ldi r20, 0x14 ; 20 + 648: 64 e6 ldi r22, 0x64 ; 100 + 64a: 0e 94 ee 02 call 0x5dc ; 0x5dc + 64e: 9e 01 movw r18, r28 + 650: 2f 5f subi r18, 0xFF ; 255 + 652: 3f 4f sbci r19, 0xFF ; 255 + 654: 79 01 movw r14, r18 + 656: 0e e1 ldi r16, 0x1E ; 30 + 658: 10 e0 ldi r17, 0x00 ; 0 + 65a: a5 01 movw r20, r10 + 65c: 94 01 movw r18, r8 + 65e: 0e 94 33 01 call 0x266 ; 0x266 + init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 662: 4e e1 ldi r20, 0x1E ; 30 + 664: 50 e0 ldi r21, 0x00 ; 0 + 666: be 01 movw r22, r28 + 668: 67 58 subi r22, 0x87 ; 135 + 66a: 7f 4f sbci r23, 0xFF ; 255 + 66c: c7 01 movw r24, r14 + 66e: 0e 94 c9 02 call 0x592 ; 0x592 + 672: 49 e7 ldi r20, 0x79 ; 121 + 674: a4 2e mov r10, r20 + 676: b1 2c mov r11, r1 + 678: ac 0e add r10, r28 + 67a: bd 1e adc r11, r29 + 67c: 32 e0 ldi r19, 0x02 ; 2 + 67e: a3 0e add r10, r19 + 680: b1 1c adc r11, r1 + 682: 4e 01 movw r8, r28 + 684: 85 ed ldi r24, 0xD5 ; 213 + 686: 88 0e add r8, r24 + 688: 91 1c adc r9, r1 + 68a: 85 01 movw r16, r10 + 68c: d8 01 movw r26, r16 + 68e: 11 97 sbiw r26, 0x01 ; 1 + 690: c8 01 movw r24, r16 + 692: 02 97 sbiw r24, 0x02 ; 2 + // Assign color + for(int i = 0; i < LEDS; i++) { + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 694: f8 01 movw r30, r16 + 696: 40 81 ld r20, Z + 698: 6c 91 ld r22, X + 69a: fc 01 movw r30, r24 + 69c: 80 81 ld r24, Z + 69e: 0e 94 e2 00 call 0x1c4 ; 0x1c4 + 6a2: 0d 5f subi r16, 0xFD ; 253 + 6a4: 1f 4f sbci r17, 0xFF ; 255 + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + // Assign color + for(int i = 0; i < LEDS; i++) { + 6a6: 08 15 cp r16, r8 + 6a8: 19 05 cpc r17, r9 + 6aa: 81 f7 brne .-32 ; 0x68c + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + } + + // Next color + int8_t sign = 1; + min += sign * HUE_STEP; + 6ac: 80 91 02 01 lds r24, 0x0102 + 6b0: 90 91 03 01 lds r25, 0x0103 + 6b4: 08 96 adiw r24, 0x08 ; 8 + 6b6: 90 93 03 01 sts 0x0103, r25 + 6ba: 80 93 02 01 sts 0x0102, r24 + max -= sign * HUE_STEP; + 6be: 80 91 00 01 lds r24, 0x0100 + 6c2: 90 91 01 01 lds r25, 0x0101 + 6c6: 08 97 sbiw r24, 0x08 ; 8 + 6c8: 90 93 01 01 sts 0x0101, r25 + 6cc: 80 93 00 01 sts 0x0100, r24 + interpolate( + 6d0: 80 91 00 01 lds r24, 0x0100 + 6d4: 90 91 01 01 lds r25, 0x0101 + 6d8: 44 e1 ldi r20, 0x14 ; 20 + 6da: 64 e6 ldi r22, 0x64 ; 100 + 6dc: 0e 94 ee 02 call 0x5dc ; 0x5dc + 6e0: 2b 01 movw r4, r22 + 6e2: 3c 01 movw r6, r24 + 6e4: 80 91 02 01 lds r24, 0x0102 + 6e8: 90 91 03 01 lds r25, 0x0103 + 6ec: 44 e1 ldi r20, 0x14 ; 20 + 6ee: 64 e6 ldi r22, 0x64 ; 100 + 6f0: 0e 94 ee 02 call 0x5dc ; 0x5dc + 6f4: 9e 01 movw r18, r28 + 6f6: 2f 5f subi r18, 0xFF ; 255 + 6f8: 3f 4f sbci r19, 0xFF ; 255 + 6fa: 79 01 movw r14, r18 + 6fc: 0e e1 ldi r16, 0x1E ; 30 + 6fe: 10 e0 ldi r17, 0x00 ; 0 + 700: a3 01 movw r20, r6 + 702: 92 01 movw r18, r4 + 704: 0e 94 33 01 call 0x266 ; 0x266 + init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 708: 4e e1 ldi r20, 0x1E ; 30 + 70a: 50 e0 ldi r21, 0x00 ; 0 + 70c: be 01 movw r22, r28 + 70e: 67 58 subi r22, 0x87 ; 135 + 710: 7f 4f sbci r23, 0xFF ; 255 + 712: c7 01 movw r24, r14 + 714: 0e 94 c9 02 call 0x592 ; 0x592 + for(int i = 0; i < LEDS; i++) { + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + } + + // Next color + int8_t sign = 1; + 718: dd 24 eor r13, r13 + 71a: d3 94 inc r13 + uint32_t T_step = T_half / colorSteps; + + // Check if it is time for next color + if(time + TCNT1 > oldTime + T_step) { + oldTime += T_step; + PORTC ^= 0x04; + 71c: 34 e0 ldi r19, 0x04 ; 4 + 71e: c3 2e mov r12, r19 + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + + while(1) { + sei(); + 720: 78 94 sei + uint32_t T_step = T_half / colorSteps; + 722: 80 91 0e 01 lds r24, 0x010E + 726: 90 91 0f 01 lds r25, 0x010F + 72a: a0 91 10 01 lds r26, 0x0110 + 72e: b0 91 11 01 lds r27, 0x0111 + 732: 25 e0 ldi r18, 0x05 ; 5 + 734: b6 95 lsr r27 + 736: a7 95 ror r26 + 738: 97 95 ror r25 + 73a: 87 95 ror r24 + 73c: 2a 95 dec r18 + 73e: d1 f7 brne .-12 ; 0x734 + + // Check if it is time for next color + if(time + TCNT1 > oldTime + T_step) { + 740: 00 91 12 01 lds r16, 0x0112 + 744: 10 91 13 01 lds r17, 0x0113 + 748: 20 91 14 01 lds r18, 0x0114 + 74c: 30 91 15 01 lds r19, 0x0115 + 750: e0 91 84 00 lds r30, 0x0084 + 754: f0 91 85 00 lds r31, 0x0085 + 758: 40 91 0a 01 lds r20, 0x010A + 75c: 50 91 0b 01 lds r21, 0x010B + 760: 60 91 0c 01 lds r22, 0x010C + 764: 70 91 0d 01 lds r23, 0x010D + 768: 0e 0f add r16, r30 + 76a: 1f 1f adc r17, r31 + 76c: 21 1d adc r18, r1 + 76e: 31 1d adc r19, r1 + 770: 48 0f add r20, r24 + 772: 59 1f adc r21, r25 + 774: 6a 1f adc r22, r26 + 776: 7b 1f adc r23, r27 + 778: 40 17 cp r20, r16 + 77a: 51 07 cpc r21, r17 + 77c: 62 07 cpc r22, r18 + 77e: 73 07 cpc r23, r19 + 780: 78 f6 brcc .-98 ; 0x720 + oldTime += T_step; + 782: 40 91 0a 01 lds r20, 0x010A + 786: 50 91 0b 01 lds r21, 0x010B + 78a: 60 91 0c 01 lds r22, 0x010C + 78e: 70 91 0d 01 lds r23, 0x010D + 792: 84 0f add r24, r20 + 794: 95 1f adc r25, r21 + 796: a6 1f adc r26, r22 + 798: b7 1f adc r27, r23 + 79a: 80 93 0a 01 sts 0x010A, r24 + 79e: 90 93 0b 01 sts 0x010B, r25 + 7a2: a0 93 0c 01 sts 0x010C, r26 + 7a6: b0 93 0d 01 sts 0x010D, r27 + PORTC ^= 0x04; + 7aa: 88 b1 in r24, 0x08 ; 8 + 7ac: 8c 25 eor r24, r12 + 7ae: 88 b9 out 0x08, r24 ; 8 + // Assign color + cli(); + 7b0: f8 94 cli + 7b2: 85 01 movw r16, r10 + 7b4: d8 01 movw r26, r16 + 7b6: 11 97 sbiw r26, 0x01 ; 1 + 7b8: c8 01 movw r24, r16 + 7ba: 02 97 sbiw r24, 0x02 ; 2 + for(int i = 0; i < LEDS; i++) { + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 7bc: f8 01 movw r30, r16 + 7be: 40 81 ld r20, Z + 7c0: 6c 91 ld r22, X + 7c2: fc 01 movw r30, r24 + 7c4: 80 81 ld r24, Z + 7c6: 0e 94 e2 00 call 0x1c4 ; 0x1c4 + 7ca: 0d 5f subi r16, 0xFD ; 253 + 7cc: 1f 4f sbci r17, 0xFF ; 255 + if(time + TCNT1 > oldTime + T_step) { + oldTime += T_step; + PORTC ^= 0x04; + // Assign color + cli(); + for(int i = 0; i < LEDS; i++) { + 7ce: 08 15 cp r16, r8 + 7d0: 19 05 cpc r17, r9 + 7d2: 81 f7 brne .-32 ; 0x7b4 + writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + } + sei(); + 7d4: 78 94 sei + //~ _delay_us(51); + + // Next color + min += sign * HUE_STEP; + 7d6: 80 91 02 01 lds r24, 0x0102 + 7da: 90 91 03 01 lds r25, 0x0103 + 7de: fd 2d mov r31, r13 + 7e0: 28 e0 ldi r18, 0x08 ; 8 + 7e2: f2 02 muls r31, r18 + 7e4: 80 0d add r24, r0 + 7e6: 91 1d adc r25, r1 + 7e8: 11 24 eor r1, r1 + 7ea: 90 93 03 01 sts 0x0103, r25 + 7ee: 80 93 02 01 sts 0x0102, r24 + max -= sign * HUE_STEP; + 7f2: 80 91 00 01 lds r24, 0x0100 + 7f6: 90 91 01 01 lds r25, 0x0101 + 7fa: 38 e0 ldi r19, 0x08 ; 8 + 7fc: f3 02 muls r31, r19 + 7fe: 80 19 sub r24, r0 + 800: 91 09 sbc r25, r1 + 802: 11 24 eor r1, r1 + 804: 90 93 01 01 sts 0x0101, r25 + 808: 80 93 00 01 sts 0x0100, r24 + interpolate( + 80c: 80 91 00 01 lds r24, 0x0100 + 810: 90 91 01 01 lds r25, 0x0101 + 814: 44 e1 ldi r20, 0x14 ; 20 + 816: 64 e6 ldi r22, 0x64 ; 100 + 818: 0e 94 ee 02 call 0x5dc ; 0x5dc + 81c: 2b 01 movw r4, r22 + 81e: 3c 01 movw r6, r24 + 820: 80 91 02 01 lds r24, 0x0102 + 824: 90 91 03 01 lds r25, 0x0103 + 828: 44 e1 ldi r20, 0x14 ; 20 + 82a: 64 e6 ldi r22, 0x64 ; 100 + 82c: 0e 94 ee 02 call 0x5dc ; 0x5dc + 830: fe 01 movw r30, r28 + 832: 31 96 adiw r30, 0x01 ; 1 + 834: 7f 01 movw r14, r30 + 836: 0e e1 ldi r16, 0x1E ; 30 + 838: 10 e0 ldi r17, 0x00 ; 0 + 83a: a3 01 movw r20, r6 + 83c: 92 01 movw r18, r4 + 83e: 0e 94 33 01 call 0x266 ; 0x266 + init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 842: 4e e1 ldi r20, 0x1E ; 30 + 844: 50 e0 ldi r21, 0x00 ; 0 + 846: be 01 movw r22, r28 + 848: 67 58 subi r22, 0x87 ; 135 + 84a: 7f 4f sbci r23, 0xFF ; 255 + 84c: c7 01 movw r24, r14 + 84e: 0e 94 c9 02 call 0x592 ; 0x592 + // Check if reached amplitude + if(sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + 852: f1 e0 ldi r31, 0x01 ; 1 + 854: df 12 cpse r13, r31 + 856: 12 c0 rjmp .+36 ; 0x87c + 858: 80 91 02 01 lds r24, 0x0102 + 85c: 90 91 03 01 lds r25, 0x0103 + 860: 82 36 cpi r24, 0x62 ; 98 + 862: 92 40 sbci r25, 0x02 ; 2 + 864: 18 f0 brcs .+6 ; 0x86c + sign = -1; + 866: dd 24 eor r13, r13 + 868: da 94 dec r13 + 86a: 5a cf rjmp .-332 ; 0x720 + LEDS, + colorsHSV + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + // Check if reached amplitude + if(sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + 86c: 80 91 00 01 lds r24, 0x0100 + 870: 90 91 01 01 lds r25, 0x0101 + 874: 8f 35 cpi r24, 0x5F ; 95 + 876: 91 40 sbci r25, 0x01 ; 1 + 878: b0 f3 brcs .-20 ; 0x866 + 87a: 52 cf rjmp .-348 ; 0x720 + sign = -1; + } else if(sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 87c: 8f ef ldi r24, 0xFF ; 255 + 87e: d8 16 cp r13, r24 + 880: 11 f0 breq .+4 ; 0x886 + 882: d1 2c mov r13, r1 + 884: 4d cf rjmp .-358 ; 0x720 + 886: 80 91 02 01 lds r24, 0x0102 + 88a: 90 91 03 01 lds r25, 0x0103 + 88e: 8f 35 cpi r24, 0x5F ; 95 + 890: 91 40 sbci r25, 0x01 ; 1 + 892: 18 f4 brcc .+6 ; 0x89a + sign = 1; + 894: dd 24 eor r13, r13 + 896: d3 94 inc r13 + 898: 43 cf rjmp .-378 ; 0x720 + ); + hsv2rgbList(colorsHSV, colorsRGB, LEDS); + // Check if reached amplitude + if(sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + sign = -1; + } else if(sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 89a: 80 91 00 01 lds r24, 0x0100 + 89e: 90 91 01 01 lds r25, 0x0101 + 8a2: 82 36 cpi r24, 0x62 ; 98 + 8a4: 92 40 sbci r25, 0x02 ; 2 + 8a6: 08 f4 brcc .+2 ; 0x8aa + 8a8: 3b cf rjmp .-394 ; 0x720 + 8aa: f4 cf rjmp .-24 ; 0x894 + +000008ac <__subsf3>: + 8ac: 50 58 subi r21, 0x80 ; 128 + +000008ae <__addsf3>: + 8ae: bb 27 eor r27, r27 + 8b0: aa 27 eor r26, r26 + 8b2: 0e 94 6e 04 call 0x8dc ; 0x8dc <__addsf3x> + 8b6: 0c 94 b8 05 jmp 0xb70 ; 0xb70 <__fp_round> + 8ba: 0e 94 aa 05 call 0xb54 ; 0xb54 <__fp_pscA> + 8be: 38 f0 brcs .+14 ; 0x8ce <__addsf3+0x20> + 8c0: 0e 94 b1 05 call 0xb62 ; 0xb62 <__fp_pscB> + 8c4: 20 f0 brcs .+8 ; 0x8ce <__addsf3+0x20> + 8c6: 39 f4 brne .+14 ; 0x8d6 <__addsf3+0x28> + 8c8: 9f 3f cpi r25, 0xFF ; 255 + 8ca: 19 f4 brne .+6 ; 0x8d2 <__addsf3+0x24> + 8cc: 26 f4 brtc .+8 ; 0x8d6 <__addsf3+0x28> + 8ce: 0c 94 a7 05 jmp 0xb4e ; 0xb4e <__fp_nan> + 8d2: 0e f4 brtc .+2 ; 0x8d6 <__addsf3+0x28> + 8d4: e0 95 com r30 + 8d6: e7 fb bst r30, 7 + 8d8: 0c 94 a1 05 jmp 0xb42 ; 0xb42 <__fp_inf> + +000008dc <__addsf3x>: + 8dc: e9 2f mov r30, r25 + 8de: 0e 94 c9 05 call 0xb92 ; 0xb92 <__fp_split3> + 8e2: 58 f3 brcs .-42 ; 0x8ba <__addsf3+0xc> + 8e4: ba 17 cp r27, r26 + 8e6: 62 07 cpc r22, r18 + 8e8: 73 07 cpc r23, r19 + 8ea: 84 07 cpc r24, r20 + 8ec: 95 07 cpc r25, r21 + 8ee: 20 f0 brcs .+8 ; 0x8f8 <__addsf3x+0x1c> + 8f0: 79 f4 brne .+30 ; 0x910 <__stack+0x11> + 8f2: a6 f5 brtc .+104 ; 0x95c <__stack+0x5d> + 8f4: 0c 94 eb 05 jmp 0xbd6 ; 0xbd6 <__fp_zero> + 8f8: 0e f4 brtc .+2 ; 0x8fc <__addsf3x+0x20> + 8fa: e0 95 com r30 + 8fc: 0b 2e mov r0, r27 + 8fe: ba 2f mov r27, r26 + 900: a0 2d mov r26, r0 + 902: 0b 01 movw r0, r22 + 904: b9 01 movw r22, r18 + 906: 90 01 movw r18, r0 + 908: 0c 01 movw r0, r24 + 90a: ca 01 movw r24, r20 + 90c: a0 01 movw r20, r0 + 90e: 11 24 eor r1, r1 + 910: ff 27 eor r31, r31 + 912: 59 1b sub r21, r25 + 914: 99 f0 breq .+38 ; 0x93c <__stack+0x3d> + 916: 59 3f cpi r21, 0xF9 ; 249 + 918: 50 f4 brcc .+20 ; 0x92e <__stack+0x2f> + 91a: 50 3e cpi r21, 0xE0 ; 224 + 91c: 68 f1 brcs .+90 ; 0x978 <__stack+0x79> + 91e: 1a 16 cp r1, r26 + 920: f0 40 sbci r31, 0x00 ; 0 + 922: a2 2f mov r26, r18 + 924: 23 2f mov r18, r19 + 926: 34 2f mov r19, r20 + 928: 44 27 eor r20, r20 + 92a: 58 5f subi r21, 0xF8 ; 248 + 92c: f3 cf rjmp .-26 ; 0x914 <__stack+0x15> + 92e: 46 95 lsr r20 + 930: 37 95 ror r19 + 932: 27 95 ror r18 + 934: a7 95 ror r26 + 936: f0 40 sbci r31, 0x00 ; 0 + 938: 53 95 inc r21 + 93a: c9 f7 brne .-14 ; 0x92e <__stack+0x2f> + 93c: 7e f4 brtc .+30 ; 0x95c <__stack+0x5d> + 93e: 1f 16 cp r1, r31 + 940: ba 0b sbc r27, r26 + 942: 62 0b sbc r22, r18 + 944: 73 0b sbc r23, r19 + 946: 84 0b sbc r24, r20 + 948: ba f0 brmi .+46 ; 0x978 <__stack+0x79> + 94a: 91 50 subi r25, 0x01 ; 1 + 94c: a1 f0 breq .+40 ; 0x976 <__stack+0x77> + 94e: ff 0f add r31, r31 + 950: bb 1f adc r27, r27 + 952: 66 1f adc r22, r22 + 954: 77 1f adc r23, r23 + 956: 88 1f adc r24, r24 + 958: c2 f7 brpl .-16 ; 0x94a <__stack+0x4b> + 95a: 0e c0 rjmp .+28 ; 0x978 <__stack+0x79> + 95c: ba 0f add r27, r26 + 95e: 62 1f adc r22, r18 + 960: 73 1f adc r23, r19 + 962: 84 1f adc r24, r20 + 964: 48 f4 brcc .+18 ; 0x978 <__stack+0x79> + 966: 87 95 ror r24 + 968: 77 95 ror r23 + 96a: 67 95 ror r22 + 96c: b7 95 ror r27 + 96e: f7 95 ror r31 + 970: 9e 3f cpi r25, 0xFE ; 254 + 972: 08 f0 brcs .+2 ; 0x976 <__stack+0x77> + 974: b0 cf rjmp .-160 ; 0x8d6 <__addsf3+0x28> + 976: 93 95 inc r25 + 978: 88 0f add r24, r24 + 97a: 08 f0 brcs .+2 ; 0x97e <__stack+0x7f> + 97c: 99 27 eor r25, r25 + 97e: ee 0f add r30, r30 + 980: 97 95 ror r25 + 982: 87 95 ror r24 + 984: 08 95 ret + +00000986 <__divsf3>: + 986: 0e 94 d7 04 call 0x9ae ; 0x9ae <__divsf3x> + 98a: 0c 94 b8 05 jmp 0xb70 ; 0xb70 <__fp_round> + 98e: 0e 94 b1 05 call 0xb62 ; 0xb62 <__fp_pscB> + 992: 58 f0 brcs .+22 ; 0x9aa <__divsf3+0x24> + 994: 0e 94 aa 05 call 0xb54 ; 0xb54 <__fp_pscA> + 998: 40 f0 brcs .+16 ; 0x9aa <__divsf3+0x24> + 99a: 29 f4 brne .+10 ; 0x9a6 <__divsf3+0x20> + 99c: 5f 3f cpi r21, 0xFF ; 255 + 99e: 29 f0 breq .+10 ; 0x9aa <__divsf3+0x24> + 9a0: 0c 94 a1 05 jmp 0xb42 ; 0xb42 <__fp_inf> + 9a4: 51 11 cpse r21, r1 + 9a6: 0c 94 ec 05 jmp 0xbd8 ; 0xbd8 <__fp_szero> + 9aa: 0c 94 a7 05 jmp 0xb4e ; 0xb4e <__fp_nan> + +000009ae <__divsf3x>: + 9ae: 0e 94 c9 05 call 0xb92 ; 0xb92 <__fp_split3> + 9b2: 68 f3 brcs .-38 ; 0x98e <__divsf3+0x8> + +000009b4 <__divsf3_pse>: + 9b4: 99 23 and r25, r25 + 9b6: b1 f3 breq .-20 ; 0x9a4 <__divsf3+0x1e> + 9b8: 55 23 and r21, r21 + 9ba: 91 f3 breq .-28 ; 0x9a0 <__divsf3+0x1a> + 9bc: 95 1b sub r25, r21 + 9be: 55 0b sbc r21, r21 + 9c0: bb 27 eor r27, r27 + 9c2: aa 27 eor r26, r26 + 9c4: 62 17 cp r22, r18 + 9c6: 73 07 cpc r23, r19 + 9c8: 84 07 cpc r24, r20 + 9ca: 38 f0 brcs .+14 ; 0x9da <__divsf3_pse+0x26> + 9cc: 9f 5f subi r25, 0xFF ; 255 + 9ce: 5f 4f sbci r21, 0xFF ; 255 + 9d0: 22 0f add r18, r18 + 9d2: 33 1f adc r19, r19 + 9d4: 44 1f adc r20, r20 + 9d6: aa 1f adc r26, r26 + 9d8: a9 f3 breq .-22 ; 0x9c4 <__divsf3_pse+0x10> + 9da: 35 d0 rcall .+106 ; 0xa46 <__divsf3_pse+0x92> + 9dc: 0e 2e mov r0, r30 + 9de: 3a f0 brmi .+14 ; 0x9ee <__divsf3_pse+0x3a> + 9e0: e0 e8 ldi r30, 0x80 ; 128 + 9e2: 32 d0 rcall .+100 ; 0xa48 <__divsf3_pse+0x94> + 9e4: 91 50 subi r25, 0x01 ; 1 + 9e6: 50 40 sbci r21, 0x00 ; 0 + 9e8: e6 95 lsr r30 + 9ea: 00 1c adc r0, r0 + 9ec: ca f7 brpl .-14 ; 0x9e0 <__divsf3_pse+0x2c> + 9ee: 2b d0 rcall .+86 ; 0xa46 <__divsf3_pse+0x92> + 9f0: fe 2f mov r31, r30 + 9f2: 29 d0 rcall .+82 ; 0xa46 <__divsf3_pse+0x92> + 9f4: 66 0f add r22, r22 + 9f6: 77 1f adc r23, r23 + 9f8: 88 1f adc r24, r24 + 9fa: bb 1f adc r27, r27 + 9fc: 26 17 cp r18, r22 + 9fe: 37 07 cpc r19, r23 + a00: 48 07 cpc r20, r24 + a02: ab 07 cpc r26, r27 + a04: b0 e8 ldi r27, 0x80 ; 128 + a06: 09 f0 breq .+2 ; 0xa0a <__divsf3_pse+0x56> + a08: bb 0b sbc r27, r27 + a0a: 80 2d mov r24, r0 + a0c: bf 01 movw r22, r30 + a0e: ff 27 eor r31, r31 + a10: 93 58 subi r25, 0x83 ; 131 + a12: 5f 4f sbci r21, 0xFF ; 255 + a14: 3a f0 brmi .+14 ; 0xa24 <__divsf3_pse+0x70> + a16: 9e 3f cpi r25, 0xFE ; 254 + a18: 51 05 cpc r21, r1 + a1a: 78 f0 brcs .+30 ; 0xa3a <__divsf3_pse+0x86> + a1c: 0c 94 a1 05 jmp 0xb42 ; 0xb42 <__fp_inf> + a20: 0c 94 ec 05 jmp 0xbd8 ; 0xbd8 <__fp_szero> + a24: 5f 3f cpi r21, 0xFF ; 255 + a26: e4 f3 brlt .-8 ; 0xa20 <__divsf3_pse+0x6c> + a28: 98 3e cpi r25, 0xE8 ; 232 + a2a: d4 f3 brlt .-12 ; 0xa20 <__divsf3_pse+0x6c> + a2c: 86 95 lsr r24 + a2e: 77 95 ror r23 + a30: 67 95 ror r22 + a32: b7 95 ror r27 + a34: f7 95 ror r31 + a36: 9f 5f subi r25, 0xFF ; 255 + a38: c9 f7 brne .-14 ; 0xa2c <__divsf3_pse+0x78> + a3a: 88 0f add r24, r24 + a3c: 91 1d adc r25, r1 + a3e: 96 95 lsr r25 + a40: 87 95 ror r24 + a42: 97 f9 bld r25, 7 + a44: 08 95 ret + a46: e1 e0 ldi r30, 0x01 ; 1 + a48: 66 0f add r22, r22 + a4a: 77 1f adc r23, r23 + a4c: 88 1f adc r24, r24 + a4e: bb 1f adc r27, r27 + a50: 62 17 cp r22, r18 + a52: 73 07 cpc r23, r19 + a54: 84 07 cpc r24, r20 + a56: ba 07 cpc r27, r26 + a58: 20 f0 brcs .+8 ; 0xa62 <__divsf3_pse+0xae> + a5a: 62 1b sub r22, r18 + a5c: 73 0b sbc r23, r19 + a5e: 84 0b sbc r24, r20 + a60: ba 0b sbc r27, r26 + a62: ee 1f adc r30, r30 + a64: 88 f7 brcc .-30 ; 0xa48 <__divsf3_pse+0x94> + a66: e0 95 com r30 + a68: 08 95 ret + +00000a6a <__fixunssfsi>: + a6a: 0e 94 d1 05 call 0xba2 ; 0xba2 <__fp_splitA> + a6e: 88 f0 brcs .+34 ; 0xa92 <__fixunssfsi+0x28> + a70: 9f 57 subi r25, 0x7F ; 127 + a72: 98 f0 brcs .+38 ; 0xa9a <__fixunssfsi+0x30> + a74: b9 2f mov r27, r25 + a76: 99 27 eor r25, r25 + a78: b7 51 subi r27, 0x17 ; 23 + a7a: b0 f0 brcs .+44 ; 0xaa8 <__fixunssfsi+0x3e> + a7c: e1 f0 breq .+56 ; 0xab6 <__fixunssfsi+0x4c> + a7e: 66 0f add r22, r22 + a80: 77 1f adc r23, r23 + a82: 88 1f adc r24, r24 + a84: 99 1f adc r25, r25 + a86: 1a f0 brmi .+6 ; 0xa8e <__fixunssfsi+0x24> + a88: ba 95 dec r27 + a8a: c9 f7 brne .-14 ; 0xa7e <__fixunssfsi+0x14> + a8c: 14 c0 rjmp .+40 ; 0xab6 <__fixunssfsi+0x4c> + a8e: b1 30 cpi r27, 0x01 ; 1 + a90: 91 f0 breq .+36 ; 0xab6 <__fixunssfsi+0x4c> + a92: 0e 94 eb 05 call 0xbd6 ; 0xbd6 <__fp_zero> + a96: b1 e0 ldi r27, 0x01 ; 1 + a98: 08 95 ret + a9a: 0c 94 eb 05 jmp 0xbd6 ; 0xbd6 <__fp_zero> + a9e: 67 2f mov r22, r23 + aa0: 78 2f mov r23, r24 + aa2: 88 27 eor r24, r24 + aa4: b8 5f subi r27, 0xF8 ; 248 + aa6: 39 f0 breq .+14 ; 0xab6 <__fixunssfsi+0x4c> + aa8: b9 3f cpi r27, 0xF9 ; 249 + aaa: cc f3 brlt .-14 ; 0xa9e <__fixunssfsi+0x34> + aac: 86 95 lsr r24 + aae: 77 95 ror r23 + ab0: 67 95 ror r22 + ab2: b3 95 inc r27 + ab4: d9 f7 brne .-10 ; 0xaac <__fixunssfsi+0x42> + ab6: 3e f4 brtc .+14 ; 0xac6 <__fixunssfsi+0x5c> + ab8: 90 95 com r25 + aba: 80 95 com r24 + abc: 70 95 com r23 + abe: 61 95 neg r22 + ac0: 7f 4f sbci r23, 0xFF ; 255 + ac2: 8f 4f sbci r24, 0xFF ; 255 + ac4: 9f 4f sbci r25, 0xFF ; 255 + ac6: 08 95 ret + +00000ac8 <__floatunsisf>: + ac8: e8 94 clt + aca: 09 c0 rjmp .+18 ; 0xade <__floatsisf+0x12> + +00000acc <__floatsisf>: + acc: 97 fb bst r25, 7 + ace: 3e f4 brtc .+14 ; 0xade <__floatsisf+0x12> + ad0: 90 95 com r25 + ad2: 80 95 com r24 + ad4: 70 95 com r23 + ad6: 61 95 neg r22 + ad8: 7f 4f sbci r23, 0xFF ; 255 + ada: 8f 4f sbci r24, 0xFF ; 255 + adc: 9f 4f sbci r25, 0xFF ; 255 + ade: 99 23 and r25, r25 + ae0: a9 f0 breq .+42 ; 0xb0c <__floatsisf+0x40> + ae2: f9 2f mov r31, r25 + ae4: 96 e9 ldi r25, 0x96 ; 150 + ae6: bb 27 eor r27, r27 + ae8: 93 95 inc r25 + aea: f6 95 lsr r31 + aec: 87 95 ror r24 + aee: 77 95 ror r23 + af0: 67 95 ror r22 + af2: b7 95 ror r27 + af4: f1 11 cpse r31, r1 + af6: f8 cf rjmp .-16 ; 0xae8 <__floatsisf+0x1c> + af8: fa f4 brpl .+62 ; 0xb38 <__floatsisf+0x6c> + afa: bb 0f add r27, r27 + afc: 11 f4 brne .+4 ; 0xb02 <__floatsisf+0x36> + afe: 60 ff sbrs r22, 0 + b00: 1b c0 rjmp .+54 ; 0xb38 <__floatsisf+0x6c> + b02: 6f 5f subi r22, 0xFF ; 255 + b04: 7f 4f sbci r23, 0xFF ; 255 + b06: 8f 4f sbci r24, 0xFF ; 255 + b08: 9f 4f sbci r25, 0xFF ; 255 + b0a: 16 c0 rjmp .+44 ; 0xb38 <__floatsisf+0x6c> + b0c: 88 23 and r24, r24 + b0e: 11 f0 breq .+4 ; 0xb14 <__floatsisf+0x48> + b10: 96 e9 ldi r25, 0x96 ; 150 + b12: 11 c0 rjmp .+34 ; 0xb36 <__floatsisf+0x6a> + b14: 77 23 and r23, r23 + b16: 21 f0 breq .+8 ; 0xb20 <__floatsisf+0x54> + b18: 9e e8 ldi r25, 0x8E ; 142 + b1a: 87 2f mov r24, r23 + b1c: 76 2f mov r23, r22 + b1e: 05 c0 rjmp .+10 ; 0xb2a <__floatsisf+0x5e> + b20: 66 23 and r22, r22 + b22: 71 f0 breq .+28 ; 0xb40 <__floatsisf+0x74> + b24: 96 e8 ldi r25, 0x86 ; 134 + b26: 86 2f mov r24, r22 + b28: 70 e0 ldi r23, 0x00 ; 0 + b2a: 60 e0 ldi r22, 0x00 ; 0 + b2c: 2a f0 brmi .+10 ; 0xb38 <__floatsisf+0x6c> + b2e: 9a 95 dec r25 + b30: 66 0f add r22, r22 + b32: 77 1f adc r23, r23 + b34: 88 1f adc r24, r24 + b36: da f7 brpl .-10 ; 0xb2e <__floatsisf+0x62> + b38: 88 0f add r24, r24 + b3a: 96 95 lsr r25 + b3c: 87 95 ror r24 + b3e: 97 f9 bld r25, 7 + b40: 08 95 ret + +00000b42 <__fp_inf>: + b42: 97 f9 bld r25, 7 + b44: 9f 67 ori r25, 0x7F ; 127 + b46: 80 e8 ldi r24, 0x80 ; 128 + b48: 70 e0 ldi r23, 0x00 ; 0 + b4a: 60 e0 ldi r22, 0x00 ; 0 + b4c: 08 95 ret + +00000b4e <__fp_nan>: + b4e: 9f ef ldi r25, 0xFF ; 255 + b50: 80 ec ldi r24, 0xC0 ; 192 + b52: 08 95 ret + +00000b54 <__fp_pscA>: + b54: 00 24 eor r0, r0 + b56: 0a 94 dec r0 + b58: 16 16 cp r1, r22 + b5a: 17 06 cpc r1, r23 + b5c: 18 06 cpc r1, r24 + b5e: 09 06 cpc r0, r25 + b60: 08 95 ret + +00000b62 <__fp_pscB>: + b62: 00 24 eor r0, r0 + b64: 0a 94 dec r0 + b66: 12 16 cp r1, r18 + b68: 13 06 cpc r1, r19 + b6a: 14 06 cpc r1, r20 + b6c: 05 06 cpc r0, r21 + b6e: 08 95 ret + +00000b70 <__fp_round>: + b70: 09 2e mov r0, r25 + b72: 03 94 inc r0 + b74: 00 0c add r0, r0 + b76: 11 f4 brne .+4 ; 0xb7c <__fp_round+0xc> + b78: 88 23 and r24, r24 + b7a: 52 f0 brmi .+20 ; 0xb90 <__fp_round+0x20> + b7c: bb 0f add r27, r27 + b7e: 40 f4 brcc .+16 ; 0xb90 <__fp_round+0x20> + b80: bf 2b or r27, r31 + b82: 11 f4 brne .+4 ; 0xb88 <__fp_round+0x18> + b84: 60 ff sbrs r22, 0 + b86: 04 c0 rjmp .+8 ; 0xb90 <__fp_round+0x20> + b88: 6f 5f subi r22, 0xFF ; 255 + b8a: 7f 4f sbci r23, 0xFF ; 255 + b8c: 8f 4f sbci r24, 0xFF ; 255 + b8e: 9f 4f sbci r25, 0xFF ; 255 + b90: 08 95 ret + +00000b92 <__fp_split3>: + b92: 57 fd sbrc r21, 7 + b94: 90 58 subi r25, 0x80 ; 128 + b96: 44 0f add r20, r20 + b98: 55 1f adc r21, r21 + b9a: 59 f0 breq .+22 ; 0xbb2 <__fp_splitA+0x10> + b9c: 5f 3f cpi r21, 0xFF ; 255 + b9e: 71 f0 breq .+28 ; 0xbbc <__fp_splitA+0x1a> + ba0: 47 95 ror r20 + +00000ba2 <__fp_splitA>: + ba2: 88 0f add r24, r24 + ba4: 97 fb bst r25, 7 + ba6: 99 1f adc r25, r25 + ba8: 61 f0 breq .+24 ; 0xbc2 <__fp_splitA+0x20> + baa: 9f 3f cpi r25, 0xFF ; 255 + bac: 79 f0 breq .+30 ; 0xbcc <__fp_splitA+0x2a> + bae: 87 95 ror r24 + bb0: 08 95 ret + bb2: 12 16 cp r1, r18 + bb4: 13 06 cpc r1, r19 + bb6: 14 06 cpc r1, r20 + bb8: 55 1f adc r21, r21 + bba: f2 cf rjmp .-28 ; 0xba0 <__fp_split3+0xe> + bbc: 46 95 lsr r20 + bbe: f1 df rcall .-30 ; 0xba2 <__fp_splitA> + bc0: 08 c0 rjmp .+16 ; 0xbd2 <__fp_splitA+0x30> + bc2: 16 16 cp r1, r22 + bc4: 17 06 cpc r1, r23 + bc6: 18 06 cpc r1, r24 + bc8: 99 1f adc r25, r25 + bca: f1 cf rjmp .-30 ; 0xbae <__fp_splitA+0xc> + bcc: 86 95 lsr r24 + bce: 71 05 cpc r23, r1 + bd0: 61 05 cpc r22, r1 + bd2: 08 94 sec + bd4: 08 95 ret + +00000bd6 <__fp_zero>: + bd6: e8 94 clt + +00000bd8 <__fp_szero>: + bd8: bb 27 eor r27, r27 + bda: 66 27 eor r22, r22 + bdc: 77 27 eor r23, r23 + bde: cb 01 movw r24, r22 + be0: 97 f9 bld r25, 7 + be2: 08 95 ret + +00000be4 <__mulsf3>: + be4: 0e 94 05 06 call 0xc0a ; 0xc0a <__mulsf3x> + be8: 0c 94 b8 05 jmp 0xb70 ; 0xb70 <__fp_round> + bec: 0e 94 aa 05 call 0xb54 ; 0xb54 <__fp_pscA> + bf0: 38 f0 brcs .+14 ; 0xc00 <__mulsf3+0x1c> + bf2: 0e 94 b1 05 call 0xb62 ; 0xb62 <__fp_pscB> + bf6: 20 f0 brcs .+8 ; 0xc00 <__mulsf3+0x1c> + bf8: 95 23 and r25, r21 + bfa: 11 f0 breq .+4 ; 0xc00 <__mulsf3+0x1c> + bfc: 0c 94 a1 05 jmp 0xb42 ; 0xb42 <__fp_inf> + c00: 0c 94 a7 05 jmp 0xb4e ; 0xb4e <__fp_nan> + c04: 11 24 eor r1, r1 + c06: 0c 94 ec 05 jmp 0xbd8 ; 0xbd8 <__fp_szero> + +00000c0a <__mulsf3x>: + c0a: 0e 94 c9 05 call 0xb92 ; 0xb92 <__fp_split3> + c0e: 70 f3 brcs .-36 ; 0xbec <__mulsf3+0x8> + +00000c10 <__mulsf3_pse>: + c10: 95 9f mul r25, r21 + c12: c1 f3 breq .-16 ; 0xc04 <__mulsf3+0x20> + c14: 95 0f add r25, r21 + c16: 50 e0 ldi r21, 0x00 ; 0 + c18: 55 1f adc r21, r21 + c1a: 62 9f mul r22, r18 + c1c: f0 01 movw r30, r0 + c1e: 72 9f mul r23, r18 + c20: bb 27 eor r27, r27 + c22: f0 0d add r31, r0 + c24: b1 1d adc r27, r1 + c26: 63 9f mul r22, r19 + c28: aa 27 eor r26, r26 + c2a: f0 0d add r31, r0 + c2c: b1 1d adc r27, r1 + c2e: aa 1f adc r26, r26 + c30: 64 9f mul r22, r20 + c32: 66 27 eor r22, r22 + c34: b0 0d add r27, r0 + c36: a1 1d adc r26, r1 + c38: 66 1f adc r22, r22 + c3a: 82 9f mul r24, r18 + c3c: 22 27 eor r18, r18 + c3e: b0 0d add r27, r0 + c40: a1 1d adc r26, r1 + c42: 62 1f adc r22, r18 + c44: 73 9f mul r23, r19 + c46: b0 0d add r27, r0 + c48: a1 1d adc r26, r1 + c4a: 62 1f adc r22, r18 + c4c: 83 9f mul r24, r19 + c4e: a0 0d add r26, r0 + c50: 61 1d adc r22, r1 + c52: 22 1f adc r18, r18 + c54: 74 9f mul r23, r20 + c56: 33 27 eor r19, r19 + c58: a0 0d add r26, r0 + c5a: 61 1d adc r22, r1 + c5c: 23 1f adc r18, r19 + c5e: 84 9f mul r24, r20 + c60: 60 0d add r22, r0 + c62: 21 1d adc r18, r1 + c64: 82 2f mov r24, r18 + c66: 76 2f mov r23, r22 + c68: 6a 2f mov r22, r26 + c6a: 11 24 eor r1, r1 + c6c: 9f 57 subi r25, 0x7F ; 127 + c6e: 50 40 sbci r21, 0x00 ; 0 + c70: 9a f0 brmi .+38 ; 0xc98 <__mulsf3_pse+0x88> + c72: f1 f0 breq .+60 ; 0xcb0 <__mulsf3_pse+0xa0> + c74: 88 23 and r24, r24 + c76: 4a f0 brmi .+18 ; 0xc8a <__mulsf3_pse+0x7a> + c78: ee 0f add r30, r30 + c7a: ff 1f adc r31, r31 + c7c: bb 1f adc r27, r27 + c7e: 66 1f adc r22, r22 + c80: 77 1f adc r23, r23 + c82: 88 1f adc r24, r24 + c84: 91 50 subi r25, 0x01 ; 1 + c86: 50 40 sbci r21, 0x00 ; 0 + c88: a9 f7 brne .-22 ; 0xc74 <__mulsf3_pse+0x64> + c8a: 9e 3f cpi r25, 0xFE ; 254 + c8c: 51 05 cpc r21, r1 + c8e: 80 f0 brcs .+32 ; 0xcb0 <__mulsf3_pse+0xa0> + c90: 0c 94 a1 05 jmp 0xb42 ; 0xb42 <__fp_inf> + c94: 0c 94 ec 05 jmp 0xbd8 ; 0xbd8 <__fp_szero> + c98: 5f 3f cpi r21, 0xFF ; 255 + c9a: e4 f3 brlt .-8 ; 0xc94 <__mulsf3_pse+0x84> + c9c: 98 3e cpi r25, 0xE8 ; 232 + c9e: d4 f3 brlt .-12 ; 0xc94 <__mulsf3_pse+0x84> + ca0: 86 95 lsr r24 + ca2: 77 95 ror r23 + ca4: 67 95 ror r22 + ca6: b7 95 ror r27 + ca8: f7 95 ror r31 + caa: e7 95 ror r30 + cac: 9f 5f subi r25, 0xFF ; 255 + cae: c1 f7 brne .-16 ; 0xca0 <__mulsf3_pse+0x90> + cb0: fe 2b or r31, r30 + cb2: 88 0f add r24, r24 + cb4: 91 1d adc r25, r1 + cb6: 96 95 lsr r25 + cb8: 87 95 ror r24 + cba: 97 f9 bld r25, 7 + cbc: 08 95 ret + +00000cbe <__divmodhi4>: + cbe: 97 fb bst r25, 7 + cc0: 07 2e mov r0, r23 + cc2: 16 f4 brtc .+4 ; 0xcc8 <__divmodhi4+0xa> + cc4: 00 94 com r0 + cc6: 07 d0 rcall .+14 ; 0xcd6 <__divmodhi4_neg1> + cc8: 77 fd sbrc r23, 7 + cca: 09 d0 rcall .+18 ; 0xcde <__divmodhi4_neg2> + ccc: 0e 94 79 06 call 0xcf2 ; 0xcf2 <__udivmodhi4> + cd0: 07 fc sbrc r0, 7 + cd2: 05 d0 rcall .+10 ; 0xcde <__divmodhi4_neg2> + cd4: 3e f4 brtc .+14 ; 0xce4 <__divmodhi4_exit> + +00000cd6 <__divmodhi4_neg1>: + cd6: 90 95 com r25 + cd8: 81 95 neg r24 + cda: 9f 4f sbci r25, 0xFF ; 255 + cdc: 08 95 ret + +00000cde <__divmodhi4_neg2>: + cde: 70 95 com r23 + ce0: 61 95 neg r22 + ce2: 7f 4f sbci r23, 0xFF ; 255 + +00000ce4 <__divmodhi4_exit>: + ce4: 08 95 ret + +00000ce6 <__tablejump2__>: + ce6: ee 0f add r30, r30 + ce8: ff 1f adc r31, r31 + cea: 05 90 lpm r0, Z+ + cec: f4 91 lpm r31, Z + cee: e0 2d mov r30, r0 + cf0: 09 94 ijmp + +00000cf2 <__udivmodhi4>: + cf2: aa 1b sub r26, r26 + cf4: bb 1b sub r27, r27 + cf6: 51 e1 ldi r21, 0x11 ; 17 + cf8: 07 c0 rjmp .+14 ; 0xd08 <__udivmodhi4_ep> + +00000cfa <__udivmodhi4_loop>: + cfa: aa 1f adc r26, r26 + cfc: bb 1f adc r27, r27 + cfe: a6 17 cp r26, r22 + d00: b7 07 cpc r27, r23 + d02: 10 f0 brcs .+4 ; 0xd08 <__udivmodhi4_ep> + d04: a6 1b sub r26, r22 + d06: b7 0b sbc r27, r23 + +00000d08 <__udivmodhi4_ep>: + d08: 88 1f adc r24, r24 + d0a: 99 1f adc r25, r25 + d0c: 5a 95 dec r21 + d0e: a9 f7 brne .-22 ; 0xcfa <__udivmodhi4_loop> + d10: 80 95 com r24 + d12: 90 95 com r25 + d14: bc 01 movw r22, r24 + d16: cd 01 movw r24, r26 + d18: 08 95 ret + +00000d1a <_exit>: + d1a: f8 94 cli + +00000d1c <__stop_program>: + d1c: ff cf rjmp .-2 ; 0xd1c <__stop_program> diff --git a/sketches/pendulum/pendulum.lst b/sketches/pendulum/pendulum.lst new file mode 100644 index 0000000..17f6d92 --- /dev/null +++ b/sketches/pendulum/pendulum.lst @@ -0,0 +1,1078 @@ + 1 .file "pendulum.c" + 2 __SP_H__ = 0x3e + 3 __SP_L__ = 0x3d + 4 __SREG__ = 0x3f + 5 __tmp_reg__ = 0 + 6 __zero_reg__ = 1 + 9 .text + 10 .Ltext0: + 113 .global __vector_2 + 115 __vector_2: + 116 .stabd 46,0,0 + 1:pendulum.c **** #define F_CPU 20000000UL + 2:pendulum.c **** #include + 3:pendulum.c **** #include + 4:pendulum.c **** #include + 5:pendulum.c **** + 6:pendulum.c **** #include + 7:pendulum.c **** #include + 8:pendulum.c **** #include + 9:pendulum.c **** + 10:pendulum.c **** #include "color_hsv.h" + 11:pendulum.c **** #define HUE_MAX 610 + 12:pendulum.c **** #define HUE_MIN 350 + 13:pendulum.c **** #define HUE_MID ((HUE_MAX + HUE_MIN) / 2) + 14:pendulum.c **** #define HUE_DIF (HUE_MAX - HUE_MIN) + 15:pendulum.c **** #define HUE_SAT 100 // 0 = white, 100 = color + 16:pendulum.c **** #define HUE_VAL 20 // 0 = black, 100 = color + 17:pendulum.c **** #define HUE_STEP 8 // 8 + 18:pendulum.c **** const uint32_t colorSteps = HUE_DIF / HUE_STEP; + 19:pendulum.c **** //~ const uint32_t colorSteps = 5; + 20:pendulum.c **** + 21:pendulum.c **** #define LEDS 30 + 22:pendulum.c **** + 23:pendulum.c **** // Prototypes: + 24:pendulum.c **** void writeZero(void); + 25:pendulum.c **** void writeOne(void); + 26:pendulum.c **** void writeRGB(uint8_t red, uint8_t green, uint8_t blue); + 27:pendulum.c **** + 28:pendulum.c **** // Interrupt variables: + 29:pendulum.c **** int8_t volatile status = 1; + 30:pendulum.c **** uint16_t volatile min = HUE_MID; + 31:pendulum.c **** uint16_t volatile max = HUE_MID; + 32:pendulum.c **** uint32_t volatile time = 0; + 33:pendulum.c **** uint32_t volatile T_half = 0; + 34:pendulum.c **** uint32_t volatile oldTime = 0; + 35:pendulum.c **** uint32_t volatile cooldown = 0; + 36:pendulum.c **** //~ uint32_t volatile delay = 0; + 37:pendulum.c **** + 38:pendulum.c **** // On External Interrupt: + 39:pendulum.c **** ISR(INT1_vect) { + 118 .LM0: + 119 .LFBB1: + 120 0000 1F92 push r1 + 121 0002 0F92 push r0 + 122 0004 0FB6 in r0,__SREG__ + 123 0006 0F92 push r0 + 124 0008 1124 clr __zero_reg__ + 125 000a 2F93 push r18 + 126 000c 3F93 push r19 + 127 000e 8F93 push r24 + 128 0010 9F93 push r25 + 129 0012 AF93 push r26 + 130 0014 BF93 push r27 + 131 0016 EF93 push r30 + 132 0018 FF93 push r31 + 133 /* prologue: Signal */ + 134 /* frame size = 0 */ + 135 /* stack size = 11 */ + 136 .L__stack_usage = 11 + 40:pendulum.c **** EIMSK &= 0xfd; // Disable INT1 + 138 .LM1: + 139 001a E998 cbi 0x1d,1 + 41:pendulum.c **** T_half = time + TCNT1; + 141 .LM2: + 142 001c 8091 0000 lds r24,time + 143 0020 9091 0000 lds r25,time+1 + 144 0024 A091 0000 lds r26,time+2 + 145 0028 B091 0000 lds r27,time+3 + 146 002c E4E8 ldi r30,lo8(-124) + 147 002e F0E0 ldi r31,0 + 148 0030 2081 ld r18,Z + 149 0032 3181 ldd r19,Z+1 + 150 0034 820F add r24,r18 + 151 0036 931F adc r25,r19 + 152 0038 A11D adc r26,__zero_reg__ + 153 003a B11D adc r27,__zero_reg__ + 154 003c 8093 0000 sts T_half,r24 + 155 0040 9093 0000 sts T_half+1,r25 + 156 0044 A093 0000 sts T_half+2,r26 + 157 0048 B093 0000 sts T_half+3,r27 + 42:pendulum.c **** //~ delay = T_half / 16; + 43:pendulum.c **** cooldown = T_half / 2; + 159 .LM3: + 160 004c 8091 0000 lds r24,T_half + 161 0050 9091 0000 lds r25,T_half+1 + 162 0054 A091 0000 lds r26,T_half+2 + 163 0058 B091 0000 lds r27,T_half+3 + 164 005c B695 lsr r27 + 165 005e A795 ror r26 + 166 0060 9795 ror r25 + 167 0062 8795 ror r24 + 168 0064 8093 0000 sts cooldown,r24 + 169 0068 9093 0000 sts cooldown+1,r25 + 170 006c A093 0000 sts cooldown+2,r26 + 171 0070 B093 0000 sts cooldown+3,r27 + 44:pendulum.c **** TCNT1 = 0; // Reset Timer/Counter1 + 173 .LM4: + 174 0074 1182 std Z+1,__zero_reg__ + 175 0076 1082 st Z,__zero_reg__ + 45:pendulum.c **** time = 0; + 177 .LM5: + 178 0078 1092 0000 sts time,__zero_reg__ + 179 007c 1092 0000 sts time+1,__zero_reg__ + 180 0080 1092 0000 sts time+2,__zero_reg__ + 181 0084 1092 0000 sts time+3,__zero_reg__ + 46:pendulum.c **** oldTime = 0; + 183 .LM6: + 184 0088 1092 0000 sts oldTime,__zero_reg__ + 185 008c 1092 0000 sts oldTime+1,__zero_reg__ + 186 0090 1092 0000 sts oldTime+2,__zero_reg__ + 187 0094 1092 0000 sts oldTime+3,__zero_reg__ + 47:pendulum.c **** PORTC ^= 0x02; + 189 .LM7: + 190 0098 98B1 in r25,0x8 + 191 009a 82E0 ldi r24,lo8(2) + 192 009c 8927 eor r24,r25 + 193 009e 88B9 out 0x8,r24 + 194 /* epilogue start */ + 48:pendulum.c **** //~ min = HUE_MID; + 49:pendulum.c **** //~ max = HUE_MID; + 50:pendulum.c **** //~ status = (status == 1 ? -1 : 1); + 51:pendulum.c **** } + 196 .LM8: + 197 00a0 FF91 pop r31 + 198 00a2 EF91 pop r30 + 199 00a4 BF91 pop r27 + 200 00a6 AF91 pop r26 + 201 00a8 9F91 pop r25 + 202 00aa 8F91 pop r24 + 203 00ac 3F91 pop r19 + 204 00ae 2F91 pop r18 + 205 00b0 0F90 pop r0 + 206 00b2 0FBE out __SREG__,r0 + 207 00b4 0F90 pop r0 + 208 00b6 1F90 pop r1 + 209 00b8 1895 reti + 211 .Lscope1: + 213 .stabd 78,0,0 + 215 .global __vector_13 + 217 __vector_13: + 218 .stabd 46,0,0 + 52:pendulum.c **** + 53:pendulum.c **** // On Timer Overflow Interrupt: + 54:pendulum.c **** ISR(TIMER1_OVF_vect) { + 220 .LM9: + 221 .LFBB2: + 222 00ba 1F92 push r1 + 223 00bc 0F92 push r0 + 224 00be 0FB6 in r0,__SREG__ + 225 00c0 0F92 push r0 + 226 00c2 1124 clr __zero_reg__ + 227 00c4 8F93 push r24 + 228 00c6 9F93 push r25 + 229 00c8 AF93 push r26 + 230 00ca BF93 push r27 + 231 /* prologue: Signal */ + 232 /* frame size = 0 */ + 233 /* stack size = 7 */ + 234 .L__stack_usage = 7 + 55:pendulum.c **** time += 0x00010000; + 236 .LM10: + 237 00cc 8091 0000 lds r24,time + 238 00d0 9091 0000 lds r25,time+1 + 239 00d4 A091 0000 lds r26,time+2 + 240 00d8 B091 0000 lds r27,time+3 + 241 00dc 1196 adiw r26,1 + 242 00de 8093 0000 sts time,r24 + 243 00e2 9093 0000 sts time+1,r25 + 244 00e6 A093 0000 sts time+2,r26 + 245 00ea B093 0000 sts time+3,r27 + 246 /* epilogue start */ + 56:pendulum.c **** } + 248 .LM11: + 249 00ee BF91 pop r27 + 250 00f0 AF91 pop r26 + 251 00f2 9F91 pop r25 + 252 00f4 8F91 pop r24 + 253 00f6 0F90 pop r0 + 254 00f8 0FBE out __SREG__,r0 + 255 00fa 0F90 pop r0 + 256 00fc 1F90 pop r1 + 257 00fe 1895 reti + 259 .Lscope2: + 261 .stabd 78,0,0 + 263 .global writeZero + 265 writeZero: + 266 .stabd 46,0,0 + 57:pendulum.c **** + 58:pendulum.c **** int main(void) { + 59:pendulum.c **** + 60:pendulum.c **** EIMSK |= 0x02; // External Interrupt Mask Register + 61:pendulum.c **** // Enable INT1 (PIN5) for interrupt + 62:pendulum.c **** EICRA |= 0x0c; // External Interrupt Control Register + 63:pendulum.c **** // INT1 on rising edge + 64:pendulum.c **** + 65:pendulum.c **** TIMSK1 |= 0x01; // Timer/Counter1 Interrupt Mask Register + 66:pendulum.c **** // Enable overflow interrupt + 67:pendulum.c **** TCCR1B |= 0x01; // Timer/Counter1 Control Register B + 68:pendulum.c **** // Prescale Factor 1 + 69:pendulum.c **** + 70:pendulum.c **** SREG |= 0x80; // Status Register + 71:pendulum.c **** // Enable global interrupts + 72:pendulum.c **** + 73:pendulum.c **** DDRC = 0x3f; // Digital Direction PORTC[5:0] = output + 74:pendulum.c **** PORTC = 0x00; + 75:pendulum.c **** + 76:pendulum.c **** // Init color + 77:pendulum.c **** hsv_t colorsHSV[LEDS]; + 78:pendulum.c **** rgb_t colorsRGB[LEDS]; + 79:pendulum.c **** interpolate( + 80:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + 81:pendulum.c **** init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + 82:pendulum.c **** LEDS, + 83:pendulum.c **** colorsHSV + 84:pendulum.c **** ); + 85:pendulum.c **** hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 86:pendulum.c **** // Assign color + 87:pendulum.c **** for(int i = 0; i < LEDS; i++) { + 88:pendulum.c **** writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 89:pendulum.c **** } + 90:pendulum.c **** + 91:pendulum.c **** // Next color + 92:pendulum.c **** int8_t sign = 1; + 93:pendulum.c **** min += sign * HUE_STEP; + 94:pendulum.c **** max -= sign * HUE_STEP; + 95:pendulum.c **** interpolate( + 96:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL),// from color + 97:pendulum.c **** init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + 98:pendulum.c **** LEDS, + 99:pendulum.c **** colorsHSV + 100:pendulum.c **** ); + 101:pendulum.c **** hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 102:pendulum.c **** + 103:pendulum.c **** while(1) { + 104:pendulum.c **** uint32_t now = time + TCNT1; + 105:pendulum.c **** //~ if(now > delay) { + 106:pendulum.c **** //~ PORTC |= 0x08; // PORTC3 = HIGH + 107:pendulum.c **** //~ } + 108:pendulum.c **** //~ if(now > delay * 2) { + 109:pendulum.c **** //~ PORTC &= 0xf7; // PORTC3 = LOW + 110:pendulum.c **** //~ } + 111:pendulum.c **** + 112:pendulum.c **** if(now > cooldown) { + 113:pendulum.c **** EIMSK |= 0x02; // Enable INT1 + 114:pendulum.c **** } + 115:pendulum.c **** + 116:pendulum.c **** uint32_t T_step = T_half / colorSteps; + 117:pendulum.c **** + 118:pendulum.c **** // Check if it is time for next color + 119:pendulum.c **** if(now > oldTime + T_step) { + 120:pendulum.c **** oldTime += T_step; + 121:pendulum.c **** PORTC ^= 0x04; + 122:pendulum.c **** // Assign color + 123:pendulum.c **** cli(); + 124:pendulum.c **** for(int i = 0; i < LEDS; i++) { + 125:pendulum.c **** writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 126:pendulum.c **** } + 127:pendulum.c **** sei(); + 128:pendulum.c **** //~ _delay_us(51); + 129:pendulum.c **** + 130:pendulum.c **** // Next color + 131:pendulum.c **** min += sign * HUE_STEP; + 132:pendulum.c **** max -= sign * HUE_STEP; + 133:pendulum.c **** interpolate( + 134:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + 135:pendulum.c **** init_hsv_t(max, HUE_SAT, HUE_VAL), // to color + 136:pendulum.c **** LEDS, + 137:pendulum.c **** colorsHSV + 138:pendulum.c **** ); + 139:pendulum.c **** hsv2rgbList(colorsHSV, colorsRGB, LEDS); + 140:pendulum.c **** // Check if reached amplitude + 141:pendulum.c **** if(sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + 142:pendulum.c **** sign = -1; + 143:pendulum.c **** } else if(sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 144:pendulum.c **** sign = 1; + 145:pendulum.c **** } + 146:pendulum.c **** //~ if(status == 1 && sign == 1 && (min >= HUE_MAX || max <= HUE_MIN)) { + 147:pendulum.c **** //~ sign = -1; + 148:pendulum.c **** //~ } else if(status == 1 && sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 149:pendulum.c **** //~ sign = 1; + 150:pendulum.c **** //~ } else if(status == -1 && sign == 1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 151:pendulum.c **** //~ sign = -1; + 152:pendulum.c **** //~ } else if(status == -1 && sign == -1 && (min >= HUE_MAX || max <= HUE_MIN)) { + 153:pendulum.c **** //~ sign = 1; + 154:pendulum.c **** //~ } + 155:pendulum.c **** } + 156:pendulum.c **** } + 157:pendulum.c **** } + 158:pendulum.c **** + 159:pendulum.c **** /*********************************************************************** + 160:pendulum.c **** * + 161:pendulum.c **** * TIMING + 162:pendulum.c **** * + 163:pendulum.c **** ************************************************************************ + 164:pendulum.c **** * f=20MHz -> T=0,05 µs = 50 ns + 165:pendulum.c **** * + 166:pendulum.c **** * 0,05 µs * 6 == 0.3 µs ~ 0.4 µs (+- 150ns) == [0.25, 0.55] µs + 167:pendulum.c **** * 0,05 µs * 14 == 0.7 µs ~ 0.8 µs (+- 150ns) == [0.65, 0.95] µs + 168:pendulum.c **** * 0,05 µs * 15 == 0.75 µs ~ 0.85 µs (+- 150ns) == [0.70, 1.00] µs + 169:pendulum.c **** * 0,05 µs * 8 == 0.35 µs ~ 0.45 µs (+- 150ns) == [0.30, 0.60] µs + 170:pendulum.c **** * 51 µs > 50 µs + 171:pendulum.c **** ************************************************************************/ + 172:pendulum.c **** // AVR-GCC optimizes multiple "nop"s on every optimization level + 173:pendulum.c **** // So we use timing from: + 174:pendulum.c **** // https://github.com/cpldcpu/light_ws2812/blob/master/light_ws2812_AVR/Light_WS2812/light_ws2812.c + 175:pendulum.c **** #define w_nop1 __asm__("nop \n\t") + 176:pendulum.c **** #define w_nop2 __asm__("rjmp .+0 \n\t") + 177:pendulum.c **** #define w_nop4 w_nop2; w_nop2 + 178:pendulum.c **** #define w_nop8 w_nop4; w_nop4 + 179:pendulum.c **** #define w_nop16 w_nop8; w_nop8 // Not used + 180:pendulum.c **** + 181:pendulum.c **** #define wait6 w_nop2; w_nop4 + 182:pendulum.c **** #define wait8 w_nop8 + 183:pendulum.c **** #define wait14 wait8; wait6 + 184:pendulum.c **** #define wait15 wait14; w_nop1 + 185:pendulum.c **** + 186:pendulum.c **** // WS2812B protocol + 187:pendulum.c **** inline void writeZero() { + 268 .LM12: + 269 .LFBB3: + 270 /* prologue: function */ + 271 /* frame size = 0 */ + 272 /* stack size = 0 */ + 273 .L__stack_usage = 0 + 188:pendulum.c **** PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + 275 .LM13: + 276 0100 409A sbi 0x8,0 + 189:pendulum.c **** wait6; + 278 .LM14: + 279 /* #APP */ + 280 ; 189 "pendulum.c" 1 + 281 0102 00C0 rjmp .+0 + 282 + 283 ; 0 "" 2 + 284 ; 189 "pendulum.c" 1 + 285 0104 00C0 rjmp .+0 + 286 + 287 ; 0 "" 2 + 288 ; 189 "pendulum.c" 1 + 289 0106 00C0 rjmp .+0 + 290 + 291 ; 0 "" 2 + 190:pendulum.c **** PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + 293 .LM15: + 294 /* #NOAPP */ + 295 0108 4098 cbi 0x8,0 + 191:pendulum.c **** wait15; + 297 .LM16: + 298 /* #APP */ + 299 ; 191 "pendulum.c" 1 + 300 010a 00C0 rjmp .+0 + 301 + 302 ; 0 "" 2 + 303 ; 191 "pendulum.c" 1 + 304 010c 00C0 rjmp .+0 + 305 + 306 ; 0 "" 2 + 307 ; 191 "pendulum.c" 1 + 308 010e 00C0 rjmp .+0 + 309 + 310 ; 0 "" 2 + 311 ; 191 "pendulum.c" 1 + 312 0110 00C0 rjmp .+0 + 313 + 314 ; 0 "" 2 + 315 ; 191 "pendulum.c" 1 + 316 0112 00C0 rjmp .+0 + 317 + 318 ; 0 "" 2 + 319 ; 191 "pendulum.c" 1 + 320 0114 00C0 rjmp .+0 + 321 + 322 ; 0 "" 2 + 323 ; 191 "pendulum.c" 1 + 324 0116 00C0 rjmp .+0 + 325 + 326 ; 0 "" 2 + 327 ; 191 "pendulum.c" 1 + 328 0118 0000 nop + 329 + 330 ; 0 "" 2 + 331 /* #NOAPP */ + 332 011a 0895 ret + 334 .Lscope3: + 336 .stabd 78,0,0 + 338 .global writeOne + 340 writeOne: + 341 .stabd 46,0,0 + 192:pendulum.c **** } + 193:pendulum.c **** + 194:pendulum.c **** // WS2812B protocol + 195:pendulum.c **** inline void writeOne() { + 343 .LM17: + 344 .LFBB4: + 345 /* prologue: function */ + 346 /* frame size = 0 */ + 347 /* stack size = 0 */ + 348 .L__stack_usage = 0 + 196:pendulum.c **** PORTC |= 0x01; // PORTC0 = 1, PORTC[5:1] = invariant + 350 .LM18: + 351 011c 409A sbi 0x8,0 + 197:pendulum.c **** wait14; + 353 .LM19: + 354 /* #APP */ + 355 ; 197 "pendulum.c" 1 + 356 011e 00C0 rjmp .+0 + 357 + 358 ; 0 "" 2 + 359 ; 197 "pendulum.c" 1 + 360 0120 00C0 rjmp .+0 + 361 + 362 ; 0 "" 2 + 363 ; 197 "pendulum.c" 1 + 364 0122 00C0 rjmp .+0 + 365 + 366 ; 0 "" 2 + 367 ; 197 "pendulum.c" 1 + 368 0124 00C0 rjmp .+0 + 369 + 370 ; 0 "" 2 + 371 ; 197 "pendulum.c" 1 + 372 0126 00C0 rjmp .+0 + 373 + 374 ; 0 "" 2 + 375 ; 197 "pendulum.c" 1 + 376 0128 00C0 rjmp .+0 + 377 + 378 ; 0 "" 2 + 379 ; 197 "pendulum.c" 1 + 380 012a 00C0 rjmp .+0 + 381 + 382 ; 0 "" 2 + 198:pendulum.c **** PORTC &= 0xfe; // PORTC0 = 0, PORTC[5:1] = invariant + 384 .LM20: + 385 /* #NOAPP */ + 386 012c 4098 cbi 0x8,0 + 199:pendulum.c **** wait8; + 388 .LM21: + 389 /* #APP */ + 390 ; 199 "pendulum.c" 1 + 391 012e 00C0 rjmp .+0 + 392 + 393 ; 0 "" 2 + 394 ; 199 "pendulum.c" 1 + 395 0130 00C0 rjmp .+0 + 396 + 397 ; 0 "" 2 + 398 ; 199 "pendulum.c" 1 + 399 0132 00C0 rjmp .+0 + 400 + 401 ; 0 "" 2 + 402 ; 199 "pendulum.c" 1 + 403 0134 00C0 rjmp .+0 + 404 + 405 ; 0 "" 2 + 406 /* #NOAPP */ + 407 0136 0895 ret + 409 .Lscope4: + 411 .stabd 78,0,0 + 416 .global writeRGB + 418 writeRGB: + 419 .stabd 46,0,0 + 200:pendulum.c **** } + 201:pendulum.c **** + 202:pendulum.c **** inline void writeRGB(uint8_t red, uint8_t green, uint8_t blue) { + 421 .LM22: + 422 .LFBB5: + 423 0138 AF92 push r10 + 424 013a BF92 push r11 + 425 013c CF92 push r12 + 426 013e DF92 push r13 + 427 0140 EF92 push r14 + 428 0142 FF92 push r15 + 429 0144 0F93 push r16 + 430 0146 1F93 push r17 + 431 0148 CF93 push r28 + 432 014a DF93 push r29 + 433 /* prologue: function */ + 434 /* frame size = 0 */ + 435 /* stack size = 10 */ + 436 .L__stack_usage = 10 + 437 014c C82E mov r12,r24 + 438 014e E42E mov r14,r20 + 440 .LM23: + 441 0150 C8E0 ldi r28,lo8(8) + 442 0152 D0E0 ldi r29,0 + 203:pendulum.c **** int i; + 204:pendulum.c **** + 205:pendulum.c **** for( i = 128; i > 0; i >>= 1 ) { + 444 .LM24: + 445 0154 00E8 ldi r16,lo8(-128) + 446 0156 10E0 ldi r17,0 + 206:pendulum.c **** if( green & i ){ + 448 .LM25: + 449 0158 A62E mov r10,r22 + 450 015a B12C mov r11,__zero_reg__ + 451 .L8: + 452 015c C801 movw r24,r16 + 453 015e 8A21 and r24,r10 + 454 0160 9B21 and r25,r11 + 455 0162 892B or r24,r25 + 456 0164 01F0 breq .L6 + 207:pendulum.c **** writeOne(); + 458 .LM26: + 459 0166 0E94 0000 call writeOne + 460 016a 00C0 rjmp .L7 + 461 .L6: + 208:pendulum.c **** } else { + 209:pendulum.c **** writeZero(); + 463 .LM27: + 464 016c 0E94 0000 call writeZero + 465 .L7: + 205:pendulum.c **** if( green & i ){ + 467 .LM28: + 468 0170 1595 asr r17 + 469 0172 0795 ror r16 + 470 0174 2197 sbiw r28,1 + 471 0176 01F4 brne .L8 + 472 0178 C8E0 ldi r28,lo8(8) + 473 017a D0E0 ldi r29,0 + 474 017c 00E8 ldi r16,lo8(-128) + 475 017e 10E0 ldi r17,0 + 210:pendulum.c **** } + 211:pendulum.c **** } + 212:pendulum.c **** + 213:pendulum.c **** for( i = 128; i > 0; i >>= 1 ) { + 214:pendulum.c **** if( red & i ){ + 477 .LM29: + 478 0180 D12C mov r13,__zero_reg__ + 479 .L11: + 480 0182 C801 movw r24,r16 + 481 0184 8C21 and r24,r12 + 482 0186 9D21 and r25,r13 + 483 0188 892B or r24,r25 + 484 018a 01F0 breq .L9 + 215:pendulum.c **** writeOne(); + 486 .LM30: + 487 018c 0E94 0000 call writeOne + 488 0190 00C0 rjmp .L10 + 489 .L9: + 216:pendulum.c **** } else { + 217:pendulum.c **** writeZero(); + 491 .LM31: + 492 0192 0E94 0000 call writeZero + 493 .L10: + 213:pendulum.c **** if( red & i ){ + 495 .LM32: + 496 0196 1595 asr r17 + 497 0198 0795 ror r16 + 498 019a 2197 sbiw r28,1 + 499 019c 01F4 brne .L11 + 500 019e C8E0 ldi r28,lo8(8) + 501 01a0 D0E0 ldi r29,0 + 502 01a2 00E8 ldi r16,lo8(-128) + 503 01a4 10E0 ldi r17,0 + 218:pendulum.c **** } + 219:pendulum.c **** } + 220:pendulum.c **** + 221:pendulum.c **** for( i = 128; i > 0; i >>= 1 ) { + 222:pendulum.c **** if( blue & i ){ + 505 .LM33: + 506 01a6 F12C mov r15,__zero_reg__ + 507 .L14: + 508 01a8 C801 movw r24,r16 + 509 01aa 8E21 and r24,r14 + 510 01ac 9F21 and r25,r15 + 511 01ae 892B or r24,r25 + 512 01b0 01F0 breq .L12 + 223:pendulum.c **** writeOne(); + 514 .LM34: + 515 01b2 0E94 0000 call writeOne + 516 01b6 00C0 rjmp .L13 + 517 .L12: + 224:pendulum.c **** } else { + 225:pendulum.c **** writeZero(); + 519 .LM35: + 520 01b8 0E94 0000 call writeZero + 521 .L13: + 221:pendulum.c **** if( blue & i ){ + 523 .LM36: + 524 01bc 1595 asr r17 + 525 01be 0795 ror r16 + 526 01c0 2197 sbiw r28,1 + 527 01c2 01F4 brne .L14 + 528 /* epilogue start */ + 226:pendulum.c **** } + 227:pendulum.c **** } + 228:pendulum.c **** } + 530 .LM37: + 531 01c4 DF91 pop r29 + 532 01c6 CF91 pop r28 + 533 01c8 1F91 pop r17 + 534 01ca 0F91 pop r16 + 535 01cc FF90 pop r15 + 536 01ce EF90 pop r14 + 537 01d0 DF90 pop r13 + 538 01d2 CF90 pop r12 + 539 01d4 BF90 pop r11 + 540 01d6 AF90 pop r10 + 541 01d8 0895 ret + 543 .Lscope5: + 545 .stabd 78,0,0 + 546 .section .text.startup,"ax",@progbits + 548 .global main + 550 main: + 551 .stabd 46,0,0 + 58:pendulum.c **** + 553 .LM38: + 554 .LFBB6: + 555 0000 CF93 push r28 + 556 0002 DF93 push r29 + 557 0004 CDB7 in r28,__SP_L__ + 558 0006 DEB7 in r29,__SP_H__ + 559 0008 C25D subi r28,-46 + 560 000a D109 sbc r29,__zero_reg__ + 561 000c 0FB6 in __tmp_reg__,__SREG__ + 562 000e F894 cli + 563 0010 DEBF out __SP_H__,r29 + 564 0012 0FBE out __SREG__,__tmp_reg__ + 565 0014 CDBF out __SP_L__,r28 + 566 /* prologue: function */ + 567 /* frame size = 210 */ + 568 /* stack size = 212 */ + 569 .L__stack_usage = 212 + 60:pendulum.c **** // Enable INT1 (PIN5) for interrupt + 571 .LM39: + 572 0016 E99A sbi 0x1d,1 + 62:pendulum.c **** // INT1 on rising edge + 574 .LM40: + 575 0018 8091 6900 lds r24,105 + 576 001c 8C60 ori r24,lo8(12) + 577 001e 8093 6900 sts 105,r24 + 65:pendulum.c **** // Enable overflow interrupt + 579 .LM41: + 580 0022 8091 6F00 lds r24,111 + 581 0026 8160 ori r24,lo8(1) + 582 0028 8093 6F00 sts 111,r24 + 67:pendulum.c **** // Prescale Factor 1 + 584 .LM42: + 585 002c 8091 8100 lds r24,129 + 586 0030 8160 ori r24,lo8(1) + 587 0032 8093 8100 sts 129,r24 + 70:pendulum.c **** // Enable global interrupts + 589 .LM43: + 590 0036 8FB7 in r24,__SREG__ + 591 0038 8068 ori r24,lo8(-128) + 592 003a 8FBF out __SREG__,r24 + 73:pendulum.c **** PORTC = 0x00; + 594 .LM44: + 595 003c 8FE3 ldi r24,lo8(63) + 596 003e 87B9 out 0x7,r24 + 74:pendulum.c **** + 598 .LM45: + 599 0040 18B8 out 0x8,__zero_reg__ + 79:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + 601 .LM46: + 602 0042 8091 0000 lds r24,max + 603 0046 9091 0000 lds r25,max+1 + 604 004a 44E1 ldi r20,lo8(20) + 605 004c 64E6 ldi r22,lo8(100) + 606 004e 0E94 0000 call init_hsv_t + 607 0052 4B01 movw r8,r22 + 608 0054 5C01 movw r10,r24 + 609 0056 8091 0000 lds r24,min + 610 005a 9091 0000 lds r25,min+1 + 611 005e 44E1 ldi r20,lo8(20) + 612 0060 64E6 ldi r22,lo8(100) + 613 0062 0E94 0000 call init_hsv_t + 614 0066 9E01 movw r18,r28 + 615 0068 2F5F subi r18,-1 + 616 006a 3F4F sbci r19,-1 + 617 006c 7901 movw r14,r18 + 618 006e 0EE1 ldi r16,lo8(30) + 619 0070 10E0 ldi r17,0 + 620 0072 A501 movw r20,r10 + 621 0074 9401 movw r18,r8 + 622 0076 0E94 0000 call interpolate + 85:pendulum.c **** // Assign color + 624 .LM47: + 625 007a 4EE1 ldi r20,lo8(30) + 626 007c 50E0 ldi r21,0 + 627 007e BE01 movw r22,r28 + 628 0080 6758 subi r22,-121 + 629 0082 7F4F sbci r23,-1 + 630 0084 C701 movw r24,r14 + 631 0086 0E94 0000 call hsv2rgbList + 632 008a 49E7 ldi r20,lo8(121) + 633 008c A42E mov r10,r20 + 634 008e B12C mov r11,__zero_reg__ + 635 0090 AC0E add r10,r28 + 636 0092 BD1E adc r11,r29 + 637 0094 32E0 ldi r19,2 + 638 0096 A30E add r10,r19 + 639 0098 B11C adc r11,__zero_reg__ + 640 009a 4E01 movw r8,r28 + 641 009c 85ED ldi r24,-43 + 642 009e 880E add r8,r24 + 643 00a0 911C adc r9,__zero_reg__ + 644 00a2 8501 movw r16,r10 + 645 .L20: + 646 00a4 D801 movw r26,r16 + 647 00a6 1197 sbiw r26,1 + 648 00a8 C801 movw r24,r16 + 649 00aa 0297 sbiw r24,2 + 650 .LBB2: + 88:pendulum.c **** } + 652 .LM48: + 653 00ac F801 movw r30,r16 + 654 00ae 4081 ld r20,Z + 655 00b0 6C91 ld r22,X + 656 00b2 FC01 movw r30,r24 + 657 00b4 8081 ld r24,Z + 658 00b6 0E94 0000 call writeRGB + 659 00ba 0D5F subi r16,-3 + 660 00bc 1F4F sbci r17,-1 + 87:pendulum.c **** writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 662 .LM49: + 663 00be 0815 cp r16,r8 + 664 00c0 1905 cpc r17,r9 + 665 00c2 01F4 brne .L20 + 666 .LBE2: + 93:pendulum.c **** max -= sign * HUE_STEP; + 668 .LM50: + 669 00c4 8091 0000 lds r24,min + 670 00c8 9091 0000 lds r25,min+1 + 671 00cc 0896 adiw r24,8 + 672 00ce 9093 0000 sts min+1,r25 + 673 00d2 8093 0000 sts min,r24 + 94:pendulum.c **** interpolate( + 675 .LM51: + 676 00d6 8091 0000 lds r24,max + 677 00da 9091 0000 lds r25,max+1 + 678 00de 0897 sbiw r24,8 + 679 00e0 9093 0000 sts max+1,r25 + 680 00e4 8093 0000 sts max,r24 + 95:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL),// from color + 682 .LM52: + 683 00e8 8091 0000 lds r24,max + 684 00ec 9091 0000 lds r25,max+1 + 685 00f0 44E1 ldi r20,lo8(20) + 686 00f2 64E6 ldi r22,lo8(100) + 687 00f4 0E94 0000 call init_hsv_t + 688 00f8 2B01 movw r4,r22 + 689 00fa 3C01 movw r6,r24 + 690 00fc 8091 0000 lds r24,min + 691 0100 9091 0000 lds r25,min+1 + 692 0104 44E1 ldi r20,lo8(20) + 693 0106 64E6 ldi r22,lo8(100) + 694 0108 0E94 0000 call init_hsv_t + 695 010c 9E01 movw r18,r28 + 696 010e 2F5F subi r18,-1 + 697 0110 3F4F sbci r19,-1 + 698 0112 7901 movw r14,r18 + 699 0114 0EE1 ldi r16,lo8(30) + 700 0116 10E0 ldi r17,0 + 701 0118 A301 movw r20,r6 + 702 011a 9201 movw r18,r4 + 703 011c 0E94 0000 call interpolate + 101:pendulum.c **** + 705 .LM53: + 706 0120 4EE1 ldi r20,lo8(30) + 707 0122 50E0 ldi r21,0 + 708 0124 BE01 movw r22,r28 + 709 0126 6758 subi r22,-121 + 710 0128 7F4F sbci r23,-1 + 711 012a C701 movw r24,r14 + 712 012c 0E94 0000 call hsv2rgbList + 92:pendulum.c **** min += sign * HUE_STEP; + 714 .LM54: + 715 0130 DD24 clr r13 + 716 0132 D394 inc r13 + 717 .LBB3: + 121:pendulum.c **** // Assign color + 719 .LM55: + 720 0134 34E0 ldi r19,lo8(4) + 721 0136 C32E mov r12,r19 + 722 .L23: + 104:pendulum.c **** //~ if(now > delay) { + 724 .LM56: + 725 0138 4091 0000 lds r20,time + 726 013c 5091 0000 lds r21,time+1 + 727 0140 6091 0000 lds r22,time+2 + 728 0144 7091 0000 lds r23,time+3 + 729 0148 8091 8400 lds r24,132 + 730 014c 9091 8500 lds r25,132+1 + 731 0150 480F add r20,r24 + 732 0152 591F adc r21,r25 + 733 0154 611D adc r22,__zero_reg__ + 734 0156 711D adc r23,__zero_reg__ + 112:pendulum.c **** EIMSK |= 0x02; // Enable INT1 + 736 .LM57: + 737 0158 8091 0000 lds r24,cooldown + 738 015c 9091 0000 lds r25,cooldown+1 + 739 0160 A091 0000 lds r26,cooldown+2 + 740 0164 B091 0000 lds r27,cooldown+3 + 741 0168 8417 cp r24,r20 + 742 016a 9507 cpc r25,r21 + 743 016c A607 cpc r26,r22 + 744 016e B707 cpc r27,r23 + 745 0170 00F4 brsh .L22 + 113:pendulum.c **** } + 747 .LM58: + 748 0172 E99A sbi 0x1d,1 + 749 .L22: + 116:pendulum.c **** + 751 .LM59: + 752 0174 8091 0000 lds r24,T_half + 753 0178 9091 0000 lds r25,T_half+1 + 754 017c A091 0000 lds r26,T_half+2 + 755 0180 B091 0000 lds r27,T_half+3 + 756 0184 25E0 ldi r18,5 + 757 1: + 758 0186 B695 lsr r27 + 759 0188 A795 ror r26 + 760 018a 9795 ror r25 + 761 018c 8795 ror r24 + 762 018e 2A95 dec r18 + 763 0190 01F4 brne 1b + 119:pendulum.c **** oldTime += T_step; + 765 .LM60: + 766 0192 0091 0000 lds r16,oldTime + 767 0196 1091 0000 lds r17,oldTime+1 + 768 019a 2091 0000 lds r18,oldTime+2 + 769 019e 3091 0000 lds r19,oldTime+3 + 770 01a2 080F add r16,r24 + 771 01a4 191F adc r17,r25 + 772 01a6 2A1F adc r18,r26 + 773 01a8 3B1F adc r19,r27 + 774 01aa 0417 cp r16,r20 + 775 01ac 1507 cpc r17,r21 + 776 01ae 2607 cpc r18,r22 + 777 01b0 3707 cpc r19,r23 + 778 01b2 00F4 brsh .L23 + 120:pendulum.c **** PORTC ^= 0x04; + 780 .LM61: + 781 01b4 4091 0000 lds r20,oldTime + 782 01b8 5091 0000 lds r21,oldTime+1 + 783 01bc 6091 0000 lds r22,oldTime+2 + 784 01c0 7091 0000 lds r23,oldTime+3 + 785 01c4 840F add r24,r20 + 786 01c6 951F adc r25,r21 + 787 01c8 A61F adc r26,r22 + 788 01ca B71F adc r27,r23 + 789 01cc 8093 0000 sts oldTime,r24 + 790 01d0 9093 0000 sts oldTime+1,r25 + 791 01d4 A093 0000 sts oldTime+2,r26 + 792 01d8 B093 0000 sts oldTime+3,r27 + 121:pendulum.c **** // Assign color + 794 .LM62: + 795 01dc 88B1 in r24,0x8 + 796 01de 8C25 eor r24,r12 + 797 01e0 88B9 out 0x8,r24 + 123:pendulum.c **** for(int i = 0; i < LEDS; i++) { + 799 .LM63: + 800 /* #APP */ + 801 ; 123 "pendulum.c" 1 + 802 01e2 F894 cli + 803 ; 0 "" 2 + 804 /* #NOAPP */ + 805 01e4 8501 movw r16,r10 + 806 .L24: + 807 01e6 D801 movw r26,r16 + 808 01e8 1197 sbiw r26,1 + 809 01ea C801 movw r24,r16 + 810 01ec 0297 sbiw r24,2 + 811 .LBB4: + 125:pendulum.c **** } + 813 .LM64: + 814 01ee F801 movw r30,r16 + 815 01f0 4081 ld r20,Z + 816 01f2 6C91 ld r22,X + 817 01f4 FC01 movw r30,r24 + 818 01f6 8081 ld r24,Z + 819 01f8 0E94 0000 call writeRGB + 820 01fc 0D5F subi r16,-3 + 821 01fe 1F4F sbci r17,-1 + 124:pendulum.c **** writeRGB( colorsRGB[i].r, colorsRGB[i].g, colorsRGB[i].b); + 823 .LM65: + 824 0200 0815 cp r16,r8 + 825 0202 1905 cpc r17,r9 + 826 0204 01F4 brne .L24 + 827 .LBE4: + 127:pendulum.c **** //~ _delay_us(51); + 829 .LM66: + 830 /* #APP */ + 831 ; 127 "pendulum.c" 1 + 832 0206 7894 sei + 833 ; 0 "" 2 + 131:pendulum.c **** max -= sign * HUE_STEP; + 835 .LM67: + 836 /* #NOAPP */ + 837 0208 8091 0000 lds r24,min + 838 020c 9091 0000 lds r25,min+1 + 839 0210 FD2D mov r31,r13 + 840 0212 28E0 ldi r18,lo8(8) + 841 0214 F202 muls r31,r18 + 842 0216 800D add r24,r0 + 843 0218 911D adc r25,r1 + 844 021a 1124 clr __zero_reg__ + 845 021c 9093 0000 sts min+1,r25 + 846 0220 8093 0000 sts min,r24 + 132:pendulum.c **** interpolate( + 848 .LM68: + 849 0224 8091 0000 lds r24,max + 850 0228 9091 0000 lds r25,max+1 + 851 022c 38E0 ldi r19,lo8(8) + 852 022e F302 muls r31,r19 + 853 0230 8019 sub r24,r0 + 854 0232 9109 sbc r25,r1 + 855 0234 1124 clr __zero_reg__ + 856 0236 9093 0000 sts max+1,r25 + 857 023a 8093 0000 sts max,r24 + 133:pendulum.c **** init_hsv_t(min, HUE_SAT, HUE_VAL), // from color + 859 .LM69: + 860 023e 8091 0000 lds r24,max + 861 0242 9091 0000 lds r25,max+1 + 862 0246 44E1 ldi r20,lo8(20) + 863 0248 64E6 ldi r22,lo8(100) + 864 024a 0E94 0000 call init_hsv_t + 865 024e 2B01 movw r4,r22 + 866 0250 3C01 movw r6,r24 + 867 0252 8091 0000 lds r24,min + 868 0256 9091 0000 lds r25,min+1 + 869 025a 44E1 ldi r20,lo8(20) + 870 025c 64E6 ldi r22,lo8(100) + 871 025e 0E94 0000 call init_hsv_t + 872 0262 FE01 movw r30,r28 + 873 0264 3196 adiw r30,1 + 874 0266 7F01 movw r14,r30 + 875 0268 0EE1 ldi r16,lo8(30) + 876 026a 10E0 ldi r17,0 + 877 026c A301 movw r20,r6 + 878 026e 9201 movw r18,r4 + 879 0270 0E94 0000 call interpolate + 139:pendulum.c **** // Check if reached amplitude + 881 .LM70: + 882 0274 4EE1 ldi r20,lo8(30) + 883 0276 50E0 ldi r21,0 + 884 0278 BE01 movw r22,r28 + 885 027a 6758 subi r22,-121 + 886 027c 7F4F sbci r23,-1 + 887 027e C701 movw r24,r14 + 888 0280 0E94 0000 call hsv2rgbList + 141:pendulum.c **** sign = -1; + 890 .LM71: + 891 0284 F1E0 ldi r31,lo8(1) + 892 0286 DF12 cpse r13,r31 + 893 0288 00C0 rjmp .L25 + 141:pendulum.c **** sign = -1; + 895 .LM72: + 896 028a 8091 0000 lds r24,min + 897 028e 9091 0000 lds r25,min+1 + 898 0292 8236 cpi r24,98 + 899 0294 9240 sbci r25,2 + 900 0296 00F0 brlo .L34 + 901 .L28: + 142:pendulum.c **** } else if(sign == -1 && (min <= HUE_MIN || max >= HUE_MAX)) { + 903 .LM73: + 904 0298 DD24 clr r13 + 905 029a DA94 dec r13 + 906 029c 00C0 rjmp .L23 + 907 .L34: + 141:pendulum.c **** sign = -1; + 909 .LM74: + 910 029e 8091 0000 lds r24,max + 911 02a2 9091 0000 lds r25,max+1 + 912 02a6 8F35 cpi r24,95 + 913 02a8 9140 sbci r25,1 + 914 02aa 00F0 brlo .L28 + 915 02ac 00C0 rjmp .L23 + 916 .L25: + 143:pendulum.c **** sign = 1; + 918 .LM75: + 919 02ae 8FEF ldi r24,lo8(-1) + 920 02b0 D816 cp r13,r24 + 921 02b2 01F0 breq .L35 + 922 02b4 D12C mov r13,__zero_reg__ + 923 02b6 00C0 rjmp .L23 + 924 .L35: + 143:pendulum.c **** sign = 1; + 926 .LM76: + 927 02b8 8091 0000 lds r24,min + 928 02bc 9091 0000 lds r25,min+1 + 929 02c0 8F35 cpi r24,95 + 930 02c2 9140 sbci r25,1 + 931 02c4 00F4 brsh .L36 + 932 .L30: + 144:pendulum.c **** } + 934 .LM77: + 935 02c6 DD24 clr r13 + 936 02c8 D394 inc r13 + 937 02ca 00C0 rjmp .L23 + 938 .L36: + 143:pendulum.c **** sign = 1; + 940 .LM78: + 941 02cc 8091 0000 lds r24,max + 942 02d0 9091 0000 lds r25,max+1 + 943 02d4 8236 cpi r24,98 + 944 02d6 9240 sbci r25,2 + 945 02d8 00F4 brsh .+2 + 946 02da 00C0 rjmp .L23 + 947 02dc 00C0 rjmp .L30 + 948 .LBE3: + 959 .Lscope6: + 961 .stabd 78,0,0 + 962 .global cooldown + 963 .section .bss + 966 cooldown: + 967 0000 0000 0000 .zero 4 + 968 .global oldTime + 971 oldTime: + 972 0004 0000 0000 .zero 4 + 973 .global T_half + 976 T_half: + 977 0008 0000 0000 .zero 4 + 978 .global time + 981 time: + 982 000c 0000 0000 .zero 4 + 983 .global max + 984 .data + 987 max: + 988 0000 E001 .word 480 + 989 .global min + 992 min: + 993 0002 E001 .word 480 + 994 .global status + 997 status: + 998 0004 01 .byte 1 + 999 .global colorSteps + 1000 .section .rodata + 1003 colorSteps: + 1004 0000 20 .byte 32 + 1005 0001 00 .byte 0 + 1006 0002 00 .byte 0 + 1007 0003 00 .byte 0 + 1016 .text + 1018 .Letext0: + 1019 .ident "GCC: (GNU) 4.9.2" + 1020 .global __do_copy_data + 1021 .global __do_clear_bss +DEFINED SYMBOLS + *ABS*:0000000000000000 pendulum.c + /tmp/ccgxWf0J.s:2 *ABS*:000000000000003e __SP_H__ + /tmp/ccgxWf0J.s:3 *ABS*:000000000000003d __SP_L__ + /tmp/ccgxWf0J.s:4 *ABS*:000000000000003f __SREG__ + /tmp/ccgxWf0J.s:5 *ABS*:0000000000000000 __tmp_reg__ + /tmp/ccgxWf0J.s:6 *ABS*:0000000000000001 __zero_reg__ + /tmp/ccgxWf0J.s:115 .text:0000000000000000 __vector_2 + /tmp/ccgxWf0J.s:981 .bss:000000000000000c time + /tmp/ccgxWf0J.s:976 .bss:0000000000000008 T_half + /tmp/ccgxWf0J.s:966 .bss:0000000000000000 cooldown + /tmp/ccgxWf0J.s:971 .bss:0000000000000004 oldTime + /tmp/ccgxWf0J.s:217 .text:00000000000000ba __vector_13 + /tmp/ccgxWf0J.s:265 .text:0000000000000100 writeZero + /tmp/ccgxWf0J.s:340 .text:000000000000011c writeOne + /tmp/ccgxWf0J.s:418 .text:0000000000000138 writeRGB + /tmp/ccgxWf0J.s:550 .text.startup:0000000000000000 main + /tmp/ccgxWf0J.s:987 .data:0000000000000000 max + /tmp/ccgxWf0J.s:992 .data:0000000000000002 min + /tmp/ccgxWf0J.s:997 .data:0000000000000004 status + /tmp/ccgxWf0J.s:1003 .rodata:0000000000000000 colorSteps + +UNDEFINED SYMBOLS +init_hsv_t +interpolate +hsv2rgbList +__do_copy_data +__do_clear_bss diff --git a/sketches/pendulum/pendulum.map b/sketches/pendulum/pendulum.map new file mode 100644 index 0000000..053f362 --- /dev/null +++ b/sketches/pendulum/pendulum.map @@ -0,0 +1,772 @@ +Archive member included to satisfy reference by file (symbol) + +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + color_hsv.o (__subsf3) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) (__addsf3x) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + color_hsv.o (__divsf3) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) (__divsf3x) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + color_hsv.o (__fixunssfsi) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + color_hsv.o (__floatunsisf) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_inf) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_nan) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_pscA) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_pscB) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) (__fp_round) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_split3) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) (__fp_zero) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + color_hsv.o (__mulsf3) +/usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) (__mulsf3x) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + color_hsv.o (__divmodhi4) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o (exit) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + color_hsv.o (__tablejump2__) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + pendulum.o (__do_copy_data) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + pendulum.o (__do_clear_bss) +/usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) (__udivmodhi4) + +↵ +Speichereinrichtung +↵ + +Name Ursprung Länge Eigenschaften +text 0x0000000000000000 0x0000000000020000 xr +data 0x0000000000800060 0x000000000000ffa0 rw !x +eeprom 0x0000000000810000 0x0000000000010000 rw !x +fuse 0x0000000000820000 0x0000000000000400 rw !x +lock 0x0000000000830000 0x0000000000000400 rw !x +signature 0x0000000000840000 0x0000000000000400 rw !x +user_signatures 0x0000000000850000 0x0000000000000400 rw !x +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +Address of section .data set to 0x800100 +LOAD /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +LOAD pendulum.o +LOAD color_hsv.o +LOAD /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a +START GROUP +LOAD /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a +LOAD /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a +LOAD /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libc.a +LOAD /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libatmega328p.a +END GROUP + +.hash + *(.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rela.init + *(.rela.init) + +.rel.text + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + +.rela.text + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + +.rel.fini + *(.rel.fini) + +.rela.fini + *(.rela.fini) + +.rel.rodata + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + +.rela.rodata + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + +.rel.data + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + +.rela.data + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + +.rel.ctors + *(.rel.ctors) + +.rela.ctors + *(.rela.ctors) + +.rel.dtors + *(.rel.dtors) + +.rela.dtors + *(.rela.dtors) + +.rel.got + *(.rel.got) + +.rela.got + *(.rela.got) + +.rel.bss + *(.rel.bss) + +.rela.bss + *(.rela.bss) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.text 0x0000000000000000 0xd60 + *(.vectors) + .vectors 0x0000000000000000 0x68 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + 0x0000000000000000 __vectors + 0x0000000000000000 __vector_default + *(.vectors) + *(.progmem.gcc*) + .progmem.gcc_sw_table + 0x0000000000000068 0xe color_hsv.o + 0x0000000000000076 . = ALIGN (0x2) + 0x0000000000000076 __trampolines_start = . + *(.trampolines) + .trampolines 0x0000000000000076 0x0 linker stubs + *(.trampolines*) + 0x0000000000000076 __trampolines_end = . + *(.progmem*) + 0x0000000000000076 . = ALIGN (0x2) + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) + 0x0000000000000076 __ctors_start = . + *(.ctors) + 0x0000000000000076 __ctors_end = . + 0x0000000000000076 __dtors_start = . + *(.dtors) + 0x0000000000000076 __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0 0x0000000000000076 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + 0x0000000000000076 __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2 0x0000000000000076 0xc /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4 0x0000000000000082 0x16 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + 0x0000000000000082 __do_copy_data + .init4 0x0000000000000098 0x10 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + 0x0000000000000098 __do_clear_bss + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9 0x00000000000000a8 0x8 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + *(.init9) + *(.text) + .text 0x00000000000000b0 0x4 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + 0x00000000000000b0 __vector_22 + 0x00000000000000b0 __vector_1 + 0x00000000000000b0 __vector_24 + 0x00000000000000b0 __vector_12 + 0x00000000000000b0 __bad_interrupt + 0x00000000000000b0 __vector_6 + 0x00000000000000b0 __vector_3 + 0x00000000000000b0 __vector_23 + 0x00000000000000b0 __vector_25 + 0x00000000000000b0 __vector_11 + 0x00000000000000b0 __vector_17 + 0x00000000000000b0 __vector_19 + 0x00000000000000b0 __vector_7 + 0x00000000000000b0 __vector_5 + 0x00000000000000b0 __vector_4 + 0x00000000000000b0 __vector_9 + 0x00000000000000b0 __vector_21 + 0x00000000000000b0 __vector_15 + 0x00000000000000b0 __vector_8 + 0x00000000000000b0 __vector_14 + 0x00000000000000b0 __vector_10 + 0x00000000000000b0 __vector_16 + 0x00000000000000b0 __vector_18 + 0x00000000000000b0 __vector_20 + .text 0x00000000000000b4 0x1da pendulum.o + 0x00000000000000b4 __vector_2 + 0x000000000000016e __vector_13 + 0x00000000000001b4 writeZero + 0x00000000000001d0 writeOne + 0x00000000000001ec writeRGB + .text 0x000000000000028e 0x382 color_hsv.o + 0x000000000000028e interpolate + 0x00000000000003c4 hsv2rgb + 0x00000000000005ba hsv2rgbList + 0x0000000000000604 init_hsv_t + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text 0x0000000000000610 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + 0x0000000000000610 . = ALIGN (0x2) + *(.text.*) + .text.startup 0x0000000000000610 0x2de pendulum.o + 0x0000000000000610 main + .text.avr-libc.fplib + 0x00000000000008ee 0xe /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + 0x00000000000008ee __subsf3 + 0x00000000000008f0 __addsf3 + .text.avr-libc.fplib + 0x00000000000008fc 0xcc /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + 0x000000000000091e __addsf3x + .text.avr-libc.fplib + 0x00000000000009c8 0x8 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + 0x00000000000009c8 __divsf3 + .text.avr-libc.fplib + 0x00000000000009d0 0xdc /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + 0x00000000000009f0 __divsf3x + 0x00000000000009f6 __divsf3_pse + .text.avr-libc.fplib + 0x0000000000000aac 0x5e /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + 0x0000000000000aac __fixunssfsi + .text.avr-libc.fplib + 0x0000000000000b0a 0x7a /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + 0x0000000000000b0a __floatunsisf + 0x0000000000000b0e __floatsisf + .text.avr-libc.fplib + 0x0000000000000b84 0xc /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + 0x0000000000000b84 __fp_inf + .text.avr-libc.fplib + 0x0000000000000b90 0x6 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + 0x0000000000000b90 __fp_nan + .text.avr-libc.fplib + 0x0000000000000b96 0xe /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + 0x0000000000000b96 __fp_pscA + .text.avr-libc.fplib + 0x0000000000000ba4 0xe /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + 0x0000000000000ba4 __fp_pscB + .text.avr-libc.fplib + 0x0000000000000bb2 0x22 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + 0x0000000000000bb2 __fp_round + .text.avr-libc.fplib + 0x0000000000000bd4 0x44 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + 0x0000000000000bd4 __fp_split3 + 0x0000000000000be4 __fp_splitA + .text.avr-libc.fplib + 0x0000000000000c18 0xe /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + 0x0000000000000c18 __fp_zero + 0x0000000000000c1a __fp_szero + .text.avr-libc.fplib + 0x0000000000000c26 0x8 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + 0x0000000000000c26 __mulsf3 + .text.avr-libc.fplib + 0x0000000000000c2e 0xd2 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + 0x0000000000000c4c __mulsf3x + 0x0000000000000c52 __mulsf3_pse + .text.libgcc.mul + 0x0000000000000d00 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.div + 0x0000000000000d00 0x28 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + 0x0000000000000d00 __divmodhi4 + 0x0000000000000d00 _div + .text.libgcc 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.prologue + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.builtins + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.fmul + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.fixed + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .text.libgcc.mul + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.div + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.prologue + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.builtins + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.fmul + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.fixed + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .text.libgcc.mul + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc.div + 0x0000000000000d28 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc 0x0000000000000d28 0xc /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + 0x0000000000000d28 __tablejump2__ + .text.libgcc.prologue + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc.builtins + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc.fmul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc.fixed + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .text.libgcc.mul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.div + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.prologue + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.builtins + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.fmul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.fixed + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .text.libgcc.mul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.div + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.prologue + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.builtins + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.fmul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.fixed + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .text.libgcc.mul + 0x0000000000000d34 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + .text.libgcc.div + 0x0000000000000d34 0x28 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + 0x0000000000000d34 __udivmodhi4 + .text.libgcc 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + .text.libgcc.prologue + 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + .text.libgcc.builtins + 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + .text.libgcc.fmul + 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + .text.libgcc.fixed + 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + 0x0000000000000d5c . = ALIGN (0x2) + *(.fini9) + .fini9 0x0000000000000d5c 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + 0x0000000000000d5c exit + 0x0000000000000d5c _exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0 0x0000000000000d5c 0x4 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + *(.fini0) + 0x0000000000000d60 _etext = . + +.data 0x0000000000800100 0xa load address 0x0000000000000d60 + 0x0000000000800100 PROVIDE (__data_start, .) + *(.data) + .data 0x0000000000800100 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + .data 0x0000000000800100 0x5 pendulum.o + 0x0000000000800100 max + 0x0000000000800102 min + 0x0000000000800104 status + .data 0x0000000000800105 0x0 color_hsv.o + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .data 0x0000000000800105 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + *(.data*) + *(.rodata) + .rodata 0x0000000000800105 0x4 pendulum.o + 0x0000000000800105 colorSteps + *(.rodata*) + *(.gnu.linkonce.d*) + 0x000000000080010a . = ALIGN (0x2) + *fill* 0x0000000000800109 0x1 + 0x000000000080010a _edata = . + 0x000000000080010a PROVIDE (__data_end, .) + +.bss 0x000000000080010a 0x10 + 0x000000000080010a PROVIDE (__bss_start, .) + *(.bss) + .bss 0x000000000080010a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + .bss 0x000000000080010a 0x10 pendulum.o + 0x000000000080010a cooldown + 0x000000000080010e oldTime + 0x0000000000800112 T_half + 0x0000000000800116 time + .bss 0x000000000080011a 0x0 color_hsv.o + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + .bss 0x000000000080011a 0x0 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + *(.bss*) + *(COMMON) + 0x000000000080011a PROVIDE (__bss_end, .) + 0x0000000000000d60 __data_load_start = LOADADDR (.data) + 0x0000000000000d6a __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x000000000080011a 0x0 + 0x000000000080011a PROVIDE (__noinit_start, .) + *(.noinit*) + 0x000000000080011a PROVIDE (__noinit_end, .) + 0x000000000080011a _end = . + 0x000000000080011a PROVIDE (__heap_start, .) + +.eeprom 0x0000000000810000 0x0 + *(.eeprom*) + 0x0000000000810000 __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.user_signatures + *(.user_signatures*) + +.stab 0x0000000000000000 0x1110 + *(.stab) + .stab 0x0000000000000000 0xab0 pendulum.o + .stab 0x0000000000000ab0 0x660 color_hsv.o + 0x834 (size before relaxing) + +.stabstr 0x0000000000000000 0xf67 + *(.stabstr) + .stabstr 0x0000000000000000 0xf67 pendulum.o + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x0000000000000000 0x11 + *(.comment) + .comment 0x0000000000000000 0x11 pendulum.o + 0x12 (size before relaxing) + .comment 0x0000000000000011 0x12 color_hsv.o + +.note.gnu.avr.deviceinfo + 0x0000000000000000 0x40 + .note.gnu.avr.deviceinfo + 0x0000000000000000 0x40 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o + +.note.gnu.build-id + *(.note.gnu.build-id) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges + *(.debug_aranges) + +.debug_pubnames + *(.debug_pubnames) + +.debug_info + *(.debug_info .gnu.linkonce.wi.*) + +.debug_abbrev + *(.debug_abbrev) + +.debug_line + *(.debug_line .debug_line.* .debug_line_end) + +.debug_frame + *(.debug_frame) + +.debug_str + *(.debug_str) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges + *(.debug_ranges) + +.debug_macro + *(.debug_macro) +OUTPUT(pendulum.elf elf32-avr) +LOAD linker stubs + +Kreuzreferenz-Tabelle + +Symbol Datei +T_half pendulum.o +__addsf3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) +__addsf3x /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) +__bad_interrupt /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__bss_end /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) +__bss_start /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) +__data_end /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) +__data_load_start /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) +__data_start /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) +__divmodhi4 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) + color_hsv.o +__divsf3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + color_hsv.o +__divsf3_pse /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) +__divsf3x /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) +__do_clear_bss /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_clear_bss.o) + pendulum.o +__do_copy_data /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_copy_data.o) + pendulum.o +__fixunssfsi /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + color_hsv.o +__floatsisf /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + color_hsv.o +__floatunsisf /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(floatsisf.o) + color_hsv.o +__fp_inf /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_inf.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__fp_nan /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_nan.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__fp_pscA /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscA.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__fp_pscB /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_pscB.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__fp_round /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_round.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) +__fp_split3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__fp_splitA /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_split3.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) +__fp_szero /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(divsf3x.o) +__fp_zero /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fp_zero.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(fixunssfsi.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3x.o) +__heap_end /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__init /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__mulsf3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) + color_hsv.o +__mulsf3_pse /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) +__mulsf3x /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3x.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(mulsf3.o) +__stack /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__subsf3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/libm.a(addsf3.o) + color_hsv.o +__tablejump2__ /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_tablejump2.o) + color_hsv.o +__udivmodhi4 /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_udivmodhi4.o) + /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) +__vector_1 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_10 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_11 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_12 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_13 pendulum.o + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_14 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_15 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_16 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_17 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_18 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_19 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_2 pendulum.o + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_20 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_21 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_22 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_23 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_24 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_25 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_3 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_4 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_5 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_6 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_7 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_8 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_9 /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vector_default /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +__vectors /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +_div /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_divmodhi4.o) +_exit /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) +colorSteps pendulum.o +cooldown pendulum.o +exit /usr/lib/gcc/avr/4.9.2/avr5/libgcc.a(_exit.o) + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +hsv2rgb color_hsv.o +hsv2rgbList color_hsv.o + pendulum.o +init_hsv_t color_hsv.o + pendulum.o +interpolate color_hsv.o + pendulum.o +main pendulum.o + /usr/lib/gcc/avr/4.9.2/../../../avr/lib/avr5/crtatmega328p.o +max pendulum.o +min pendulum.o +oldTime pendulum.o +status pendulum.o +time pendulum.o +writeOne pendulum.o +writeRGB pendulum.o +writeZero pendulum.o diff --git a/sketches/pendulum/pendulum.o b/sketches/pendulum/pendulum.o new file mode 100644 index 0000000000000000000000000000000000000000..800da2d3148223e73641d43e1e02b4a1baa0a30e GIT binary patch literal 11412 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