Arduino Due sleep-mode will nicht funktionieren

Hey, ich habe jegliche Beiträge über den Arduino Due sleep mode gelesen und habe immer noch nicht die richtige Antwort auf meine Frage gefunden. Ich möchte den Arduino in der loop Funktion in den sleep modus setzen. Dieser darf dann erst wieder aufwachen, wenn ich den externen Interrupt- Pin gedrückt habe. Zu meinem Problem: Der Due geht gar nicht erst in den sleep modus. Der externe Interrupt funktioniert und der Compiler zeigt mir keine Fehler an. Über jegliche Hilfe und Vorschläge zur Verbesserung bin ich sehr dankbar ! :)

int controllLed = 5;
volatile int vibration = 7;
int wakeUpPin = 18;
volatile bool state = LOW;
bool led = LOW;

void setup() {

  pinMode(wakeUpPin, INPUT);
  attachInterrupt(18, InterruptServiceRoutine, RISING);
  pinMode(vibration, OUTPUT);
  digitalWrite(vibration, state);
}
void loop() {

  pmc_enable_sleepmode(0); // sleep mode wird hier erlaubt und zugelassen, darf nur aufwachen wenn ein externes Interrupt kommt
  led = !led;
  digitalWrite(controllLed, led ); //wenn die ControllLed wechselt, weiß man, dass der sleep mode nicht funktioniert hat
  delay(5000);
}

void InterruptServiceRoutine ()
{
  state = !state;
  digitalWrite(vibration, state); //wenn das interrupt funktioniert, wechselt der vibrationspin seinen status und geht damit an 

}

Was ist pmc_enable_sleepmode(0)? Erlauben heißt doch noch lange nicht, daß der Due auch gleich einschläft?

Hallo,

benötigt der Due dazu keine extra sleep u.ä. Library die eingebunden werden muß. Also wie bei den sonst üblichens Arduino's. Aber der eigentlich schlafen legen Befehl fehlt laut meinem Verständnis wirklich. Irgendwie unvollständig.

Hallo und vielen Dank für eure Antworten. Soweit ich das verstanden habe ist "pmc_enable_sleepmode(0)" eine Funktion die ich aus der Arduino Software (pmc.c) aufrufe;

void pmc_enable_sleepmode(uint8_t uc_type) { PMC->PMC_FSMR &= (uint32_t) ~ PMC_FSMR_LPM; // Enter Sleep mode SCB->SCR &= (uint32_t) ~ SCB_SCR_SLEEPDEEP_Msk; // Deep sleep

if (uc_type == 0) { __WFI(); } else { __WFE(); } }

So wie ich das jetzt verstanden habe, wird mit dieser Funktion der sleep mode ausgeführt und es wird geschlafen, bis ein Interrupt kommt. Deswegen die (0) nach pmc_enable_sleepmode. Damit wartet der Due auf ein Interrupt, wieder aufgeweckt zu werden.

Hast Du hier etwas herausgefunden?

pmc_enable_sleepmode(0); funktioniert bei mir auch nicht…

Rainer

Ich kann zwar nichts im Bezug auf das Problem sagen aber einen Arduino in Schlafmodus zu versetzen hat nicht wirklich sinn da die restliche Elektronik auf dem Board fleißig weiter Striom verbraucht. Slleep modus hat erst sinn wenn man eine eigenen Platine baut, die auf den Sleepmodus optimiert wurde.

Grüße Uwe