Forum: Mikrocontroller und Digitale Elektronik Arduino Leonardo Sleep Mode


von Norbert V. (norbie)


Lesenswert?

Hallo zusammen,

scheinbar stehe ich mit dem Arduino Leonardo und der Sleep Mode Funktion 
auf Kriegsfuß. Habe folgenden Code:

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

int pin3 = 3;

/***************************************************
 *  Name:        pin3Interrupt
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Service routine for pin2 interrupt
 *
 ***************************************************/
void pin3Interrupt(void)
{
  /* This will bring us back from sleep. */

  /* We detach the interrupt to stop it from
   * continuously firing while the interrupt pin
   * is low.
   */
  detachInterrupt(0);
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{

  /* Setup pin3 as an interrupt and attach handler. */
  attachInterrupt(0, pin3Interrupt, LOW);
  delay(100);

  set_sleep_mode(SLEEP_MODE_IDLE);

  sleep_enable();

  sleep_mode();

  /* The program will continue from here. */

  /* First thing to do is disable sleep. */
  sleep_disable();
}


/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the Arduino.
 *
 ***************************************************/
void setup()
{
  Serial.begin(9600);

  /* Setup the pin direction. */
  pinMode(pin3, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  //digitalWrite(pin2, HIGH);

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



/***************************************************
 *  Name:        loop
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
int seconds=0;
void loop()
{
  delay(1000);
  seconds++;

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

  if(seconds == 10)
  {
    Serial.println("Entering sleep");
    digitalWrite(13,LOW);
    delay(200);
    seconds = 0;
    enterSleep();
  }

}

Das hoch zählen klappt wunderbar, dann geht scheinbar auch ganz 
kurzfristig ind die if-Schleife, springt aber sofort wieder heraus und 
zählt wieder hoch. Eigentlich ist es doch so programmiert, dass er nur 
bei einem LOW an PIN3 aus dem Sleep zurück kommt, oder habe ich einen 
Fehler?

Eigentlich habe ich ein klein bisschen was vor, ich will mit dem Arduino 
ein paar Code Pattern heraus schicken und wenn dies erledigt ist, soll 
dieser in den PWR_DOWN sleep und erst mit einem Power-on-reset wieder 
aufwachen. Die oben stehenden Zeilen sind für mich eigentlich erstmal 
ein Test, ob das mit dem sleep funktioniert. Ich sehe im Code eigentlich 
keinen Fehler, zusätzlich habe einmal probiert von außen den Pin3 auf 
HIGH zu legen und über einen Taster nach GND und ein zweiter Versuch war 
mit dem Befehl INPUT_PULLUP, wie beschrieben beides ohne erwünschten 
Erfolg.

Hat jemand zum Code oben oder zu meiner eigentlichen Umsetzung Rat?

von Jürgen S. (jurs)


Lesenswert?

Norbert Van der Heyd schrieb:
> Das hoch zählen klappt wunderbar, dann geht scheinbar auch ganz
> kurzfristig ind die if-Schleife, springt aber sofort wieder heraus und
> zählt wieder hoch. Eigentlich ist es doch so programmiert, dass er nur
> bei einem LOW an PIN3 aus dem Sleep zurück kommt, oder habe ich einen
> Fehler?

Beim Leonardo/32U4 läuft standardmäßig ein "native Serial" für die 
Seriellen Schnittstelle über USB ständig auf dem Controller.

Wenn Du den Controller sauber in einen Sleepmode versetzen möchtest, 
müßtest Du erstmal den USB sauber in einen Sleepmode versetzen und nach 
Ende des Sleepmode auch den USB wieder sauber aus dem Sleepmode 
herausholen.

Mit Googlen habe ich nichts dafür an fertigem Code für den Leonardo 
gefunden, und bei eigenen Versuchen habe ich mein Board stets nur mit 
meinen Test-Sketchen gebrickt, so dass ich "manuellen Upload mit Drücken 
von Reset im richtigen Augenblick" auf dem Leonardo nun im Schlaf 
beherrsche. Aber Sleepmode auf dem Leonardo habe ich bei meinen 
Versuchen nicht hinbekommen.

Mein Tipp, wenn Du Sleepmode benötigst: Atmega328.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.