Go Down

Topic: Duemilanove, 2 questions: pourquoi boucle While(?) et pourquoi delay(?) (Read 675 times) previous topic - next topic

zeric

Bonjour,
Ceci est mon 1° post, c'est aussi mon 1° programme sur arduino, et aussi mon 1° programme sur µControleur !

Pour la question 1, le télérupteur avec sa boucle "tant que" ne fonctionne pas; la solution: une boucle "si" fonctionne, mais pourquoi !?
Mon test est pourtant bien tant que le bouton 3 est appuyé, mof?

Pour la question 2, j'ai des routines de test en dehors du "Loop" (mais j'ai essayé en les intégrant dans le "Loop", c'est pareil),
ou j'affecte des valeurs à des variables (simple quoi!), et quand je teste ces variables dans le "Loop", PAF, tout est bloqué !?
J'ai là aussi trouvé la solution en mettant un delai avant tout test ultérieur (mis juste après l'appel de la routine dans le "Loop"),
mais là encore, pourquoi ?
Je ne veux pas de delay(), dans mon cheminement, je fait du comptage précis dans une autre routine (chrono) et ça me gène !
Merci d'avance pour vos réponses éclairées  ;)
Code: [Select]

//Question 1:
void loop(){
while (bouton == 3){
  if (etat == 1 && front == false){
  etat = 0;
  front = true;  //memo appui
  Serial.println("off");
  }
  else if (etat == 0 && front == false){
  etat = 1;
  front = true;  //memo appui
  Serial.println("on");
  }
}
if (bouton != 3){
  front = false;  //raz memo sur relachement
}
}

//Question 2 : Pourquoi le µC (ou le programme?) plante si j'enlève le "delay", si petit soit-il !?
void loop(){
recepteur();
delay(1);
appui();
delay(1);

if (/* PAF, sans les delay(1) */){
//blabla
}
}

Jean-François

Question 1 :

qu'est ce qui change la valeur de bouton ?

Question 2 :

il faut que tu nous en dises plus sur les fonctions recepteur() et appui().
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

zeric

question 1: mes boutons sont tous branchés sur A0 (toutes les pins sont utilisées sur le bazar  :smiley-roll-sweat:)
Code: [Select]
void appui(){
vBouton =analogRead(0);
if (vBouton >700) {bouton = 0;}
else if (vBouton >586 && vBouton <596) {bouton = 1;}
else if (vBouton >482 && vBouton <492) {bouton = 2;}
else if (vBouton >313 && vBouton <323) {bouton = 3;}
}

Donc est-ce parce-que les affectations sont faites avec des "if" qui fait que "while" dans la boucle de télérupteur marche pas, mais "if" si? ( :smiley-red:)

question 2: voir au-dessus, mais j'ai mis les tests de la variable en dehors du Loop (le programme est trop gros pour
la compréhension et le debuggage) et je n'ai plus de plantage  :)

skywodd


Pour la question 1, le télérupteur avec sa boucle "tant que" ne fonctionne pas; la solution: une boucle "si" fonctionne, mais pourquoi !?
Mon test est pourtant bien tant que le bouton 3 est appuyé, mof?

La fonction loop() est appelé par une boucle infini, avec if (bouton == 3) à chaque itération de la fonction loop le µc fait la comparaison, si elle est vrai le µc exécute le code ou passe à la suite, avec un while le programme resterai bloquer.


Pour la question 2, j'ai des routines de test en dehors du "Loop" (mais j'ai essayé en les intégrant dans le "Loop", c'est pareil),
ou j'affecte des valeurs à des variables (simple quoi!), et quand je teste ces variables dans le "Loop", PAF, tout est bloqué !?
J'ai là aussi trouvé la solution en mettant un delai avant tout test ultérieur (mis juste après l'appel de la routine dans le "Loop"),
mais là encore, pourquoi ?
Je ne veux pas de delay(), dans mon cheminement, je fait du comptage précis dans une autre routine (chrono) et ça me gène !

Avec le code complet cela serais beaucoup plus simple pour résoudre ton probléme.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

zeric

Merci pour vos réponses,
Pour la boucle "while", je vois que je ne suis pas le seul à avoir eu des problèmes :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1237119479/0  ;)
Je ne m'en servirais à l'avenir que pour des itérations (du style while  i<100 , faire qqchose, i++) mais pas
pour des conditions d'attentes ou je me servirais seulement du "if".
Pour la question 2, j'ai sorti les tests de ces variables du "loop" (j'en ai fait aussi une routine) et tout fonctionne correctement,
je n'ai plus de delay(1) dans mon programme  :)

Go Up