Arduino Leonardo Sleep Mode

#3816127
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?
#3817393
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren