diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d236173 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/.dep/ +*.eep +*.elf +*.hex +*.lss +*.lst +*.map +*.o +*.sym +__* \ No newline at end of file diff --git a/libs/serialdebug.c b/libs/serialdebug.c index 493d5ae..717e65e 100644 --- a/libs/serialdebug.c +++ b/libs/serialdebug.c @@ -61,8 +61,15 @@ void dbg_putstring_nl(char string[]) { } void dbg_putint(unsigned int num) { - // Create string representing int and print to serial + // Create string representing an int and print to serial char c[7]; itoa(num, c, 10); dbg_putstring(c); } + +void dbg_putlong(long num) { + // Create string representing a long int and print to serial + char c[16]; + ltoa(num, c, 10); + dbg_putstring(c); +} diff --git a/libs/serialdebug.lst b/libs/serialdebug.lst deleted file mode 100644 index 2fcf550..0000000 --- a/libs/serialdebug.lst +++ /dev/null @@ -1,595 +0,0 @@ - 1 .file "serialdebug.c" - 2 __SP_H__ = 0x3e - 3 __SP_L__ = 0x3d - 4 __SREG__ = 0x3f - 5 __tmp_reg__ = 0 - 6 __zero_reg__ = 1 - 7 .text - 8 .Ltext0: - 9 .cfi_sections .debug_frame - 10 .global usart_putchar - 12 usart_putchar: - 13 .LFB8: - 14 .file 1 "libs/serialdebug.c" - 1:libs/serialdebug.c **** #include - 2:libs/serialdebug.c **** - 3:libs/serialdebug.c **** #if SERIALDEBUG_USE_INTS - 4:libs/serialdebug.c **** #include - 5:libs/serialdebug.c **** #endif - 6:libs/serialdebug.c **** - 7:libs/serialdebug.c **** void serial_configure(void) { - 8:libs/serialdebug.c **** // Configure serial output - 9:libs/serialdebug.c **** SERIALDEBUG_SOFT_TX_PORT |= (1< - 43:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #include - 44:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #include - 45:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 46:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** /** \file */ - 47:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** /** \defgroup util_delay : Convenience functions for busy-wait delay loops - 48:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \code - 49:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #define F_CPU 1000000UL // 1 MHz - 50:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** //#define F_CPU 14.7456E6 - 51:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #include - 52:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \endcode - 53:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 54:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \note As an alternative method, it is possible to pass the - 55:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** F_CPU macro down to the compiler from the Makefile. - 56:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Obviously, in that case, no \c \#define statement should be - 57:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** used. - 58:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 59:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The functions in this header file are wrappers around the basic - 60:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** busy-wait functions from . They are meant as - 61:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** convenience functions where actual time values can be specified - 62:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** rather than a number of cycles to wait for. The idea behind is - 63:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** that compile-time constant expressions will be eliminated by - 64:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** compiler optimization so floating-point expressions can be used - 65:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** to calculate the number of delay cycles needed based on the CPU - 66:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** frequency passed by the macro F_CPU. - 67:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 68:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \note In order for these functions to work as intended, compiler - 69:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** optimizations must be enabled, and the delay time - 70:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** must be an expression that is a known constant at - 71:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** compile-time. If these requirements are not met, the resulting - 72:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** delay will be much longer (and basically unpredictable), and - 73:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** applications that otherwise do not use floating-point calculations - 74:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** will experience severe code bloat by the floating-point library - 75:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** routines linked into the application. - 76:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 77:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The functions available allow the specification of microsecond, and - 78:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** millisecond delays directly, using the application-supplied macro - 79:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** F_CPU as the CPU clock frequency (in Hertz). - 80:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 81:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** */ - 82:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 83:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if !defined(__DOXYGEN__) - 84:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** static inline void _delay_us(double __us) __attribute__((always_inline)); - 85:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** static inline void _delay_ms(double __ms) __attribute__((always_inline)); - 86:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 87:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 88:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #ifndef F_CPU - 89:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** /* prevent compiler error by supplying a default */ - 90:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** # warning "F_CPU not defined for " - 91:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** # define F_CPU 1000000UL - 92:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 93:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 94:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #ifndef __OPTIMIZE__ - 95:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** # warning "Compiler optimizations disabled; functions from won't work as designed" - 96:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 97:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 98:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && \ - 99:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** !defined(__DELAY_BACKWARD_COMPATIBLE__) && \ - 100:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __STDC_HOSTED__ - 101:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** # include - 102:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 103:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 104:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** /** - 105:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \ingroup util_delay - 106:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 107:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Perform a delay of \c __ms milliseconds, using _delay_loop_2(). - 108:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 109:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The macro F_CPU is supposed to be defined to a - 110:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** constant defining the CPU clock frequency (in Hertz). - 111:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 112:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The maximal possible delay is 262.14 ms / F_CPU in MHz. - 113:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 114:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** When the user request delay which exceed the maximum possible one, - 115:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_ms() provides a decreased resolution functionality. In this - 116:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** mode _delay_ms() will work with a resolution of 1/10 ms, providing - 117:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** delays up to 6.5535 seconds (independent from CPU frequency). The - 118:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** user will not be informed about decreased resolution. - 119:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 120:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) - 121:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** support, maximal possible delay is 4294967.295 ms/ F_CPU in MHz. For - 122:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** values greater than the maximal possible delay, overflows results in - 123:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** no delay i.e., 0ms. - 124:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 125:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Conversion of __us into clock cycles may not always result in integer. - 126:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** By default, the clock cycles rounded up to next integer. This ensures that - 127:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** the user gets atleast __us microseconds of delay. - 128:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 129:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Alternatively, user can define __DELAY_ROUND_DOWN__ and __DELAY_ROUND_CLOSEST__ - 130:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** to round down and round to closest integer. - 131:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 132:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Note: The new implementation of _delay_ms(double __ms) with - 133:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __builtin_avr_delay_cycles(unsigned long) support is not backward compatible. - 134:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** User can define __DELAY_BACKWARD_COMPATIBLE__ to get a backward compatible delay. - 135:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Also, the backward compatible - 136:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** algorithm will be chosen if the code is compiled in a freestanding - 137:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** environment (GCC option \c -ffreestanding), as the math functions - 138:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** required for rounding are not available to the compiler then. - 139:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 140:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** */ - 141:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** void - 142:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_ms(double __ms) - 143:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** { - 144:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** double __tmp ; - 145:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && \ - 146:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** !defined(__DELAY_BACKWARD_COMPATIBLE__) && \ - 147:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __STDC_HOSTED__ - 148:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** uint32_t __ticks_dc; - 149:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** extern void __builtin_avr_delay_cycles(unsigned long); - 150:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __tmp = ((F_CPU) / 1e3) * __ms; - 151:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 152:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if defined(__DELAY_ROUND_DOWN__) - 153:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)fabs(__tmp); - 154:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 155:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #elif defined(__DELAY_ROUND_CLOSEST__) - 156:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)(fabs(__tmp)+0.5); - 157:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 158:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #else - 159:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** //round up by default - 160:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); - 161:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 162:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 163:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __builtin_avr_delay_cycles(__ticks_dc); - 164:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 165:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #else - 166:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** uint16_t __ticks; - 167:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __tmp = ((F_CPU) / 4e3) * __ms; - 168:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** if (__tmp < 1.0) - 169:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks = 1; - 170:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** else if (__tmp > 65535) - 171:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** { - 172:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** // __ticks = requested delay in 1/10 ms - 173:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks = (uint16_t) (__ms * 10.0); - 174:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** while(__ticks) - 175:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** { - 176:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** // wait 1/10 ms - 177:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_loop_2(((F_CPU) / 4e3) / 10); - 178:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks --; - 179:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** } - 180:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** return; - 181:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** } - 182:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** else - 183:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks = (uint16_t)__tmp; - 184:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_loop_2(__ticks); - 185:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 186:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** } - 187:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 188:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** /** - 189:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** \ingroup util_delay - 190:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 191:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Perform a delay of \c __us microseconds, using _delay_loop_1(). - 192:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 193:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The macro F_CPU is supposed to be defined to a - 194:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** constant defining the CPU clock frequency (in Hertz). - 195:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 196:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** The maximal possible delay is 768 us / F_CPU in MHz. - 197:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 198:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** If the user requests a delay greater than the maximal possible one, - 199:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_us() will automatically call _delay_ms() instead. The user - 200:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** will not be informed about this case. - 201:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 202:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) - 203:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** support, maximal possible delay is 4294967.295 us/ F_CPU in MHz. For - 204:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** values greater than the maximal possible delay, overflow results in - 205:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** no delay i.e., 0us. - 206:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 207:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Conversion of __us into clock cycles may not always result in integer. - 208:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** By default, the clock cycles rounded up to next integer. This ensures that - 209:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** the user gets atleast __us microseconds of delay. - 210:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 211:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Alternatively, user can define __DELAY_ROUND_DOWN__ and __DELAY_ROUND_CLOSEST__ - 212:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** to round down and round to closest integer. - 213:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 214:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Note: The new implementation of _delay_us(double __us) with - 215:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __builtin_avr_delay_cycles(unsigned long) support is not backward compatible. - 216:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** User can define __DELAY_BACKWARD_COMPATIBLE__ to get a backward compatible delay. - 217:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** Also, the backward compatible - 218:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** algorithm will be chosen if the code is compiled in a freestanding - 219:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** environment (GCC option \c -ffreestanding), as the math functions - 220:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** required for rounding are not available to the compiler then. - 221:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 222:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** */ - 223:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** void - 224:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** _delay_us(double __us) - 225:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** { - 226:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** double __tmp ; - 227:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && \ - 228:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** !defined(__DELAY_BACKWARD_COMPATIBLE__) && \ - 229:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __STDC_HOSTED__ - 230:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** uint32_t __ticks_dc; - 231:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** extern void __builtin_avr_delay_cycles(unsigned long); - 232:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __tmp = ((F_CPU) / 1e6) * __us; - 233:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 234:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #if defined(__DELAY_ROUND_DOWN__) - 235:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)fabs(__tmp); - 236:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 237:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #elif defined(__DELAY_ROUND_CLOSEST__) - 238:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)(fabs(__tmp)+0.5); - 239:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 240:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #else - 241:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** //round up by default - 242:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); - 243:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** #endif - 244:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** - 245:/usr/local/CrossPack-AVR-20131216/avr/include/util/delay.h **** __builtin_avr_delay_cycles(__ticks_dc); - 28 .loc 2 245 0 - 29 0002 EFEC ldi r30,lo8(207) - 30 0004 F0E0 ldi r31,hi8(207) - 31 0006 3197 1: sbiw r30,1 - 32 0008 01F4 brne 1b - 33 000a 00C0 rjmp . - 34 000c 0000 nop - 35 .LVL2: - 36 000e 28E0 ldi r18,lo8(8) - 37 0010 30E0 ldi r19,0 - 38 .LBE9: - 39 .LBE8: - 24:libs/serialdebug.c **** _delay_us(SERIALDEBUG_MICROSECONDS_PER_BIT); - 25:libs/serialdebug.c **** - 26:libs/serialdebug.c **** // data bits - 27:libs/serialdebug.c **** for (bit_mask=0x01; bit_mask; bit_mask<<=1) { - 40 .loc 1 27 0 - 41 0012 91E0 ldi r25,lo8(1) - 42 .LVL3: - 43 .L5: - 28:libs/serialdebug.c **** if (c & bit_mask) { - 44 .loc 1 28 0 - 45 0014 492F mov r20,r25 - 46 0016 4823 and r20,r24 - 47 0018 01F0 breq .L2 - 29:libs/serialdebug.c **** SERIALDEBUG_SOFT_TX_PORT |= (1< #include -// User settings -#define HOUR 3600 -// I wanted each block of time to be 45 mins, but my chip's clock is slow -// 40 should roughly scale to 45 -#define BLOCK_MINS 40 -// How long to pour for +/* User settings */ + +// How long between feedings is calculated as follows: +// BLOCK_BASE + ($setting * BLOCK_STEP) +// All units are minutes. +// $setting is the 0-15 value read from the speed knob + +#define BLOCK_BASE 360 +#define BLOCK_STEP 27 // I wanted 30 mins but my chip's clock is off + +// How long to pour for, in milliseconds +// Cannot be larger than an unsigned int #define DISPENSE_MS 12000 -/* +// When the device boots, it wiggles the motor to notify the user that is is alive. +// These settings control the length and spacing of the pulses, in milliseconds +#define WAKEUP_PULSE 100 +#define WAKEUP_BETWEEN 75 +#define NUM_PULSES 6 +/* Ports configuration */ - vcc [1 14] gnd - [2 13] input speed_0 - [3 12] input speed_1 - rst [4 11] input speed_2 -INT/input feed button [5 10] input speed_3 - motor [6 9] - debug serial [7 8] -*/ - -// Ports +// Attiny84 pin layout: +// vcc [1 14] gnd +// PB0 [2 13] PA0 input speed_0 +// PB1 [3 12] PA1 input speed_1 +// rst PB3 [4 11] PA2 input speed_2 +// INT/input feed button PB2 [5 10] PA3 input speed_3 +// motor control PA7 [6 9] PA4 +// debug serial PA6 [7 8] PA5 dial/motor enable +// Motor control #define FEED_DDR DDRA #define FEED_PORT PORTA #define FEED_BIT PA7 +// Dial/motor enable #define PWRON_DDR DDRA #define PWRON_PORT PORTA #define PWRON_BIT PA5 +// Force-feed input button - must be an interrupt pin #define FORCE_DDR DDRB #define FORCE_PORT PINB #define FORCE_BIT PB2 +// Dial inputs - NIBBLE0 is MSB #define NIBBLE0_DDR DDRA #define NIBBLE0_PORT PINA #define NIBBLE0_BIT PA0 @@ -69,7 +82,7 @@ void motor_off(void) { CLEAR_BIT(FEED_PORT, FEED_BIT); } -void dispense(int ms) { +void dispense(unsigned int ms) { // Activate motor for X ms motor_on(); while(ms > 0) { @@ -89,9 +102,6 @@ void pwr_off(void) { CLEAR_BIT(PWRON_PORT, PWRON_BIT); } -#define WAKEUP_PULSE 100 -#define WAKEUP_BETWEEN 75 - void bootpulse(void) { // Pulse the motor quickly motor_on(); @@ -101,9 +111,9 @@ void bootpulse(void) { } void wakeup(void) { - // Perform + // Notify the user the device is alive motor_on(); - for(int i=0;i<6;i++) bootpulse(); + for(int i=0;i 0) { for (int i = 0; i < 10; i++) _delay_ms(100); - #ifdef __DEBUG__ - dbg_putstring("Wait...\n"); - #endif } } @@ -124,6 +131,11 @@ uint8_t get_speed() { speed |= (IS_SET(NIBBLE2_PORT,NIBBLE2_BIT) << 1); speed |= (IS_SET(NIBBLE1_PORT,NIBBLE1_BIT) << 2); speed |= (IS_SET(NIBBLE0_PORT,NIBBLE0_BIT) << 3); + #ifdef __DEBUG__ + dbg_putstring("read setting: "); + dbg_putint(speed); + dbg_putstring("\r\n"); + #endif return speed; } @@ -143,10 +155,10 @@ void setup() { cli(); //disable global interrupts // Set ISC01= 1 and ISC00 = 0 to generate an external interrupt request - // on any change of INT0 + // on any change of INT0 (which is on PB2 on an attiny84) SET_BIT(MCUCR,ISC00); SET_BIT(MCUCR,ISC01); - //enable external interrupt request 0 + // enable external interrupt request 0 SET_BIT(GIMSK,INT0); // disable ADC (saves power) @@ -183,7 +195,7 @@ ISR (WDT_vect) { //external interrupt ISR (for INT0 pin) ISR(INT0_vect) { #ifdef __DEBUG__ - dbg_putstring("AYE MATEY\n"); + dbg_putstring("Woken from manual interrupt\r\n"); #endif pwr_on(); while(IS_SET(FORCE_PORT, FORCE_BIT)) { @@ -200,7 +212,7 @@ int main(void) { #ifdef __DEBUG__ serial_configure(); - dbg_putstring("\n\n"); + dbg_putstring(".\r\n\r\n\r\n\r\n\r\nCatFeeder v1.2 Booted!\r\n = ^_^ =\r\n\r\n"); #endif // Configure the mcu @@ -210,33 +222,39 @@ int main(void) { pwr_on(); wakeup(); pwr_off(); - delay_s(1); while (1) { if (seconds_since_last_spin % 10 == 0) { + // Power on the input dial, delay while it warms up pwr_on(); - _delay_ms(1); // Let input pins warm up + _delay_ms(1); - // speed can be 0-15 - // delay = 2hrs + speed * .75h - // range of 1hr to 12hrs25m + // read delay setting, speed can be 0-15 uint8_t speed = get_speed(); - long sleep_max = HOUR + (BLOCK_MINS * 60 * speed); // 45 mins per unit of speed - long to_go = sleep_max - seconds_since_last_spin; + // Calculate how long since the last feeding the next one will be + long feed_internal = 60L * ((long)BLOCK_BASE + ((long)BLOCK_STEP * (long)speed)); + + // This many seconds until the next feeding + long to_go = feed_internal - seconds_since_last_spin; #ifdef __DEBUG__ + dbg_putstring("calculated feed_internal: "); + dbg_putlong(feed_internal); + dbg_putstring("s\r\n"); + dbg_putstring("Mins to sleep: "); - dbg_putint((unsigned int)sleep_max/60); - dbg_putstring("\n"); + dbg_putint((unsigned int)feed_internal/60); + dbg_putstring("\r\n"); dbg_putstring("Mins to go: "); dbg_putint((unsigned int)to_go/60); - dbg_putstring("\n\n"); + dbg_putstring("\r\n\n"); #endif // If it's been long enough, do the thing if(to_go <= 0) { + dbg_putstring("dispensing now\r\n"); dispense(DISPENSE_MS); seconds_since_last_spin = 0; }