initial push
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
BIN
pic/P_20230122_221503.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
pic/P_20230122_221510.jpg
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
BIN
pic/P_20230123_131124.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
pic/P_20230123_131450.jpg
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
pic/P_20230123_131501.jpg
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
pic/P_20230123_131505.jpg
Normal file
|
After Width: | Height: | Size: 2.5 MiB |
BIN
pic/P_20230123_145724.jpg
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
pic/P_20230123_145813.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
737
src/avrsleep.h
Normal file
@@ -0,0 +1,737 @@
|
||||
/* Copyright (c) 2002, 2004 Theodore A. Roth
|
||||
Copyright (c) 2004, 2007, 2008 Eric B. Weddington
|
||||
Copyright (c) 2005, 2006, 2007 Joerg Wunsch
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef _AVR_SLEEP_H_
|
||||
#define _AVR_SLEEP_H_ 1
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
/** \file */
|
||||
|
||||
/** \defgroup avr_sleep <avr/sleep.h>: Power Management and Sleep Modes
|
||||
\code #include <avr/sleep.h>\endcode
|
||||
Use of the \c SLEEP instruction can allow an application to reduce its
|
||||
power comsumption considerably. AVR devices can be put into different
|
||||
sleep modes. Refer to the datasheet for the details relating to the device
|
||||
you are using.
|
||||
There are several macros provided in this header file to actually
|
||||
put the device into sleep mode. The simplest way is to optionally
|
||||
set the desired sleep mode using \c set_sleep_mode() (it usually
|
||||
defaults to idle mode where the CPU is put on sleep but all
|
||||
peripheral clocks are still running), and then call
|
||||
\c sleep_mode(). This macro automatically sets the sleep enable bit, goes
|
||||
to sleep, and clears the sleep enable bit.
|
||||
|
||||
Example:
|
||||
\code
|
||||
#include <avr/sleep.h>
|
||||
...
|
||||
set_sleep_mode(<mode>);
|
||||
sleep_mode();
|
||||
\endcode
|
||||
|
||||
Note that unless your purpose is to completely lock the CPU (until a
|
||||
hardware reset), interrupts need to be enabled before going to sleep.
|
||||
As the \c sleep_mode() macro might cause race conditions in some
|
||||
situations, the individual steps of manipulating the sleep enable
|
||||
(SE) bit, and actually issuing the \c SLEEP instruction, are provided
|
||||
in the macros \c sleep_enable(), \c sleep_disable(), and
|
||||
\c sleep_cpu(). This also allows for test-and-sleep scenarios that
|
||||
take care of not missing the interrupt that will awake the device
|
||||
from sleep.
|
||||
Example:
|
||||
\code
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/sleep.h>
|
||||
...
|
||||
set_sleep_mode(<mode>);
|
||||
cli();
|
||||
if (some_condition)
|
||||
{
|
||||
sleep_enable();
|
||||
sei();
|
||||
sleep_cpu();
|
||||
sleep_disable();
|
||||
}
|
||||
sei();
|
||||
\endcode
|
||||
This sequence ensures an atomic test of \c some_condition with
|
||||
interrupts being disabled. If the condition is met, sleep mode
|
||||
will be prepared, and the \c SLEEP instruction will be scheduled
|
||||
immediately after an \c SEI instruction. As the intruction right
|
||||
after the \c SEI is guaranteed to be executed before an interrupt
|
||||
could trigger, it is sure the device will really be put to sleep.
|
||||
Some devices have the ability to disable the Brown Out Detector (BOD) before
|
||||
going to sleep. This will also reduce power while sleeping. If the
|
||||
specific AVR device has this ability then an additional macro is defined:
|
||||
\c sleep_bod_disable(). This macro generates inlined assembly code
|
||||
that will correctly implement the timed sequence for disabling the BOD
|
||||
before sleeping. However, there is a limited number of cycles after the
|
||||
BOD has been disabled that the device can be put into sleep mode, otherwise
|
||||
the BOD will not truly be disabled. Recommended practice is to disable
|
||||
the BOD (\c sleep_bod_disable()), set the interrupts (\c sei()), and then
|
||||
put the device to sleep (\c sleep_cpu()), like so:
|
||||
\code
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/sleep.h>
|
||||
...
|
||||
set_sleep_mode(<mode>);
|
||||
cli();
|
||||
if (some_condition)
|
||||
{
|
||||
sleep_enable();
|
||||
sleep_bod_disable();
|
||||
sei();
|
||||
sleep_cpu();
|
||||
sleep_disable();
|
||||
}
|
||||
sei();
|
||||
\endcode
|
||||
*/
|
||||
|
||||
|
||||
/* Define an internal sleep control register and an internal sleep enable bit mask. */
|
||||
#if defined(SLEEP_CTRL)
|
||||
|
||||
/* XMEGA devices */
|
||||
#define _SLEEP_CONTROL_REG SLEEP_CTRL
|
||||
#define _SLEEP_ENABLE_MASK SLEEP_SEN_bm
|
||||
|
||||
#elif defined(SMCR)
|
||||
|
||||
#define _SLEEP_CONTROL_REG SMCR
|
||||
#define _SLEEP_ENABLE_MASK _BV(SE)
|
||||
|
||||
#elif defined(__AVR_AT94K__)
|
||||
|
||||
#define _SLEEP_CONTROL_REG MCUR
|
||||
#define _SLEEP_ENABLE_MASK _BV(SE)
|
||||
|
||||
#else
|
||||
|
||||
#define _SLEEP_CONTROL_REG MCUCR
|
||||
#define _SLEEP_ENABLE_MASK _BV(SE)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Define set_sleep_mode() and sleep mode values per device. */
|
||||
#if defined(__AVR_ATmega161__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_PWR_DOWN 1
|
||||
#define SLEEP_MODE_PWR_SAVE 2
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_PWR_DOWN || (mode) == SLEEP_MODE_PWR_SAVE ? _BV(SM1) : 0)); \
|
||||
EMCUCR = ((EMCUCR & ~_BV(SM0)) | ((mode) == SLEEP_MODE_PWR_SAVE ? _BV(SM0) : 0)); \
|
||||
} while(0)
|
||||
|
||||
|
||||
#elif defined(__AVR_ATmega162__) \
|
||||
|| defined(__AVR_ATmega8515__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_PWR_DOWN 1
|
||||
#define SLEEP_MODE_PWR_SAVE 2
|
||||
#define SLEEP_MODE_ADC 3
|
||||
#define SLEEP_MODE_STANDBY 4
|
||||
#define SLEEP_MODE_EXT_STANDBY 5
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_IDLE ? 0 : _BV(SM1))); \
|
||||
MCUCSR = ((MCUCSR & ~_BV(SM2)) | ((mode) == SLEEP_MODE_STANDBY || (mode) == SLEEP_MODE_EXT_STANDBY ? _BV(SM2) : 0)); \
|
||||
EMCUCR = ((EMCUCR & ~_BV(SM0)) | ((mode) == SLEEP_MODE_PWR_SAVE || (mode) == SLEEP_MODE_EXT_STANDBY ? _BV(SM0) : 0)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT90S2313__) \
|
||||
|| defined(__AVR_AT90S2323__) \
|
||||
|| defined(__AVR_AT90S2333__) \
|
||||
|| defined(__AVR_AT90S2343__) \
|
||||
|| defined(__AVR_AT43USB320__) \
|
||||
|| defined(__AVR_AT43USB355__) \
|
||||
|| defined(__AVR_AT90S4414__) \
|
||||
|| defined(__AVR_AT90S4433__) \
|
||||
|| defined(__AVR_AT90S8515__) \
|
||||
|| defined(__AVR_ATtiny22__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~_BV(SM)) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATA6616C__) \
|
||||
|| defined(__AVR_ATA6617C__) \
|
||||
|| defined(__AVR_ATA664251__) \
|
||||
|| defined(__AVR_ATtiny167__) \
|
||||
|| defined(__AVR_ATtiny87__) \
|
||||
|| defined(__AVR_ATtiny441__) \
|
||||
|| defined(__AVR_ATtiny828__) \
|
||||
|| defined(__AVR_ATtiny841__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT90S4434__) \
|
||||
|| defined(__AVR_ATA5505__) \
|
||||
|| defined(__AVR_ATA5272__) \
|
||||
|| defined(__AVR_AT76C711__) \
|
||||
|| defined(__AVR_AT90S8535__) \
|
||||
|| defined(__AVR_ATmega103__) \
|
||||
|| defined(__AVR_ATmega161__) \
|
||||
|| defined(__AVR_ATmega163__) \
|
||||
|| defined(__AVR_ATmega16HVB__) \
|
||||
|| defined(__AVR_ATmega16HVBREVB__) \
|
||||
|| defined(__AVR_ATmega32HVB__) \
|
||||
|| defined(__AVR_ATmega32HVBREVB__) \
|
||||
|| defined(__AVR_ATtiny13__) \
|
||||
|| defined(__AVR_ATtiny13A__) \
|
||||
|| defined(__AVR_ATtiny15__) \
|
||||
|| defined(__AVR_ATtiny24__) \
|
||||
|| defined(__AVR_ATtiny24A__) \
|
||||
|| defined(__AVR_ATtiny44__) \
|
||||
|| defined(__AVR_ATtiny44A__) \
|
||||
|| defined(__AVR_ATtiny84__) \
|
||||
|| defined(__AVR_ATtiny84A__) \
|
||||
|| defined(__AVR_ATtiny25__) \
|
||||
|| defined(__AVR_ATtiny45__) \
|
||||
|| defined(__AVR_ATtiny48__) \
|
||||
|| defined(__AVR_ATtiny85__) \
|
||||
|| defined(__AVR_ATtiny88__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATmega16HVA__) \
|
||||
|| defined(__AVR_ATmega8HVA__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_PWR_OFF _BV(SM2)
|
||||
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATmega406__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_PWR_OFF _BV(SM2)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATtiny2313__) \
|
||||
|| defined(__AVR_ATtiny2313A__) \
|
||||
|| defined(__AVR_ATtiny4313__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_PWR_DOWN (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_STANDBY _BV(SM1)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT94K__) \
|
||||
|| defined(__AVR_ATmega64HVE__) \
|
||||
|| defined(__AVR_ATmega64HVE2__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATtiny26__) \
|
||||
|| defined(__AVR_ATtiny261__) \
|
||||
|| defined(__AVR_ATtiny261A__) \
|
||||
|| defined(__AVR_ATtiny461__) \
|
||||
|| defined(__AVR_ATtiny461A__) \
|
||||
|| defined(__AVR_ATtiny861__) \
|
||||
|| defined(__AVR_ATtiny861A__) \
|
||||
|| defined(__AVR_ATtiny43U__) \
|
||||
|| defined(__AVR_ATtiny1634__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_STANDBY (_BV(SM0) | _BV(SM1))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT90PWM216__) \
|
||||
|| defined(__AVR_AT90PWM316__) \
|
||||
|| defined(__AVR_AT90PWM161__) \
|
||||
|| defined(__AVR_AT90PWM81__) \
|
||||
|| defined(__AVR_AT90PWM1__) \
|
||||
|| defined(__AVR_AT90PWM2__) \
|
||||
|| defined(__AVR_AT90PWM2B__) \
|
||||
|| defined(__AVR_AT90PWM3__) \
|
||||
|| defined(__AVR_AT90PWM3B__) \
|
||||
|| defined(__AVR_ATmega32M1__) \
|
||||
|| defined(__AVR_ATmega16M1__) \
|
||||
|| defined(__AVR_ATmega64M1__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT90USB1286__) \
|
||||
|| defined(__AVR_AT90USB1287__) \
|
||||
|| defined(__AVR_AT90USB646__) \
|
||||
|| defined(__AVR_AT90USB647__) \
|
||||
|| defined(__AVR_ATA6614Q__) \
|
||||
|| defined(__AVR_ATmega128__) \
|
||||
|| defined(__AVR_ATmega128A__) \
|
||||
|| defined(__AVR_ATmega1280__) \
|
||||
|| defined(__AVR_ATmega1281__) \
|
||||
|| defined(__AVR_ATmega1284__) \
|
||||
|| defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega128RFA1__) \
|
||||
|| defined(__AVR_ATmega128RFR2__) \
|
||||
|| defined(__AVR_ATmega1284RFR2__) \
|
||||
|| defined(__AVR_ATmega16__) \
|
||||
|| defined(__AVR_ATmega16A__) \
|
||||
|| defined(__AVR_ATmega162__) \
|
||||
|| defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__) \
|
||||
|| defined(__AVR_ATmega164PA__) \
|
||||
|| defined(__AVR_ATmega168A__) \
|
||||
|| defined(__AVR_ATmega168P__) \
|
||||
|| defined(__AVR_ATmega168PA__) \
|
||||
|| defined(__AVR_ATmega168PB__) \
|
||||
|| defined(__AVR_ATmega16HVA2__) \
|
||||
|| defined(__AVR_ATmega16U4__) \
|
||||
|| defined(__AVR_ATmega2560__) \
|
||||
|| defined(__AVR_ATmega2561__) \
|
||||
|| defined(__AVR_ATmega256RFR2__) \
|
||||
|| defined(__AVR_ATmega2564RFR2__) \
|
||||
|| defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega32A__) \
|
||||
|| defined(__AVR_ATmega323__) \
|
||||
|| defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324P__) \
|
||||
|| defined(__AVR_ATmega324PA__) \
|
||||
|| defined(__AVR_ATmega328__) \
|
||||
|| defined(__AVR_ATmega328P__) \
|
||||
|| defined(__AVR_ATmega32C1__) \
|
||||
|| defined(__AVR_ATmega32U4__) \
|
||||
|| defined(__AVR_ATmega32U6__) \
|
||||
|| defined(__AVR_ATmega48A__) \
|
||||
|| defined(__AVR_ATmega48PA__) \
|
||||
|| defined(__AVR_ATmega48PB__) \
|
||||
|| defined(__AVR_ATmega48P__) \
|
||||
|| defined(__AVR_ATmega64__) \
|
||||
|| defined(__AVR_ATmega64A__) \
|
||||
|| defined(__AVR_ATmega640__) \
|
||||
|| defined(__AVR_ATmega644__) \
|
||||
|| defined(__AVR_ATmega644A__) \
|
||||
|| defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega644PA__) \
|
||||
|| defined(__AVR_ATmega64C1__) \
|
||||
|| defined(__AVR_ATmega64RFR2__) \
|
||||
|| defined(__AVR_ATmega644RFR2__) \
|
||||
|| defined(__AVR_ATmega8515__) \
|
||||
|| defined(__AVR_ATmega8535__) \
|
||||
|| defined(__AVR_ATmega88A__) \
|
||||
|| defined(__AVR_ATmega88P__) \
|
||||
|| defined(__AVR_ATmega88PA__) \
|
||||
|| defined(__AVR_ATmega88PB__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2))
|
||||
#define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2))
|
||||
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATmega8A__) \
|
||||
|| defined(__AVR_ATmega8__) \
|
||||
|| defined(__AVR_ATmega6450A__) \
|
||||
|| defined(__AVR_ATmega6450P__) \
|
||||
|| defined(__AVR_ATmega645A__) \
|
||||
|| defined(__AVR_ATmega645P__) \
|
||||
|| defined(__AVR_ATmega3250A__) \
|
||||
|| defined(__AVR_ATmega3250PA__) \
|
||||
|| defined(__AVR_ATmega325A__) \
|
||||
|| defined(__AVR_ATmega325PA__) \
|
||||
|| defined(__AVR_ATmega165A__) \
|
||||
|| defined(__AVR_ATmega165P__) \
|
||||
|| defined(__AVR_ATmega165PA__) \
|
||||
|| defined(__AVR_ATmega169A__) \
|
||||
|| defined(__AVR_ATmega169P__) \
|
||||
|| defined(__AVR_ATmega169PA__) \
|
||||
|| defined(__AVR_ATmega329A__) \
|
||||
|| defined(__AVR_ATmega329PA__) \
|
||||
|| defined(__AVR_ATmega3290A__) \
|
||||
|| defined(__AVR_ATmega3290PA__) \
|
||||
|| defined(__AVR_ATmega649A__) \
|
||||
|| defined(__AVR_ATmega649P__) \
|
||||
|| defined(__AVR_ATmega6490A__) \
|
||||
|| defined(__AVR_ATmega6490P__) \
|
||||
|| defined(__AVR_ATmega165__) \
|
||||
|| defined(__AVR_ATmega169__) \
|
||||
|| defined(__AVR_ATmega48__) \
|
||||
|| defined(__AVR_ATmega88__) \
|
||||
|| defined(__AVR_ATmega168__) \
|
||||
|| defined(__AVR_ATmega325P__) \
|
||||
|| defined(__AVR_ATmega3250P__) \
|
||||
|| defined(__AVR_ATmega325__) \
|
||||
|| defined(__AVR_ATmega3250__) \
|
||||
|| defined(__AVR_ATmega645__) \
|
||||
|| defined(__AVR_ATmega6450__) \
|
||||
|| defined(__AVR_ATmega329__) \
|
||||
|| defined(__AVR_ATmega329P__) \
|
||||
|| defined(__AVR_ATmega3290__) \
|
||||
|| defined(__AVR_ATmega3290P__) \
|
||||
|| defined(__AVR_ATmega649__) \
|
||||
|| defined(__AVR_ATmega6490__) \
|
||||
|| defined(__AVR_AT90CAN128__) \
|
||||
|| defined(__AVR_AT90CAN32__) \
|
||||
|| defined(__AVR_AT90CAN64__) \
|
||||
|| defined(__AVR_ATA6612C__) \
|
||||
|| defined(__AVR_ATA6613C__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2))
|
||||
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATxmega16A4__) \
|
||||
|| defined(__AVR_ATxmega16A4U__) \
|
||||
|| defined(__AVR_ATxmega16C4__) \
|
||||
|| defined(__AVR_ATxmega16D4__) \
|
||||
|| defined(__AVR_ATxmega32A4__) \
|
||||
|| defined(__AVR_ATxmega32A4U__) \
|
||||
|| defined(__AVR_ATxmega32C3__) \
|
||||
|| defined(__AVR_ATxmega32C4__) \
|
||||
|| defined(__AVR_ATxmega32D3__) \
|
||||
|| defined(__AVR_ATxmega32D4__) \
|
||||
|| defined(__AVR_ATxmega8E5__) \
|
||||
|| defined(__AVR_ATxmega16E5__) \
|
||||
|| defined(__AVR_ATxmega32E5__) \
|
||||
|| defined(__AVR_ATxmega64A1__) \
|
||||
|| defined(__AVR_ATxmega64A1U__) \
|
||||
|| defined(__AVR_ATxmega64A3__) \
|
||||
|| defined(__AVR_ATxmega64A3U__) \
|
||||
|| defined(__AVR_ATxmega64A4U__) \
|
||||
|| defined(__AVR_ATxmega64B1__) \
|
||||
|| defined(__AVR_ATxmega64B3__) \
|
||||
|| defined(__AVR_ATxmega64C3__) \
|
||||
|| defined(__AVR_ATxmega64D3__) \
|
||||
|| defined(__AVR_ATxmega64D4__) \
|
||||
|| defined(__AVR_ATxmega128A1__) \
|
||||
|| defined(__AVR_ATxmega128A1U__) \
|
||||
|| defined(__AVR_ATxmega128A3__) \
|
||||
|| defined(__AVR_ATxmega128A3U__) \
|
||||
|| defined(__AVR_ATxmega128A4U__) \
|
||||
|| defined(__AVR_ATxmega128B1__) \
|
||||
|| defined(__AVR_ATxmega128B3__) \
|
||||
|| defined(__AVR_ATxmega128C3__) \
|
||||
|| defined(__AVR_ATxmega128D3__) \
|
||||
|| defined(__AVR_ATxmega128D4__) \
|
||||
|| defined(__AVR_ATxmega192A3__) \
|
||||
|| defined(__AVR_ATxmega192A3U__) \
|
||||
|| defined(__AVR_ATxmega192C3__) \
|
||||
|| defined(__AVR_ATxmega192D3__) \
|
||||
|| defined(__AVR_ATxmega256A3__) \
|
||||
|| defined(__AVR_ATxmega256A3U__) \
|
||||
|| defined(__AVR_ATxmega256C3__) \
|
||||
|| defined(__AVR_ATxmega256D3__) \
|
||||
|| defined(__AVR_ATxmega256A3B__) \
|
||||
|| defined(__AVR_ATxmega256A3BU__) \
|
||||
|| defined(__AVR_ATxmega384C3__) \
|
||||
|| defined(__AVR_ATxmega384D3__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_PWR_DOWN (SLEEP_SMODE1_bm)
|
||||
#define SLEEP_MODE_PWR_SAVE (SLEEP_SMODE1_bm | SLEEP_SMODE0_bm)
|
||||
#define SLEEP_MODE_STANDBY (SLEEP_SMODE2_bm | SLEEP_SMODE1_bm)
|
||||
#define SLEEP_MODE_EXT_STANDBY (SLEEP_SMODE2_bm | SLEEP_SMODE1_bm | SLEEP_SMODE0_bm)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(SLEEP_SMODE2_bm | SLEEP_SMODE1_bm | SLEEP_SMODE0_bm)) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_AT90SCR100__) \
|
||||
|| defined(__AVR_ATmega8U2__) \
|
||||
|| defined(__AVR_ATmega16U2__) \
|
||||
|| defined(__AVR_ATmega32U2__) \
|
||||
|| defined(__AVR_AT90USB162__) \
|
||||
|| defined(__AVR_AT90USB82__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))
|
||||
#define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2))
|
||||
#define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATA6285__) \
|
||||
|| defined(__AVR_ATA6286__) \
|
||||
|| defined(__AVR_ATA6289__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_SENSOR_NOISE_REDUCTION (_BV(SM0))
|
||||
#define SLEEP_MODE_PWR_DOWN (_BV(SM1))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined (__AVR_ATA5790__) \
|
||||
|| defined (__AVR_ATA5790N__) \
|
||||
|| defined (__AVR_ATA5795__) \
|
||||
|| defined (__AVR_ATA5782__) \
|
||||
|| defined (__AVR_ATA5831__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_EXT_PWR_SAVE (_BV(SM0))
|
||||
#define SLEEP_MODE_PWR_DOWN (_BV(SM1))
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM1) | _BV(SM0))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined (__AVR_ATA5702M322__)
|
||||
|
||||
#define SLEEP_MODE_IDLE (0)
|
||||
#define SLEEP_MODE_EXT_PWR_SAVE (_BV(SM0))
|
||||
#define SLEEP_MODE_PWR_DOWN (_BV(SM1))
|
||||
#define SLEEP_MODE_PWR_SAVE (_BV(SM1) | _BV(SM0))
|
||||
#define SLEEP_MODE_EXT_PWR_DOWN (_BV(SM2))
|
||||
#define SLEEP_MODE_PWR_OFF (_BV(SM2) | _BV(SM0))
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#elif defined(__AVR_ATtiny4__) \
|
||||
|| defined(__AVR_ATtiny5__) \
|
||||
|| defined(__AVR_ATtiny9__) \
|
||||
|| defined(__AVR_ATtiny10__) \
|
||||
|| defined(__AVR_ATtiny20__) \
|
||||
|| defined(__AVR_ATtiny40__)
|
||||
|
||||
#define SLEEP_MODE_IDLE 0
|
||||
#define SLEEP_MODE_ADC _BV(SM0)
|
||||
#define SLEEP_MODE_PWR_DOWN _BV(SM1)
|
||||
#define SLEEP_MODE_STANDBY _BV(SM2)
|
||||
|
||||
#define set_sleep_mode(mode) \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \
|
||||
} while(0)
|
||||
|
||||
#else
|
||||
|
||||
#error "No SLEEP mode defined for this device."
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/** \ingroup avr_sleep
|
||||
Put the device in sleep mode. How the device is brought out of sleep mode
|
||||
depends on the specific mode selected with the set_sleep_mode() function.
|
||||
See the data sheet for your device for more details. */
|
||||
|
||||
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
/** \ingroup avr_sleep
|
||||
Set the SE (sleep enable) bit.
|
||||
*/
|
||||
extern void sleep_enable (void);
|
||||
|
||||
#else
|
||||
|
||||
#define sleep_enable() \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG |= (uint8_t)_SLEEP_ENABLE_MASK; \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
/** \ingroup avr_sleep
|
||||
Clear the SE (sleep enable) bit.
|
||||
*/
|
||||
extern void sleep_disable (void);
|
||||
|
||||
#else
|
||||
|
||||
#define sleep_disable() \
|
||||
do { \
|
||||
_SLEEP_CONTROL_REG &= (uint8_t)(~_SLEEP_ENABLE_MASK); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/** \ingroup avr_sleep
|
||||
Put the device into sleep mode. The SE bit must be set
|
||||
beforehand, and it is recommended to clear it afterwards.
|
||||
*/
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
extern void sleep_cpu (void);
|
||||
|
||||
#else
|
||||
|
||||
#define sleep_cpu() \
|
||||
do { \
|
||||
__asm__ __volatile__ ( "sleep" "\n\t" :: ); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
extern void sleep_mode (void);
|
||||
|
||||
#else
|
||||
|
||||
#define sleep_mode() \
|
||||
do { \
|
||||
sleep_enable(); \
|
||||
sleep_cpu(); \
|
||||
sleep_disable(); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(__DOXYGEN__)
|
||||
|
||||
extern void sleep_bod_disable (void);
|
||||
|
||||
#else
|
||||
|
||||
#if defined(BODS) && defined(BODSE)
|
||||
|
||||
#ifdef BODCR
|
||||
|
||||
#define BOD_CONTROL_REG BODCR
|
||||
|
||||
#else
|
||||
|
||||
#define BOD_CONTROL_REG MCUCR
|
||||
|
||||
#endif
|
||||
|
||||
#define sleep_bod_disable() \
|
||||
do { \
|
||||
uint8_t tempreg; \
|
||||
__asm__ __volatile__("in %[tempreg], %[mcucr]" "\n\t" \
|
||||
"ori %[tempreg], %[bods_bodse]" "\n\t" \
|
||||
"out %[mcucr], %[tempreg]" "\n\t" \
|
||||
"andi %[tempreg], %[not_bodse]" "\n\t" \
|
||||
"out %[mcucr], %[tempreg]" \
|
||||
: [tempreg] "=&d" (tempreg) \
|
||||
: [mcucr] "I" _SFR_IO_ADDR(BOD_CONTROL_REG), \
|
||||
[bods_bodse] "i" (_BV(BODS) | _BV(BODSE)), \
|
||||
[not_bodse] "i" (~_BV(BODSE))); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
#endif /* _AVR_SLEEP_H_ */
|
||||
BIN
src/data/encoder-master.zip
Normal file
229
src/microonde.ino
Normal file
@@ -0,0 +1,229 @@
|
||||
#include <avr/sleep.h>
|
||||
|
||||
#include <TM1637Display.h>
|
||||
#include <ClickEncoder.h>
|
||||
#include <TimerOne.h>
|
||||
|
||||
#define SLEEP_INTERRUPT_1 2
|
||||
#define SLEEP_INTERRUPT_2 3
|
||||
#define SPEAKER 5
|
||||
#define LIGHT 6
|
||||
#define ENCODER_BUTTON 2
|
||||
#define ENCODER_A 3
|
||||
#define ENCODER_B 4
|
||||
|
||||
#define MAX_SECONDS 10 * 60
|
||||
#define SLEEP_TIMEOUT 60 * 1000;
|
||||
|
||||
#define CLK 12
|
||||
#define DIO 11
|
||||
|
||||
|
||||
|
||||
ClickEncoder *encoder;
|
||||
TM1637Display display(CLK, DIO);
|
||||
|
||||
uint8_t data[] = {0, 0, 0, 0};
|
||||
int16_t last, left, milli, sleepTimer;
|
||||
bool running, showEnd, lightOn;
|
||||
|
||||
void timerIsr() {
|
||||
encoder->service();
|
||||
if(running) {
|
||||
milli -= 1;
|
||||
}
|
||||
sleepTimer -= 1;
|
||||
}
|
||||
|
||||
void feedSleepTimer() {
|
||||
sleepTimer = SLEEP_TIMEOUT;
|
||||
}
|
||||
|
||||
void goToSleep() {
|
||||
displayOff();
|
||||
|
||||
Timer1.detachInterrupt();
|
||||
|
||||
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
||||
sleep_enable();
|
||||
attachInterrupt(digitalPinToInterrupt(SLEEP_INTERRUPT_1), wakeUp, CHANGE);
|
||||
attachInterrupt(digitalPinToInterrupt(SLEEP_INTERRUPT_2), wakeUp, CHANGE);
|
||||
sleep_mode();
|
||||
// Zzzzz. When we wake, we resume here...
|
||||
sleep_disable();
|
||||
detachInterrupt(digitalPinToInterrupt(SLEEP_INTERRUPT_2));
|
||||
detachInterrupt(digitalPinToInterrupt(SLEEP_INTERRUPT_1));
|
||||
|
||||
// Run setup again, so everything is back to the initial state
|
||||
setup();
|
||||
}
|
||||
|
||||
void wakeUp() {
|
||||
// This happens after we wake up.
|
||||
feedSleepTimer();
|
||||
}
|
||||
|
||||
void displayOff() {
|
||||
// We may need to turn off the display using hardware...
|
||||
display.setBrightness(0, false);
|
||||
display.setSegments(data);
|
||||
}
|
||||
|
||||
void displayOn() {
|
||||
display.setBrightness(7, true);
|
||||
display.setSegments(data);
|
||||
}
|
||||
|
||||
void displayEnd() {
|
||||
//
|
||||
// A
|
||||
// ---
|
||||
// F | | B
|
||||
// -G-
|
||||
// E | | C
|
||||
// ---
|
||||
// D
|
||||
// XGFEDCBA
|
||||
data[0] = 0;
|
||||
data[1] = 0b01111001;
|
||||
data[2] = 0b01010100;
|
||||
data[3] = 0b01011110;
|
||||
}
|
||||
|
||||
void displayTime(void) {
|
||||
int8_t minutes = left / 60;
|
||||
int8_t seconds = left % 60;
|
||||
|
||||
uint8_t dot = (!running || milli < 500) ? 0x80 : 0x0;
|
||||
|
||||
data[0] = display.encodeDigit(minutes / 10);
|
||||
data[1] = display.encodeDigit(minutes % 10) | dot;
|
||||
data[2] = display.encodeDigit(seconds / 10);
|
||||
data[3] = display.encodeDigit(seconds % 10);
|
||||
}
|
||||
|
||||
void updateTime(void) {
|
||||
if(showEnd) {
|
||||
displayEnd();
|
||||
} else {
|
||||
displayTime();
|
||||
}
|
||||
|
||||
display.setSegments(data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
char BOUTON_WAVE = 999;
|
||||
char BOUTON_RESISTANCE = 999;
|
||||
|
||||
|
||||
char RELAY_WAVE = 999;
|
||||
char RELAY_RESISTANCE = 999;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
pinMode(BOUTON_WAVE,INPUT);
|
||||
pinMode(BOUTON_RESISTANCE,INPUT);
|
||||
|
||||
|
||||
pinMode(RELAY_WAVE,OUTPUT);
|
||||
pinMode(RELAY_RESISTANCE,OUTPUT);
|
||||
|
||||
encoder = new ClickEncoder(ENCODER_A, ENCODER_B, ENCODER_BUTTON, 4, HIGH);
|
||||
encoder->setAccelerationEnabled(true);
|
||||
|
||||
Timer1.initialize(1000);
|
||||
Timer1.attachInterrupt(timerIsr);
|
||||
|
||||
pinMode(LIGHT, OUTPUT);
|
||||
|
||||
running = false;
|
||||
showEnd = false;
|
||||
lightOn = false;
|
||||
|
||||
left = 0;
|
||||
last = 0;
|
||||
milli = 1000;
|
||||
|
||||
feedSleepTimer();
|
||||
displayOn();
|
||||
updateTime();
|
||||
|
||||
}
|
||||
|
||||
void checkButton() {
|
||||
ClickEncoder::Button b = encoder->getButton();
|
||||
if(b == ClickEncoder::Released) {
|
||||
running = !running;
|
||||
}
|
||||
}
|
||||
|
||||
void checkLight() {
|
||||
if(running && !lightOn) {
|
||||
digitalWrite(LIGHT, HIGH);
|
||||
lightOn = true;
|
||||
} else if(!running && lightOn) {
|
||||
digitalWrite(LIGHT, LOW);
|
||||
lightOn = false;
|
||||
}
|
||||
}
|
||||
|
||||
void done() {
|
||||
showEnd = true;
|
||||
tone(SPEAKER, 1500, 2000);
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
// put your main code here, to run repeatedly:
|
||||
|
||||
|
||||
|
||||
checkButton();
|
||||
|
||||
left += encoder->getValue();
|
||||
|
||||
if(left > MAX_SECONDS) {
|
||||
left = MAX_SECONDS;
|
||||
}
|
||||
|
||||
if(milli <= 0) {
|
||||
left--;
|
||||
milli = 1000;
|
||||
}
|
||||
|
||||
if(left < 0) {
|
||||
left = 0;
|
||||
}
|
||||
|
||||
// If the timer is running, the display needs to be updated every 500ms, otherwise it only needs updating if the encode value changes.
|
||||
if ((running && milli / 500 % 2 == 0) || left != last) {
|
||||
if(left != last) {
|
||||
last = left;
|
||||
}
|
||||
|
||||
if(running && left == 0) {
|
||||
running = false;
|
||||
done();
|
||||
} else {
|
||||
showEnd = false;
|
||||
}
|
||||
|
||||
updateTime();
|
||||
feedSleepTimer();
|
||||
}
|
||||
|
||||
checkLight();
|
||||
|
||||
if(sleepTimer == 0) {
|
||||
goToSleep();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||