#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 по-прежнему не просыпается.