[RESOLU]Il ne fontionne pas, ce code!

Hello!

Je cherche à économiser ma batterie qui alimente mon UNO. Pour cela je souhaite le faire revenir à lui grâce à une interruption. En fouillant le net j’ai trouvé CE site. Très bien expliqué et un exemple en bonus.

J’ai uploadé le code dans mon ArduinoUNO, résultat: sa marche pas! La led reste toujours allumée, quelqu’un pour me dire pourquoi?

Le code en question:

#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/io.h>
                //
void setup(void)
{
    DDRD &= B00000011;       // set Arduino pins 2 to 7 as inputs, leaves 0 & 1 (RX & TX) as is
    DDRB = B00000000;        // set pins 8 to 13 as inputs
    PORTD |= B11111100;      // enable pullups on pins 2 to 7
    PORTB |= B11111111;      // enable pullups on pins 8 to 13
    pinMode(13,OUTPUT);      // set pin 13 as an output so we can use LED to monitor
    digitalWrite(13,HIGH);   // turn pin 13 LED on
}
                //
void loop(void)
{
    // Stay awake for 1 second, then sleep.
    // LED turns off when sleeping, then back on upon wake.
    delay(1000);
    sleepNow();
}
                //
void sleepNow(void)
{
    // Set pin 2 as interrupt and attach handler:
    attachInterrupt(0, pinInterrupt, LOW);
    delay(100);
    //
    // Choose our preferred sleep mode:
    set_sleep_mode(SLEEP_MODE_IDLE);
    //
    // Set sleep enable (SE) bit:
    sleep_enable();
    //
    // Put the device to sleep:
    digitalWrite(13,LOW);   // turn LED off to indicate sleep
    sleep_mode();
    //
    // Upon waking up, sketch continues from this point.
    sleep_disable();
    digitalWrite(13,HIGH);   // turn LED on to indicate awake
}
                //
void pinInterrupt(void)
{
    detachInterrupt(0);
}

Aha!

C’est un drôle l’écrivain…

Il me semblais bien que c’était bizarre que “sleep_disable” soit directement à la suite. Je l’ai mis dans l’interruption et sa fonctionne:

#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/io.h>
                //
void setup(void)
{
    DDRD &= B00000011;       // set Arduino pins 2 to 7 as inputs, leaves 0 & 1 (RX & TX) as is
    DDRB = B00000000;        // set pins 8 to 13 as inputs
    PORTD |= B11111100;      // enable pullups on pins 2 to 7
    PORTB |= B11111111;      // enable pullups on pins 8 to 13
    pinMode(13,OUTPUT);      // set pin 13 as an output so we can use LED to monitor
    
}
                //
void loop(void)
{
    // Stay awake for 1 second, then sleep.
    // LED turns off when sleeping, then back on upon wake.
    digitalWrite(13,HIGH);   // turn pin 13 LED on
    delay(1000);
    sleepNow();
}
                //
void sleepNow(void)
{
    // Set pin 2 as interrupt and attach handler:
    attachInterrupt(0, pinInterrupt, LOW);
    delay(100);
    //
    // Choose our preferred sleep mode:
    set_sleep_mode(SLEEP_MODE_IDLE);
    //
    // Set sleep enable (SE) bit:
    sleep_enable();
    //
    // Put the device to sleep:
    digitalWrite(13,LOW);   // turn LED off to indicate sleep
    sleep_mode();
    //
    delay(5000);
    // Upon waking up, sketch continues from this point.
    
}
                //
void pinInterrupt(void)
{
    detachInterrupt(0);
    sleep_disable();
}

Maintenant, sa fonctionne!

Bonjour,

La première version semblait correcte.
Normalement après sleep_mode() le processeur doit être en mode sleep donc n'execute pas l'instruction suivante.
Si il exécute les instructions suivantes c'est soit qu'il ne s'est pas mis en sleep, soit qu'il en est sorti.