[Résolu] Sortir du mode sleep dans 2 cas.

Bonsoir,

  • J'ai une carte Mega2560 / IDE1.0.5-r2
  • J'arrive à mettre en mode sleep, réveil par interruption sur pin 3 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // pour int matériel ou
  • J'arrive à mettre en mode sleep, réveil par interruption Timer1 (débordement) set_sleep_mode(SLEEP_MODE_IDLE); // pour le timer 1 mais impossible de combiner les 2.

En fait, je voudrais sortir du mode sleep dans les 2 cas : 1) interruption matérielle (sur ma demande pour traiter un cas) 2) interruption timer1 toutes les 5 mn pour effectuer ne vérification périodique.

Est-ce possible ? OUI/NON si OUI, un lien ou une explication svp

Merci

Bonjour, De plus je ne comprends pas le différence entre sleep_mode() et sleep_cpu() (en anglais) J'ai essayé les 2 combinaisons et de nombreuses autres mais sans succès.

:) http://www.avrfreaks.net/forum/difference-between-sleepcpu-and-sleepmode

Bonjour à tous,

Merci dfgh, D'accord, j'ai à peu près compris 75% et je peux approfondir si nécessaire. Mais il semblerait que mon problème principal ne soit pas là.

On dirait que durant le sommeil, - le timer1 ne compte pas ? ou - le timer1 ne réveille pas ? Je ne sais pas ce qui se passe. Au réveil, par l'interruption extérieur, l'interruption timer fonctionne. Je repose ma question autrement : En supposant un paramétrage correct : Peut-on avoir un réveil de 2 sources (interruption ext ou/et interruption timer1) Si oui, je vais encore chercher mais si quelqu'un à une piste .... je suis preneur. Merci d'avance.

Depuis 2 jours à plein temps j'ai essayé de nombreuses combinaisons eu jonglant avec les registres concernés. Retraité, le temps ne compte pas beaucoup.

PS : @pepe : Grand merci, ça me semble plus détaillé, Il faut que j'étudie tes réponses. Tes 2 messages m'ont court-circuité Géry

Bonjour,

Merci pepe . Mon problème vient surtout du fait que je suis nul en anglais.

J'avais bien vu ce tableau mais je ne savais pas l'interpréter. Je pense maintenant avoir compris le principal : - Un seul mode possible (exclusif) - Utiliser impérativement le timer2 C'est bien cela ?

Je repars pour des essais et j'espère que ça devrait fonctionner. A bientôt

re Bonjour ,

Je tombe sur un autre problème que j’avais mal évalué.

En utilisant le timer2 durant un mode sleep, j’ai une interruption toutes les 16384 us. (tempo maxi)
Donc une sortie du mode sleep ? C’est bien cela ?

Comme je voudrais une tempo de plusieurs minutes ça devient ridicule d’utiliser le timer2.
Je pourrais y mettre une horloge RTC (PCF8563) , j’en ai une mais je voudrais l’éviter.
A moins que quelqu’un ait une autre idée ?

Mon raisonnement est-il correct ?

On peut enchaîner des micro réveils, toutes les 8s par exemple, on incrémente juste un compteur et on se rendort aussitôt,jusqu'à écoulement d'un laps de temps plus long voulu.

En même temps, réveiller le micro toutes les 16ms s'il se rendort tout de suite ne grèvera pas vraiment le budget consommation. Si lors du réveil, tu décrémentes un compteur et que tu le rendors si le compteur n'est pas à zéro cela te prendra quelques microsecondes seulement.

Re Bonjour,

Oui, je suis d'accord avec vous mais comme je le disais, ça me semble ridicule de se réveiller toutes les 16 ms. pour un timer devant atteindre plusieurs minutes.

Mais s'il n'y a pas d'autre solution, je ferai du comptage. J'attends encore un peu avant de marquer "résolu" car dans ce cas il faut encore tester.

Plaisanteries : Juste le temps de s'endormir. Pas le temps de rêver. Et puis le processeur va fatiguer inutilement !

Bonsoir;

Je n'avais pas compris que Christian_R proposait d'utiliser le watchdog.

Mais l'idée m'en était venue. Je viens de le tester mais il y a reset à chaque fois ! (toutes les 8 sec)

Serait il possible de garder l'interruption WD sans faire le reset ? J'ai essayé de jouer avec les différents registres sans succès.

Ce n'est peut-être pas possible ?

Bonsoir ou plutôt bonjour !

@pepe. Je viens réussir. C'est en voulant t'informer que j'ai découvert ton message. Il me reste à "nettoyer" et à voir ton lien pour comparer mais à cette heure = dodo. A Demain.

geryko: mais à cette heure = dodo. A Demain.

Si le mode sleep a été correctement programmé, Geryko devrait se réveiller après int delay = nuit et revenir sur le forum ;)

Bonjour,

Je confirme, il est donc possible de sortir du mode sleep de 2 manières combinées.

  • interruption matérielle : set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  • interruption watchdog, (sans provoquer reset)
    Le lien indiqué par pepe est super pour paramétrer le WD.
  • la méthode pour positionner les bits est plus simple à lire que “MCUSR &= ~(1<<WDRF)”
    que la mienne.

Un grand merci à dfgh, Christian_R, fdufnews et pepe pour leur aide.
3 jours à temps complet, mais quand on aime on ne compte pas.
Mon problème c’est l’anglais.
Cordialement
Géry