ARDUINO Выход Mega 2560 из сна по внешнему прерыванию

X_Event

✩✩✩✩✩✩✩
25 Апр 2023
4
0
Народ, хелп! Уже 3 часа сижу с настройкой сна. Перерыл и интернет и GPT. Использую плату Arduino Mega 2560, внешнее прерывание по кнопке, на порту D2.
Пример кода:

Пример внешнего прерывания:
#include <GyverPower.h>

const byte interruptPin = 2; // номер пина для внешнего прерывания

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP); // настраиваем пин для внешнего прерывания на INPUT_PULLUP
  attachInterrupt(digitalPinToInterrupt(interruptPin), externalInterrupt, FALLING); // подключаем функцию externalInterrupt к внешнему прерыванию
}

void loop() {
  // выполнение операций
  power.sleep(SLEEP_FOREVER); // вход в бесконечный сон
  digitalWrite(13, !digitalRead(13));
  delay(5000);
}

void externalInterrupt() {
  // обработка внешнего прерывания
  Serial.println(1);
  power.wakeUp(); // выход из режима сна
}
Реакции никакой, ни после power.sleep(SLEEP_FOREVER), ни в самой функции прерывания.
Подскажите, как код починить или какую комбинацию порт/индекс прерывателя поставить?...

P.s. Знаю, что wakeUp не нужен, но просто перебирал уже все варианты.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
А почему в коде нет установки режима сна функцией setSleepMode() ? Тут нужен режим POWERDOWN_SLEEP, иначе МК будет просыпаться хрен знает от чего, не успев заснуть.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,966
632
44
Если используете GyverPower, то возьмите пример "Просыпаемся по прерыванию" с сайта: GyverPower – библиотека энергосбережения v1.7 | AlexGyver
Прямо один в один, если заработает, то значит что то не так делаете.
И да, нужно покурить даташит. Наверняка, не со всех пинов может просыпаться.
 

X_Event

✩✩✩✩✩✩✩
25 Апр 2023
4
0
@PiratFox, засыпает, но не просыпается. По даташиту прерывание INT4 находится на порту D2, но при запуске программы с
Отрывок кода с пином D2, прерывателем INT4:
pinMode(2, INPUT_PULLUP);
attachInterrupt(4, externalInterrupt, FALLING);
я вижу сообщение "go to sleep!", а вот дальше ни в какую.
Но вот что я заметил странное: если поставить INT0,и даже не биндить D21,на котором он находится, плата начнёт просыпаться.
И даже без четкого сигнала. (Достаточно просто поднести палец к пину, не касаясь, и появятся сообщения "wake up!" ).
Но проблема то в том, что я использую экран, который сидит на D20 и D21
Даташит:
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
По даташиту прерывание INT4 находится на порту D2
Всё верно, он же РЕ4 на чипе, нога 6. Нужно прозвонить мультиметром или ещё чем, так ли это на самой плате. Может, братья-китайцы начудили чего. Если же всё нормально, то смотреть библиотеку или заюзать другую.

@Старик Похабыч, у Гайвера прерывания по 2560 напутаны, похоже.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,262
1,300
Москва
@PiratFox, Я потом еще на одном сайте нашел аналогичную запись. Первоисточник не искал. Но проверить очень легко,небольшой код на аттач каждое прерывание на изменение , в своем прерывании запоминаем число, и вывод в монитор порта этого числа.
а как только будет понятно что прерывания работают, то уже можно в сон класть.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@Старик Похабыч, можно и так. А можно и прозвонить соответствие ножек МК к выводам платы. При этом распиновку МК брать из даташита Атмел с оф. сайта. В общем, кому как проще.

P.S. Нашёл схему ардуино мега. Совпадает с той, что приводил @X_Event
 

Вложения

Изменено: