Problème de compteur

Bonjour à tous,
voilà j'ai un problème avec une boucle qui fonctionne très bien sauf quand je dépasse la valeur de 9999.
Voilà une partie de mon programme :

While (Compteur <= Consigne)
{
  DigitalWrite (2, Output);
  Compteur = Compteur + 1;
}

Je précise que mon compteur est un int et cela fonctionne très bien quand la consigne varie de 0 à 9999 mais dès que je dépasse 9999 le programme ce blog.

Merci d'avance pour votre aide.

Bonjour,

Ce que tu as donné n'est pas suffisant. Par exemple, on ne sait pas ce que vaut "Consigne".

Je n'ai malheureusement pas tout le code à ma possession mais voilà un exemple plus complet :

int Consigne = 10000;
int  Compteur = 0;

void setup ()
{
  PinMode(8, Output);
  DigitalWrite (8, LOW);
}

void loop ()
{
While (Compteur <= Consigne)
{
  DigitalWrite (2, Output);
  Compteur = Compteur + 1;
}
}

Voilà le problème est que lorsque la valeur de la consigne est inférieur à 9999 mais dès que la consigne est supérieur à 9999 le programme commence à se dérouler et dès que le compteur arrive à 10000 il se fige et s'arrêt.

C'est normal à cause de ça:

While (Compteur <= Consigne)

Ce qui est à l'intérieur du while ne va plus s'exécuter si Compteur > Consigne.

Oui je sais mais le problème c'est que imaginons que ma consigne est égale à 15000 et ben lorsque mon compteur arrive 10000 le programme plante.
Alors que si ma consigne est à 9999 alors le programme se déroule sans problème jusqu'à ce que le compteur arrive à 9999.

et je n'arrive pas à comprendre pk, peut être le chiffre est trop grand

Qu'est-ce qui te fait dire que le programme plante ?

parce que je l'utilise avec un moteur pas à pas,

voici le programme complet que j'ai pu récupérer

int Consigne = 10000;
int  Compteur = 0;
int Interrup = 0;

void setup ()
{
  PinMode(8, Output);
  PinMode(9, Output);
  DigitalWrite (8, LOW);
  DigitalWrite(9, LOW);
}

void loop ()
{

if (Interrup == 1)
{
While (Compteur <= Consigne)
{
   digitalWrite(9, HIGH);
   delay(1);
   digitalWrite(9, LOW);
   delay(1);
   Compteur = Compteur + 1;
}
}
if (Interrup == 0)
{
  compteur = 0;
}
}

La variable interrup change par l'appui sur un bouton qui n'est pas représenté dans le programme.
Et donc lorsque j'appuie sur le bouton le programme démarre, mon moteur tourne jusqu'à ce que le compteur atteint la valeur de distance.
puis lorsque que je lâche le bouton la compteur est remis à zéro.

et ben tout ce passe très bien lorsque j'utilise une valeur de distance inférieur à 10000 mais si j'utilise une valeur pour distance supérieur à 10000 et ben le moteur tourne jursqu'à atteindre 9999 puis il s'arrête, et si je relâche le bouton le compteur ne se remet pas à zéro.

donc je pense que le programme plante.

Sachant que pour les valeurs de "distance" inférieur à 9999 le programme fonctionne sans problème.

Je pense également que cela vient de la variable compteur car si le problème venait de la valeur de distance, le moteur ne tournerait pas du tout.

En espérant que vous allez me comprendre.

Bonjour,

Ce serait peut être mieux si tu nous mettais les programme réel au lieu de nous montrer des bouts qui nont ni queue ni tête.
Avec les DigitalWrite et PinMode avec majuscules, ça n'a aucune chance de compiler correctement.

:confused: il faut peut être se concentrer sur le fond et pas la forme sachant que le programme fonctionne jusqu'à la limite de 9999.

Je suis désolé je n'ai pas le programme avec moi car il est sur un autre ordinateur.
Sinon je l'aurais écrit directement.

Je pense qu'il n'y a pas de problème avec la limite de 9999 (les int ont une valeur max de 32767) -> le problème est ailleurs. D’où ma question qui y a t'il ailleurs.

