explication sur les sleep_mode ?

Bonsoir,
J'essaie de m'écrire une librairie pour gérer les interruptions timer et input.
Le but est que mon programme principal soit entièrement piloté par les interruptions afin que l'arduino soit toujours dans un des sleep mode, en dehors de chaque action à réaliser.

Cependant, j'ai beau retourner la doc atmel dans tous les sens, je ne comprend pas ce qui se passe :

  • soit les interruptions sur les entrées ne réveillent pas l'arduino
  • soit le timer0 semble dériver complètement (millis() retourne des valeurs incohérentes)
  • soit l'arduino se réveille en boucle

Je viens de lire le très bon tuto Interruptions ATMega 328p - Tutoriels et cours - Arduino Forum, qui m'a éclairci les idées sur certains aspects, mais je cherche une explication claire sur qui utilise quoi, entre les timers, le "hardware serial" et les divers niveaux de sleep mode ainsi que les diverses "clock" évoquées dans la doc Atmel.

Savez vous où je peux trouver ça ?
J'utilise un Uno, donc un AtMega328P, mais une explication basée surun autre modèle me suffira si ça me permet de comprendre les bases qui me manquent.

Merci d'avance

Bonjour,
je me permet de relancer ma question, car en dépilant les anciens topics, j'ai compris que le forum a subi une période de "m... faut que je termine mon TP de 1er STI2D pour demain et j'ai pas encore commencé".
Du coup, mon appel à l'aide est peut être passé inaperçu.

Promis, c'est pas pour un TP, et j'ai cherché avant, même dans les docs en anglais :wink:
Pour ma part, la 1ere (E à l'époque) c'était y'a un certain temps, et j'apprenais alors par moi même ce qu'était une interruption sur Z80. Par contre, la doc Atmel, j'avoue que je me paume dans le nombre de registres, de clocks et de modes bizarres ..

Je suis complètement débutant en électronique (j'avais d'ailleurs posé quelques questions l'an dernier sur des problèmes de changements de tensions qui n'étaient pas détectés par les entrées de l'arduino)
Bref, si vous attendez un retour d'ascenseur, ça sera certainement pas sur les aspects hardware, mais je peux aider sur la programmation elle même.
J'ai d'ailleurs bouclé un bout de code qui pourrait servir à certains, je vais poster ça juste après dans un topic à part.

Merci d'avance

La bible c'est la datasheet du processeur mais autrement il y a cet article de Nick Gammon qui est très complet

cette librairie pourrait t'intéresser

Il y a un moyen efficace même s'il est prenant : celui que j'ai employé.
Faut pas croire que je n'ai pensé qu'a vous quand j'ai écrit le document sur les interruptions, c'était d'abord pour m'obliger à mettre noir sur blanc ce que je croyais avoir compris, et crois moi la mise par écrit casse les illusions de compréhension.
Une fois le document écrit autant en faire profiter les autres. Par ailleurs je l'ai relu il y a quelques semaine et j'en expurge encore quelques approximations.

En ce qui concerne la mise en sommeil et le réveil d'un micro-controleur il faut comprendre la différence entre les fonctionnements synchrone et asynchrone.
Synchrone :
Le micro est cadencé à 16 MHz et chaque modification n'est prise en compte qu'au front montant d'horloge suivant. Avec un horloge à 16 MHz c'est ce qui limite les vitesses de l'ISP à 8 MHz.
Asynchrone :
La prise en compte des changements est immédiate, peut importe l'horloge. Cela fonctionne même si l'horloge est arrêtée.

Le défaut de la technique asynchrone c'est qu'il faut maîtriser tous les temps de propagation du signal et dans un micro-controleur à plusieurs millions de transistors c'est impossible.

C'est pourquoi la technique asynchrone est réservée à des cas particuliers et en autre dans les Timers.
Le réveil d'un micro dont l'horloge est mode économie d'énergie donc en sommeil ne peut se faire que de manière asynchrone.
Il faut bien choisir le mode de fonctionnement.

fdufnews:
il y a cet article de Nick Gammon qui est très complet
Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors

Internet est définitivement trop grand pour ma p'tite tête :slight_smile:
J'étais tombé sur d'autres topic dans ce forum, mais celui là, c'est pile ce qu'il me fallait ! merci

68tjs:
Il y a un moyen efficace même s'il est prenant : celui que j'ai employé.
Faut pas croire que je n'ai pensé qu'a vous quand j'ai écrit le document sur les interruptions,

Nous n'en demandons pas tant :slight_smile:

c'était d'abord pour m'obliger à mettre noir sur blanc ce que je croyais avoir compris, et crois moi la mise par écrit casse les illusions de compréhension.

Les tests grandeur nature aussi :slight_smile:
Perso je note des trucs en vrac dans mon coin, mais je préfère partager des exemples de code ou mieux, des lib mettant en oeuvre ce que j'ai compris.
J'ai réussi à faire quelques bricoles entre timers et interruptions "input" (GitHub - piif/ArduinoTools: some tools for arduino programming) mais le comportement est très louche vis à vis des sleep modes, d'où ma question.
Une fois que j'aurai stabilisé ça, je compte bien le documenter et le partager ici même.

Je fais des tests pour comprendre plus en détail, mais il y a un point vraiment pénible, c'est le fait que HardwareSerial utilise lui aussi des interruptions. J'ai l'impression que dès qu'on fait un Serial.begin, il y a des effets de bord dans tous les sens, même si on n'écrit rien sur le port série.
Du coup, je vais commencer par chercher un moyen d'écrire un log quelque part sans cette lib, afin de pouvoir tester des choses sans "parasites"

Très clairement si tu veux jouer avec les timers oublies les arduineries.
La datasheet, rien que la datasheet, toute la datasheet, et bon courage.

Il va falloir s'arrêter, cela devient malsain.

Bon .. j'ai fait comme on m'a dit, et j'ai pris quelques notes sur les "clocks", à partir de la doc Atmel :

Mais la section 6.10, elle m'a méchamment planté
Si quelqu'un à la version compréhensible, parce que là, je sèche.
Dommage, car pour comprendre les sleep modes, ça m'a l'air d'être l'étape obligée

à suivre ...