POWER_MODE_IDLE пробуждается при любом изменении ввода?
Я хочу иметь возможность переводить Arduino в «спящий режим», но я хочу, чтобы он немедленно возобновлял работу при нажатии любой тактильной кнопки на панели.
Цель состоит в том, чтобы попытаться минимизировать любой цифровой шум в близлежащей аналоговой схеме с высоким коэффициентом усиления.
На данный момент я предполагаю, что я хочу перевести Arduino в режим POWER_MODE_IDLE, но мне менее ясно, как лучше всего проснуться.
Как я могу мгновенно выйти из режима POWER_MODE_ILDE, если какие-либо входные данные изменятся? Я не хочу удерживать кнопку или даже использовать определенный ввод. Существует ли «всеобъемлющее» прерывание, которое будет немедленно реагировать на изменение любого или большого набора входных данных?
@squarewav, 👍1
Обсуждение2 ответа
Arduino можно вывести из спящего режима только путем изменения состояния контактов 2 и/или 3.
Что касается аппаратного обеспечения, Arduino оснащен двумя прерываниями порты: цифровые контакты 2 и 3. Таким образом, Arduino может распознавать эти контакты для событие для пробуждения и возобновления выполнения кода.
http://playground.arduino.cc/Learning/ArduinoSleepCode
Однако в техническом описании указано, что можно использовать любой вывод:
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf Раздел 17. EXINT — Внешние прерывания
Внешние прерывания запускаются контактами INT или любым из контактов PCINT. [...] Запрос прерывания изменения контакта 2 (PCI2) сработает, если какой-либо из них включен PCINT[23:16] контакт переключается. Запрос прерывания изменения контакта 1 (PCI1) сработает, если любой включенный вывод PCINT[14:8] переключится. Изменение вывода Запрос прерывания 0 (PCI0) сработает, если любой включенный вывод PCINT[7:0] переключает. PCMSK2, PCMSK1 и Регистры PCMSK0 управляют тем, какие выводы участвуют в изменении выводов. прерывания.
Также можно использовать прерывания по изменению пина. Даже для более глубоких спящих режимов с отключенными часами ввода-вывода или с остановленным генератором., @KIIV
Как я упоминал на своей странице о прерываниях, вы можете использовать прерывания по изменению состояния выводов на Atmega328P для пробуждения из самого глубокого режима сна (SLEEP_MODE_PWR_DOWN).
Пример кода:
#include <avr/sleep.h>
const byte LEDLOOP = 8;
const byte LEDWAKE = 9;
ISR (PCINT1_vect)
{
// здесь обрабатывается прерывание смены пина для A0-A5
// переключить светодиод
digitalWrite (LEDWAKE, !digitalRead (LEDWAKE));
} // конец PCINT1_vect
void setup ()
{
pinMode (LEDWAKE, OUTPUT);
pinMode (LEDLOOP, OUTPUT);
digitalWrite (A0, HIGH); // включить подтягивание
// прерывание смены пина
PCMSK1 |= bit (PCINT8); // нужен пин A0
PCIFR |= bit (PCIF1); // очистить все невыполненные прерывания
PCICR |= bit (PCIE1); // включить прерывания по смене выводов для A0-A5
} // конец настройки
void loop ()
{
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_mode ();
// мигает, чтобы показать, что мы вышли из сна
digitalWrite (LEDLOOP, HIGH);
delay (100);
digitalWrite (LEDLOOP, LOW);
delay (100);
} // конец цикла
Преимущество этого метода заключается в том, что он потребляет очень мало энергии в спящем режиме, а также может выходить из спящего режима при подаче питания на любой вывод (Atmega328P).
Работая от 5 В при 25 °C, вы должны потреблять только около 150 нА тока во время сна (на «голой» плате без USB-чипа, регулятора напряжения или светодиодов питания).
Другие режимы сна могут потреблять больше энергии, но при этом быстрее пробуждаться.
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Датчик PIR и сон (прерывание) на Mega2560
- Как разбудить Arduino с помощью rtc?
- attiny85 сбрасывает себя вместо процедуры пробуждения
- Как одной кнопкой с прерыванием включать и отключать спящий режим?
- Порог сигнала пробуждения
- ATtiny85 со сном и последовательным портом
- Внешнее прерывание не работает на 3,3 В atmega168
Найдите «прерывания по смене контактов» (PCINT)., @Gerben