On va donc attendre que tu aies le vrai programme, c'est une perte de temps de travailler sur celui-ci puisque ce n'est pas celui qui fonctionne vraiment (celui-ci est peut-être correct et l'autre non).

Yab974:
:confused: il faut peut être se concentrer sur le fond et pas la forme sachant que le programme fonctionne jusqu'à la limite de 9999.

Je suis désolé je n'ai pas le programme avec moi car il est sur un autre ordinateur.
Sinon je l'aurais écrit directement.

d'après ce qui est mis en code, ca ne rentre jamais dans le while :slight_smile:

donc il faut TOUT le code

Bonjour à tous,
voici donc le code complet :

int OrdreMarche; // variable de stockage des valeurs reçues sur le port Série
int stepcounter;
int distance;

void setup()   { // debut de la fonction setup()
  pinMode(8, OUTPUT);     
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  Serial.begin(115200); // initialise connexion série à 115200 bauds
}

void loop(){ // debut de la fonction loop()


  while (Serial.available() > 0) { // si un octet en réception 

    int OrdreMarche = Serial.parseInt();
    int distance = Serial.parseInt();

    if (Serial.read() == '\n') {
      if (OrdreMarche== 1 ) { // si Octet reçu est le 1 
        while(stepcounter <= distance )
        {
          digitalWrite(9, HIGH);
          delayMicroseconds(30);          
          digitalWrite(9, LOW); 
          delayMicroseconds(30);
          stepcounter = stepcounter++;
        }

      }

      if (OrdreMarche== 0 ) { // si octet reçu est le L 

        stepcounter = 0;
      }
    }

  }


}

comme je vous ai dis précédemment on programme fonctionne parfaitement pour une valeur distance inférieur à 9999. dès que je passe à 10000 par exemple c'est impossible pour moi de relancer le programme.
je ne pense aps que cela vient de mon logiciel de pilotage car la carte reçoit bien la consigne d'aller jusqu'à10000 mails il se bloque à un certain moment.
Si jamais vous avez une idée du problème
je vous remercie d'avance

Quelle suite de caractères envoies-tu sur la liaison série ?

des chiffres de type int.
Enfaite je me suis rendu compte que il ne reçoit plus de consigne ou ne lit plus la consigne si je dépasse la valeur 10000

Bonjour à tous enfaite j'ai compris le problème, mais je sais pas trop comment le résoudre.

Enfaite comme le programme compte jusqu'à 10000 et que dépasse les 1000 milliseconde et ben l'arduino arrête de lire le port série.
Avait vous une idée de comment faire pour l'obliger à lire le port série?

hello
voici ton prg à peine modifié pour mettre en évidence ton problème
lance le et tape "2356"

et regarde bien ton moniteur

puis au coup suivant, tapes 1
puis au coup suivant tapes 10
puis au coup suivant, tapes 100
puis au coup suivant tapes 1000
puis au coup suivant tapes 10000

int OrdreMarche; // variable de stockage des valeurs reçues sur le port Série
int stepcounter;
int distance;

void setup()   { // debut de la fonction setup()
  pinMode(8, OUTPUT);     
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  Serial.begin(115200); // initialise connexion série à 115200 bauds
  Serial.println("Pret ");
}

void loop(){ // debut de la fonction loop()


  while (Serial.available() > 0) 
  { // si un octet en réception 

    int OrdreMarche = Serial.parseInt();
    int distance = Serial.parseInt();

    if (Serial.read() == '\n') Serial.print("OrdreMarche = ");Serial.println(OrdreMarche);
    {
      if (OrdreMarche== 1 ) // si Octet reçu est le 1 
      { 
        Serial.print("OrdreMarche = ");Serial.println(OrdreMarche);
        Serial.print("distance = ");Serial.println(distance);
        while(stepcounter <= distance )
        {
          digitalWrite(9, HIGH);
          delayMicroseconds(30);          
          digitalWrite(9, LOW); 
          delayMicroseconds(30);
          stepcounter++;
          Serial.print("stepcounter = ");Serial.println(stepcounter);
         }
      distance=0;
      stepcounter=0;
      OrdreMarche= 0;
      }
    }
  }
}

Salut,
j'ai essayé le programme que tu m'as envoyé et :
quand je tape 2356 rien ne se passe
quand je tape 1 le programme se déroule
quand je tape 10 rien ne se passe
ni à 100 etc...

une fois que j'ai appuyé sur 1 le programme se déroule et plus rien ne se passe ensuite lorsque je tape 10 ou 10 etc.....

quand tu tapes 1,
tu remplis les conditions pour entrer dans le if ordre de marche==1
et comme distance vaut 0 tu sors du while(stepcounter <= distance ) aussitôt

mais je ne voulais pas faire fonctionner ton prg,
seulement te montrer qu'il ne fonctionnait pas comme tu le pensais.

à toi de suivre les affichages et comprendre ce qui se passe

Tout à fait c'est le but de mon programme.

Ce que je veux c'est relativement simple :

1 - Réception de la valeur distance par la liaison série
2- Réception de la consigne de marche ou d'arrêt (valeur ordre de marche 1 ou 2 )

Si la valeur de marche = 0 alors je remets à 0 le compteur.
Si la valeur de marche = 1 je réalise mon programme et déroule le compteur jusqu'à ce que le compteur = la valeur de distance.
Puis il suffit que je change la valeur de marche pour remettre à 0 le compteur
Puis si je remets 1 à Ordre de marche le programme redémarre.

Tout les étapes fonctionnent très bien lorsque la valeur de distance est inférieur à 10000.

Mais dès que la valeur de distance est = ou supérieur à 10000.

le programme se déroule bien mais il devient pour moi impossible de remettre 0 dans la variable ordre de marche via le port Série.

Je pense que cela vient du temps de lecture du port série et que nous dépassons un certain temps car c'est quand même bizarre de pour une valeur de 9999 cela fonctionne et que pour 10000 ça ne fonctionne pas.

Dans l'attente de votre avis.