Bonjour,
J'aimerai implémenter un bout de code pour mettre mon microcontrôleur ATmega328 en mode sommeil (Power Down) après x minutes et le réveiller ensuite par une interruption externe sur un port PCINT.
J'ai trouvé différents documents pour m'aider à ceci, notamment sur le site Arduino mais aussi via Google, et j'ai réussi (je crois) à faire ce que je voulais. J'ai cependant une question afin d'optimiser.
Pour le mode veille, voici le lien que j'ai utilisé : http://www.arduino.cc/playground/Learning/ArduinoSleepCode
Il n'y a pas vraiment eu besoin de modifier le code pour mon programme, j'ai juste du rajouter la ligne "detachInterrupt(0)" dans la méthode "void sleepNow()" car sinon cette interruption réveillait le uC sans que je le veuille. (J'avais mal lu le datasheet du uC mais c'est clairement dit que chaque interruption autorisée peut faire sortir du mode veille).
Pour le réveil, je voulais utiliser le code ici : Arduino Playground - HomePage mais je ne comprends pas comment ajouter les librairies #include <PinChangeInt.h> et #include <PinChangeIntConfig.h>.... Alors j'ai utilisé le code trouvé ici : http://www.me.ucsb.edu/~me170c/Code/How_to_Enable_Interrupts_on_ANY_pin.pdf
Voici le code que j'ai tapé (interruption avec PCINT21 (PD5)) :
PCICR |= (1<<PCIE2);
PCMSK2 |= (1<<PCINT21);
MCUCR = (1<<ISC01)|(1<<ISC00);
pinMode(PIN_INTERRUPT, INPUT);
digitalWrite(PIN_INTERRUPT,HIGH);
interrupts();(…)
ISR(PCINT21_vec){
wakeUpNow();
}
(PIN_INTERRUPT est défini au début, #define PIN_INTERRUPT 5)
Donc, chaque interruption sur PCINT21 réveille le uC.
Ca fonctionne mais j’aimerai quand même si possible utiliser le code de l’exemple d’Arduino car ça me parait plus propre pour faire des attachInterrupt et detachInterrupt pour PCINT… comment faire pour utiliser la librairie PinChangeInt.h ? je dois l’inclure manuellement dans mon programme ?
Sinon, je ne suis pas sûr de bien comprendre comment faire l’équivalent de attachInterrupt et detachInterrupt sur PCINT21, pourriez-vous m’expliquer svp ?
Pour info, je compile mon code avec Arduino 0022 car il y a un grosse partie du code qui a été écrite avant les nouvelles versions et il y a trop de changement à faire dans le code pour rendre la compilation possible…
Merci !