PIC18F, problème boucle if

elrolas -  
 Elrolas -
Bonjour,

je suis actuellement entrain de programmer un PIC18F8722 sur MPlab. Je veux à un certain moment pouvoir effectuer une action si je dépasse une certaine valeur. Hors je rentre dans cette boucle même si les conditions ne sont pas remplis

int nVal; 
int CSTE 


if (nVal > CSTE) 
  code boucle; 

J'ai nVal qui est un entier signé qui varie constamment, toute les 3ms environ. Dans mplab, je met une interruption au début de la boucle if, et je regarde la valeur de nVal. Par exemple, je lis nVal =0 et j'ai pourtant choisi CSTE= 300.

Je ne comprends donc pas pourquoi j'exécute alors le "code boucle".

Je vous remercie d'avance de votre aide

4 réponses

chuka Messages postés 980 Statut Membre 378
 
Salut,
varie constamment, toute les 3ms environ
Cette variable varie comment?? Sous IT (timer etc...) ou elle est produite par le DAC??
Elle est remise à zero à un moment?
3ms? tu as verifié à l'oscillo?
CSTE est initialisé quand??
si tu as un peu plus de code à nous montrer...
@+
0
Templier Nocturne Messages postés 9989 Statut Membre 1 107
 
y manque pas une virgule aprés la 2eme ligne ?
0
Elrolas Messages postés 11 Statut Membre
 
pour le code, c'est pas le code exact, donc là j'ai oublié un ";", mais pas dans le code original ;).

Pour la variable nVal, autant pousser un peu plus loin les explications :

Je récupères des grandeurs de l'extérieur par une liaison série, des mots de 14 bits en "unsigned int" (donc entier non signés). cette grandeur est donc récupérée toutes les 3 ms environ, et varie. Appelons là "unVar". Je réalise une autre fonction où je fais la différence entre 2 unVar, avec un intervalle de 128 valeurs entre chaque.

Je vais mettre mon code à coté pour un peu plus de clarté quand même, et pas juste une partie ;).

#define SIZE 128

int nPtr;
unsigned int Tab_Temp[SIZE].

void Difference(unsigned int Data)
{ 	
	Tab_Temp[nPtr]=UnVar;

	
	if (Tab_Temp[SIZE-1] == 0)
		nVal = 0;
		
	if (nPtr == SIZE-1)
	{
		if (Tab_Temp[nPtr]>Tab_Temp[0])
			nVal= Tab_Temp[nPtr]-Tab_Temp[0];
		else
		{
			nVal=(Tab_Temp[0]-Tab_Temp[nPtr]);
			nVal= -nVal;
		}	
	}	
	else
	{
		if (Tab_Temp[nPtr]>Tab_Temp[nPtr+1])
			nVal= (Tab_Temp[nPtr] - Tab_Temp[nPtr+1]);
		else
		{
			nVal= (Tab_Temp[nPtr+1] - Tab_Temp[nPtr]);
			nVal= -nVal;
		}
	}	
	
	
	if (nPtr == SIZE-1)
		nPtr = 0;
	else
		nPtr++;
	
}





/************************************************************
****************************** interruption ********************
************************************************************/
#pragma interrupt InterruptHigh
 void InterruptHigh(void)
{	



	TMR0L = 0x00;
	nPeriode = 0;
	VAR = 0;
	INTCON3bits.INT3IE= 0; 		// Ext. Interrupt 3 disabled while reading
	Liaison_Serie();                       // écriture de unVar par la liaison série
	Difference(PIR_Data);

	

	
	INTCON3bits.INT3IE= 1;					// Ext. Interrupt 3 enabled	
	INTCON3bits.INT3IF = 0;
	

}

main()
{
        while(1)
        {
                 if (nVal > CSTE) 
                 code boucle; 
        }
}




Je rajoute à ça que ma condition ne se fait pas uniquement pour nVal = 0. J'ai eu également pour nVal = -36 (en hexa, FFDC).
0
Elrolas Messages postés 11 Statut Membre
 
Finalement j'ai réussit à résoudre le problème : j'ai crée un pointeur dans l'interruption pour cette condittion :

if (nVal < Cste)
nAlarme = 0xFA;
else
nAlarme = 0;

et j'ai utilisé ce "pointeur" pour pouvoir visualiser ma condition.

if (nAlarme == 0xFA)
{
code boucle;
nAlarme == 0
}

Bon, par contre je n'ai pas forcément bien compris pourquoi l'autre méthode ne marchait pas.
0
Elrolas
 
Bien, le problème est résolu. Cela venait de l'interruption qui arrétait l'écriture de ma valeur qui permettait de faire le seuil.

P.S : par contre, je n'arrive pas à le marquer comme résolu
0