Go Down

Topic: Problème de compteur (Read 1 time) previous topic - next topic

Yab974

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 :

Code: [Select]

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.

3Sigma

Bonjour,

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

Yab974

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

Code: [Select]

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.

3Sigma

C'est normal à cause de ça:

Code: [Select]

While (Compteur <= Consigne)


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

Yab974

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

3Sigma

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

Yab974

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

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


Code: [Select]
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.
 

kamill

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.

Yab974

 :smiley-confuse: 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.

kamill

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.

3Sigma

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).

infobarquee

:smiley-confuse: 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 :)

donc il faut TOUT le code
AUCUNE AIDE PAR MP

Yab974

Bonjour à tous,
voici donc le code complet :
Code: [Select]

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

3Sigma

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

Yab974

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

Go Up