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