test de condition if verifié uniquement dans la boucle principale?

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 9 mars 2008 à 19:59
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 17 mars 2008 à 00:06
Bonsoir,

Je poste ce topic ici car programmé en C , il s'agit je pense de probleme de compilateur ou d'algorithme (definition de variables,..).

Il s'agit de la programmation d'un système à microcontrolleur.

Mon probleme est que la condition : if(SQUELCH==0x00) detectée dans la boucle principale ne se detecte pas si elle est utilisé dans des boucles imbriquées.

comme vous pouvez le voir ici dans le code resumé:

CODE:

*variables globales*/
...
 
#define SQV PINF.0;
 
...
 
unsignedchar SQUELCH;
 
...
 
main()
{
 
....
 
while(1)
{
..
 
if(test==0x01)
{
SQUELCH=SQV;
PORTG=PORTG & 0b11110111;
...
}
 
 
if(SQUELCH==0x00)   //ICI condition se detecte bien
{
PORTG=PORTG & 0b11110111;
lcd_gotoxy(17,0);lcd_putsf("  S");
...
}
 
 
...
 
if(condition1)
 
{
   ..
 
   if(condition2)
  
    {
      switch(KEY)
          {
            case1:
 
            case5:
 
            case3:
 
                      ....
                      while(1)
                      {
                       .....
                              switch(KEY)
                             {
                              case4:  //button up
 
                              case8:  //button down
 
                              case12:  //button validation for outgoing
                              }
 
                              if(SQUELCH==0x00)  //ICI pas detecté alors que signal
                                                         // existant
                              {
                               PORTG=PORTG & 0b11110111;
                               lcd_gotoxy(17,0);lcd_putsf("  S");
                               }
 
                               if(KEY==12)break;
 
                       } KEY=0;
 
             case7:
 
          } KEY=0;
 
      }//condtion2
 
}//condtion1
 
 
}//while(1)
 
}//main

FIN CODE

Est ce normal? Pourtant il s'agit de variables globales définies avant le main()

J'ai essayé les conditions suivantes en remplacant le  "if(SQUELCH==0x00)"
par "if(SQV==0x00)"
ou par "if(PINF.0==0x00)"

Mais toujours pas de condition if detectée (car les instructions de ce bloc if ne s'executent pas)? Comment pourrais je verifier cette condition dans les boucles imbriquées, n'importe où dans le programme ?

Merci

DevelSoft

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 mars 2008 à 20:11
Quand une condition n'est pas détectée, c'est simplement que cette condition n'est pas bonne, faut revoir l'algo.

ciao...
BruNews, MVP VC++
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
10 mars 2008 à 09:43
Bonjour,

Voila il paraîtrait que l'optimiseur neglige ce test. Mais pour contre-carré ça j'ai déclaré la variable SQUELCH cette fois en volatile :
 
volatile unsigned char SQUELCH;

et j'ai deplus ajouté 4 x d'affilés la condition de test là où il n'est pas détecté.

Mais toujours rien a faire la condition est bien existante mais elle n'est pas détécté.

Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2008 à 09:53
Pourquoi tu n'affiches pas la valeur avant le IF ?
Il n'y aurait ainsi plus rien à discuter.

ciao...
BruNews, MVP VC++
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
10 mars 2008 à 10:02
En fait je n'ai pas de console debug, j'ai uniquement une affichage sur un LCD
20x4 formatté.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
10 mars 2008 à 12:45
ton define est erroné !



#define SQV PINF.0;

Enlève ce point vurgule qui fausse le test !
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
10 mars 2008 à 13:47
Désolé erreur d'écriture de ma part  le SQV est bien defini sans le point virgule
dans le programme :

#define SQV PINF.0

Donc l'erreur ne vient pas de là, je crois que c'est l'optimiseur qui doit pouvoir laisser faire le test du if(SQUELCH==0) dans la boucle imbriquée mais ne l'autorise pas. Peut être qu'il y a une autre algo ou astuce à utiliser?

Merci
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
17 mars 2008 à 00:06
Re,

Désolé pour l eretard, voici la solution apporté etant donné que la variable peut ne pas être testé
compte tenu de l'optimiseur,

la solution est d'appeler une nouvelle fonction squelch dans la boucle imbriquée: 

Unsigned int squelch(int test)
{
    switch(test)
    {case 0x01 : return SQV ;
        case 0x00 : return SQU ;
        defaults : return SQV ;
    }
}

Merci
0
Rejoignez-nous