POWER_MODE_IDLE пробуждается при любом изменении ввода?

Я хочу иметь возможность переводить Arduino в «спящий режим», но я хочу, чтобы он немедленно возобновлял работу при нажатии любой тактильной кнопки на панели.

Цель состоит в том, чтобы попытаться минимизировать любой цифровой шум в близлежащей аналоговой схеме с высоким коэффициентом усиления.

На данный момент я предполагаю, что я хочу перевести Arduino в режим POWER_MODE_IDLE, но мне менее ясно, как лучше всего проснуться.

Как я могу мгновенно выйти из режима POWER_MODE_ILDE, если какие-либо входные данные изменятся? Я не хочу удерживать кнопку или даже использовать определенный ввод. Существует ли «всеобъемлющее» прерывание, которое будет немедленно реагировать на изменение любого или большого набора входных данных?

, 👍1

Обсуждение

Найдите «прерывания по смене контактов» (PCINT)., @Gerben


2 ответа


0

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


1

Как я упоминал на своей странице о прерываниях, вы можете использовать прерывания по изменению состояния выводов на 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-чипа, регулятора напряжения или светодиодов питания).

Другие режимы сна могут потреблять больше энергии, но при этом быстрее пробуждаться.

,