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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.