[Résolu] Temporisation à l'aide du Timer2

Bonsoir,

Je possède une arduino uno. Je souhaite utiliser le timer 2 pour générer des interruptions toutes les 100ms et exécuter une fonction lors de ces interruptions, ce que je suis parvenu à faire. Au travers de cette fonction je voudrais générer des temporisations de la durée de mon choix par exemple 500ms dans le but de réaliser un chenillard (pour l’instant)
Voici mon code, il sera peut-être plus clair que mes mauvaises explications…

//Bibliothèques à inclure

#include <MsTimer2.h>

//Indentification des éléments à leurs PIN
int D0=2;
int D1=3;
int D2=4;
int D3=5;
int D4=6;

//Définition des variables globales
int i,j=0;
boolean flag=LOW;

void setup() {

  //Initialisation de la liaison série pour utiliser le moniteur
  Serial.begin(9600);
  
  //Définition des E/S
  pinMode(D0,OUTPUT);
  pinMode(D1,OUTPUT);
  pinMode(D2,OUTPUT);
  pinMode(D3,OUTPUT);
  pinMode(D4,OUTPUT);

  //Toutes les LED sont eteintes au démarrage
  digitalWrite(D0,LOW);
  digitalWrite(D1,LOW);
  digitalWrite(D2,LOW);
  digitalWrite(D3,LOW);
  digitalWrite(D4,LOW);
  
  //Définition de l'horloge temps réel
  MsTimer2::set(100, htr); // une interruption toutes les 100ms
  MsTimer2::start();

}

//tache de fond 
void loop() {
  
  digitalWrite(D0+i,HIGH);
  i++;
  while(!flag){}
  digitalWrite(D0+i-1,LOW);
  if(i==D4) i=0;

}

//horoge temps réel
void htr()
{
  if(j==5)
  {
    flag=!flag;
    j=0;
  }
    else
    {
      j++;
    }
}

Ce que j’attends de ce code c’est qu’il incrémente la variable j toutes les 100ms et au bout de 5 appels de la fonction htr la variable logique flag soit inversée ce qui génère ma tempo de 500ms dans ma boucle loop via le while(!flag).

Mon problème est que la variable j est remise à zéro chaque fois que la fonction htr se termine et je ne comprends pas pourquoi. Cela a pour effet de me faire entrer dans une boucle infinie dans ma fonction loop. Est ce que cela est normal ? (Je parle du fait que la variable j soit reset à chaque fois) Je pense que la valeur de j devrait être conservée mais ce n’est pas le cas et je ne comprends pas pourquoi.

Je remercie d’avance la personne qui pourra éclairer ma lanterne.

Bonsoir,

HS: je ne trouve pas très éthique les D0+i, D0+i-1, if(i==D4)... Addition et comparaison de choses qui n'ont pas vraiment de rapport. Oui ça marche mais bon... tant que tu ne changes pas la liste 2, 3, 4, 5 et 6. C'est crade au possible ! Et le "boolean flag=LOW"... Oui ça devrait marcher là aussi, mais à l'insu du bon sens.

HS2: un timer qui bloque la loop, huummm, c'est pas un peu contradictoire tout ça ? Le but en général d'un timer est de laisser filer la loop justement, pour faire autre chose entre les appels. Autant mettre un delay() à la place du while(!flag){}

HS3: pourquoi ne pas utiliser un timer de 500ms ?... et un autre de 100ms si besoin ? http://playground.arduino.cc/Code/SimpleTimer

Et sinon pour ton questionnement sur j... essaye peut-être de mettre un volatile devant sa déclaration. Mais l'ensemble me parait assez bugogène et tordu pour pouvoir émettre un avis éclairé... sorry.

Bonsoir, merci pour ta critique, c'est vrai qu'après lecture de ton commentaire et relecture de mon code je me rends compte qu'il est assez "laid". En fait le but était de faire un timer variable pour changer la vitesse du chenillard. J'ai trouvé une solution, en effet j'ai viré le while qui en fait bloque la tâche de fond ce qui rend l'utilisation d'un timer complètement inutile comme tu me l'as fait remarquer. Je te remercie encore cela me permet de progresser.

Bonjour
Sinon, pour info, le "volatile" doit etre dans la déclaration de "flag". C'est cette variable qui est utilisé dans la routine principale et dans la routine d'interruption. C'est une variable qui ne doit pas etre optimisée par le compilateur et etre relu systématiquement a chaque instruction qui l'utilise.

a+

le "volatile" doit etre dans la déclaration de "flag"

oui pardon...

quant au j, pour lever l’ambiguïté, il pouvait être déclaré directement dans htr() par un "static int j=0;"

mais visiblement tout à changé alors tant mieux si ça marche et que c'est plus propre.