Librairie ArduinoLowPower

Bonjour !

J'espére que vous allez pouvoir m'aider.

J'ai un petit problème avec la librairie ArduinoLowPower

Je dois faire appel à la fonction LowPower.attachInterruptWakeup() mais il n'y a aucune méthode permettant de libérer l'interruption sans faire de reboot de l'Arduino.

Voici le code de la méthode attachInterruptWakeup:

void ArduinoLowPowerClass::attachInterruptWakeup(uint32_t pin, voidFuncPtr callback, uint32_t mode) {

if (pin > PINS_COUNT) {
// check for external wakeup sources
// RTC library should call this API to enable the alarm subsystem
switch (pin) {
case RTC_ALARM_WAKEUP:
rtc.begin(false);
rtc.attachInterrupt(callback);
/case UART_WAKEUP:/
}
return;
}

EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
return;

//pinMode(pin, INPUT_PULLUP);
attachInterrupt(pin, callback, mode);

// enable EIC clock
GCLK->CLKCTRL.bit.CLKEN = 0; //disable GCLK module
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

GCLK->GENCTRL.bit.RUNSTDBY = 1; //GCLK6 run standby
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

// Enable wakeup capability on pin in case being used during sleep
EIC->WAKEUP.reg |= (1 << in);

/* Errata: Make sure that the Flash does not power all the way down

  • when in sleep mode. */

NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_DISABLED_Val;
}

Je voudrais faire l'inverse mais je ne comprend pas tout :s.

Voici mon code pour la nouvelle méthode detachInterruptWakeup:

void ArduinoLowPowerClass::detachInterruptWakeup(uint32_t pin) {
EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
return;

//pinMode(pin, INPUT_PULLUP);
detachInterrupt(pin);

// disable EIC clock
GCLK->CLKCTRL.bit.CLKEN = 1; //enable GCLK module
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

GCLK->GENCTRL.bit.RUNSTDBY = 0; //GCLK6 run standby
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

// Disable wakeup capability on pin in case being used during sleep
EIC->WAKEUP.reg |= (0 << in);

NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_WAKEUPINSTANT_Val;

}

Merci d'avance pour votre aide :slight_smile:

Si ce n’est pas pour la RTC et sur une pin supportant les interruptions alors juste un detachInterrupt(pin); devrait suffire, non ?

J-M-L:
Si ce n’est pas pour la RTC et sur une pin supportant les interruptions alors juste un detachInterrupt(pin); devrait suffire, non ?

Bonjour J-M-L !

Merci pour ta réponse, j'ai déjà essayé avec detachinterrupt(pin) seul mais cela n'a aucun effet.

Quel effet attendez vous ?

J-M-L:
Quel effet attendez vous ?

Bonjour J-M-L !

Je cherche à l'inverse de la méthode LowPower.attachInterruptWakeup()

Je ne comprends pas cette partie du code :

// enable EIC clock
GCLK->CLKCTRL.bit.CLKEN = 0; //disable GCLK module
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
while (GCLK->STATUS.bit.SYNCBUSY);

GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

GCLK->GENCTRL.bit.RUNSTDBY = 1; //GCLK6 run standby
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);

// Enable wakeup capability on pin in case being used during sleep
EIC->WAKEUP.reg |= (1 << in);

/* Errata: Make sure that the Flash does not power all the way down

  • when in sleep mode. */

NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_DISABLED_Val;

Merci d'avance

Je cherche à l'inverse de la méthode LowPower.attachInterruptWakeup()

J'ai bien compris ça, je voulais dire quand vous dites

j'ai déjà essayé avec detachinterrupt(pin) seul mais cela n'a aucun effet.

je me demandez quel effet visible vous attendiez

le code que vous citez active tout ce qu'il faut pour que les interruptions soient fonctionnelles en mode sleep - mais si vous n'avez pas d'interruption attachée ou que vous ne faites pas de sleep, vous n'avez pas vraiment à vous en soucier...

J-M-L:
J'ai bien compris ça, je voulais dire quand vous dites je me demandez quel effet visible vous attendiez

le code que vous citez active tout ce qu'il faut pour que les interruptions soient fonctionnelles en mode sleep - mais si vous n'avez pas d'interruption attachée ou que vous ne faites pas de sleep, vous n'avez pas vraiment à vous en soucier...

Pardon je me suis mal expliqué ! J'utilise l'interruption pour le réveil de la carte ensuite j'utilise le même bouton pour pouvoir sélectionner des modes différents grâce à la librairie ClickButton.

Et une fois le bon mode je repasse en interruption.

si vous détachez l'interruption elle ne devrait plus se déclencher et donc vous pouvez gérer la pin de lecture du bouton normalement. c'est pas ce que vous voyez ?

J-M-L:
si vous détachez l'interruption elle ne devrait plus se déclencher et donc vous pouvez gérer la pin de lecture du bouton normalement. c'est pas ce que vous voyez ?

non cela ne fonctionne pas ! Je ne peux pas réappeler la fonction LowPower.attachInterruptWakeup(). Je n'arrive plus à avoir t'interruption sans rédemarrer la carte.

Vous êtes sur quel arduino ?

Un arduino MKRFOX1200

Petit up !

maxou51100:
Je n'arrive plus à avoir t'interruption sans rédemarrer la carte.

il se peut que vous soyez impacté par ce soucis

documentez dans le GitHub

Et il y a une solution ?

Ou il faut obligatoirement faire un reboot ?

Car j'ai des variables à sauvegarder et ça m'embête de devoir mettre les valeurs dans la mémoire de l'arduino sachant que je suis limité en nombre d'écriture.

Merci d'avance pour votre réponse.

le bug est ouvert pour le moment... donc non

J-M-L:
le bug est ouvert pour le moment... donc non

Ok. Merci beaucoup pour votre aide !