Timer

Bonjour à tous,

Je cherche une fonction timer qui fonctionne même si une autre fonction reste bloquée (comme une boucle infinie) laquelle serait la meilleure ?
Merci à vous

Bonjour

Aucune si c'est juste pour arriver à faire "plusieurs choses à la fois" en partant d'un code qui a des portions d'instructions bloquantes.

Tu risques fort de te prendre la tête avec des interruptions, aux contraintes et effets de bord difficiles à maîtriser (sauf éventuellement pour de petites choses simples).

Le plus facile sera toujours de transformer le code bloquant en code non bloquant, de manière à pouvoir alterner rapidement entre plusieurs fonctionnalités.

C'est pour faire quoi exactement?

TimerOne ?

@+

C'est pour réaliser un programme qui dure 30 secondes et qui ne dépasse pas le temps même si une fonction est en cours ou si elle est bloquée.

hello
regarde du coté du" Watchdog"

Oui le watchdog me semble être ce que je cherche, je ne connaissais pas merci

Le watchdog à forcément besoin d'un montage pour fonctionner ou le code suffit ?
Ne connaissant pas beaucoup le système, avr/wdt.h et lrs boucles wdt enable reset et disable sont elles suffisantes pour lancer le watchdog et le stopper après 95 secs ?
Merci

ce n'est que du soft

en gros tu surveilles le temps d'exécution de ton prg et s'il est trop long, le wtchdog te redirige.

c'est le principe utilisé dans les CN:
imagine que le prg d'exploitation soit une suite de fonctions.
le systeme exécute la tour à tour la 1ere fonction puis la 2eme puis...etc....

suppose que la 18ème fonction gère l'affichage sur l'écran. cette tache n'est pas "primordiale" et le temps qui lui est accordé est très court. suppose maintenant que cette fonction soit très chargée, beaucoup d'affichage à gerer, le temps alloué sera trop court. le watch dog va dire stop à cette fonction avant qu'elle soit terminée et va forcer le prog à exécuter la fonction suivante.

il aura simplement mit un pointeur sur l'endroit ou le fonction d'affichage à été stoppée.
lorsque ce sera à nouveau le tour de la fonction d'affichage d'etre exécutée, le programme recommencera là ou elle avait été stoppée.

voir ICI

tu es typiquement dans la définition du watchdog qui déclenche une interruption.

le maxi du watchdog étant 8 secondes, la routine d'interruption devra compter jusqu'à 4 avant de s'exécuter entierement pour te sortir de ta fonction bloquante.

bonne suite

Bonjour,
Merci beaucoup pour votre réponse, le code est presque finit, il ne reste qu'une erreur, le watchdog redémarre mon minuteur au début et je voudrai qu il ne le fasse pas (qu il redémarre uniquement la fonction)
Merci

c'est déjà une bonne avancée
:o sans ton code, difficile de t'aider............. :slight_smile:

La fonction dure trop longtemps exprès pour tester le watchdog mais il redémarre le minuteur. Je voudrais que le décompte ne change pas donc reset après son démarrage.

#include <simpleMinuteur.h>
#include <SharpIR.h>
#include <Servo.h>
#include <avr/wdt.h> 
Int i;

simpleMinuteur minuteur (6000);
Void loop (){
Minuteur.demarrer ();
for  (i=0;i <100;i++){
if  (minuteur.estActif()){
wdt_enable (WDTO_2S);
... 
wdt_disable();
}
}
}

Void avec un V majuscule ? Pas de setup (ou c'est juste un extrait de code) ?
Pas besoin de déclarer 'i' en variable globale, il vaut mieux écrire

for  (int i=0;i <100;i++){

La commande Minuteur.demarrer ();est dans la loop, c'est peut-être pour ça que le minuteur redémarre. Il faudrait la déplacer dans le setup.

Oui c'est un extrait de code le reste n'a aucune rapport (par exemple dans le setup je mets mon serial.begin ou des associations de pin enfin bref).
Void avec une maj c est l'auto correct.
Merci pour le conseil du for :wink:
je vais vérifier pour le minuteur mais je crois avoir essayé dans le setup.
Après je ne suis pas certain que le minuteur avec le watchog soit la meilleure solution mais je suis sûr qu'il est possible de mettre un timer (peut importe lequel) avec un watchdog sans reboot le timer.
Mais comme je débute, je ne comprends pas toutes les nuances du watchog.
Merci

Oui je connais le problème des majuscules automatiques par le correcteur orthographique du téléphone. C'est pareil pour minuteur, je suppose...

Je confirme que le changement du minuteur dans le setup ne change rien (même en dehors de tout)

simpleMinuteur minuteur (5900);
void setup (){
Serial.begin (9600);
minuteur.demarrer  ();
Serial.println ("demarrage du minuteur");
}
//puis le void

Le void inclut une boucle qui dure trop longtemps exprès pour utiliser le watchdog (je l ai entouré d un watchdog enable (2secondes) et un disable)

If (minuteur.estActif ()){
wdt_enable (WDTO_2S);
...//dure 4 secondes avec des delay
wdt_disable();
}

up ! :slight_smile:

Bonjour

L'usage du watchdog indiqué par dfgh en #7 m'est inconnu (= reprendre à un endroit spécifique du programme)

Pour ma part, je pensais le seul cas d'usage du watchdog consistait à déclencher un reboot de l'arduino, ce qui est cohérent avec ce que tu obtiens.

On en revient à l'idée de ma tout première réponse #1 : au lieu d'essayer de faire marcher des trucs techniquement compliqués, le plus facile sera toujours de repenser la structuration du programme en éléments simples et interruptibles.

D'accord merci beaucoup , je vais me pencher sur les interruptions