Вывод Adafruit Feather 32u4 из спящего режима с помощью внешнего прерывания

#c #arduino #sleep #interrupt #adafruit

#c #arduino #сон #прерывание #adafruit

Вопрос:

У меня есть Adafruit Feather ATmega 32u4. Я хочу перевести его в спящий режим и разбудить его нажатием переключателя в качестве внешнего прерывания. Это то, что я пробовал до сих пор и что сработало:

  • включение и выключение светодиода с помощью переключателя
  • перевод Adafruit в спящий режим и пробуждение с помощью сторожевого таймера.

Я попытался объединить примеры кода, которые я нашел в Интернете, чтобы сделать код подходящим для моей платы. Мне удается перевести его в спящий режим, но затем я должен сбросить его, потому что прерывание не работает. Я был бы очень рад любой помощи и, пожалуйста, не вините меня, я полный новичок! Вот мой код:

 #include <avr/sleep.h>
#include <avr/power.h>
#include <avr/interrupt.h>

int pin2 = 2;

void pin2Interrupt(void) {
    /* This will bring us back from sleep. */

    detachInterrupt(digitalPinToInterrupt(2));
}


void enterSleep(void) {
    /* Setup pin2 as an interrupt and attach handler. */

    delay(100);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
    sleep_enable();

    attachInterrupt(digitalPinToInterrupt(2), pin2Interrupt, RISING);

    if (digitalRead(pin2)){
        sleep_mode();
    }

    /* The program will continue from here  
     * First thing to do is disable sleep.
     */

    sleep_disable(); 
}


void setup() {
    Serial.begin(9600);

    /* Setup the pin direction. */
    pinMode(pin2, INPUT_PULLUP);

    Serial.println("Initialisation complete.");
}

int seconds = 0;

void loop() {
    delay(1000);
    seconds  ;

    Serial.print("Awake for ");
    Serial.print(seconds, DEC);
    Serial.println(" second");

    if(seconds == 3){
        Serial.println("Entering sleep");
        delay(200);
        seconds = 0;
        enterSleep();
    }
}
  

Обновить:

 #include "LowPower.h"
#include "avr/interrupt.h"
#define BUTTON 3
#define LEDPIN 13

void wakeUp() {
  detachInterrupt(digitalPinToInterrupt(BUTTON));
}

void Blink(byte ledPin, int msDelay, byte loops) {
  for (byte i=0; i<loops; i  ) {
    digitalWrite(ledPin, LOW);
    delay(msDelay);
    digitalWrite(ledPin, LOW);
    delay(msDelay);
  }
}

void setup() {
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, LOW);
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN, LOW);
}

void loop() {
  cli();

  EIMSK amp;= ~(1 << INT0);
  EICRA |= (1 << ISC01) | (1 << ISC00);
  EIMSK |= (1 << INT0);

  attachInterrupt(digitalPinToInterrupt(BUTTON), wakeUp, CHANGE);
  sei();
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  Blink(LEDPIN, 100, 3);
  Serial.println("AWAKE!");
  delay(100);
}
  

Комментарии:

1. возможно, присоединить прерывание перед переходом в спящий режим, а не после

2. он переходит в спящий режим в точке «sleep_mode ();», поэтому функция attachInterrupt находится прямо перед ним. set_sleep_mode и sleep_enable только предоставляют информацию о uController, но пока не переводят его в спящий режим, если я правильно понял

3. Включены ли прерывания?

4. Я только что обновил код. Я включил глобальные и внешние прерывания, но Adafruit по-прежнему не просыпается.