PIC18F, problème boucle if
elrolas
-
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
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
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
A voir également:
- PIC18F, problème boucle if
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- Vlc lecture en boucle ✓ - Forum Lecteurs et supports vidéo
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Redémarrage en boucle Xiamo mi note 10 - Forum Xiaomi
- Huawei s'allume et s'éteint en boucle - Forum Huawei
4 réponses
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...
@+
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...
@+
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 ;).
Je rajoute à ça que ma condition ne se fait pas uniquement pour nVal = 0. J'ai eu également pour nVal = -36 (en hexa, FFDC).
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).
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.
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.