Go Down

Topic: Sortie d'interruptions (Read 750 times) previous topic - next topic

B@tto

Non mais la, tu ne reste jamais "coincer" dans une routine : la loop joue le rôle de chacun de tes while qu'il faut d'ailleurs enlever. La routine qui va boucler en continu sera celle qui correspondra au currState. Le seul moment ou tu va devoir attendre c'est que si une routine est engagée, il faut qu'elle se termine avant d'enchainer sur la routine nouvellement selectionnée.

Claude_L

D'accord, grâce à cette discussion, j'ai pensé différemment le problème et je pense que ce que je mets en suivant va vraiment aller sans handicaper mes temps de réponse.
Merci pour t'être penché sur mon problème et d'y avoir consacré du temps, être à plusieurs, cela ouvre des perspectives nouvelles.
Code: [Select]
// ------------------------
// Routine d'initialisation

void setup()
{

// Réglage de l'interruption du BP.

attachInterrupt(1, getIntBP, FALLING);
boolean bpUp = true;

subState1();

}

// ----------------
// Boucle principale

void loop()
{
bpUp = true;
switch (currState)
{
case state1:
subState2();
break;
case state2:
subState3();
break;
case state3:
subState4();
break;
case state4:
subState1();
break;
default:
subState1();
}

//-------------------------------------
// Routine d'interruption

void getIntBP()
{
bpUp = false;
}

//-----------------
// Routine état 1

void subState1()
{
currState = state1;
while (bpUp)
{
// Do something
}
}
//-----------------
// Routine état 2

void subState2()
{
currState = state2;
while (bpUp)
{
// Do something
}
}

//-----------------
// Routine état 3

void subState3()
{
currState = state3;
while (bpUp)
{
// Do something
}
}

//-----------------
// Routine état 4

void subState4()
{
currState = state4;
while (bpUp)
{
// Do something
}

B@tto

Pour moi tu te compliques la vie : tu tiens à tes while alors que loop fera le job :
Code: [Select]

// ------------------------
// Routine d'initialisation

byte currState=0;

void setup()
{

// Réglage de l'interruption du BP.

attachInterrupt(1, getIntBP, FALLING);

subState1();

}

// ----------------
// Boucle principale

void loop()
{

switch (currState)
{
case 0:
subState2();
break;
case 1:
subState3();
break;
case 2:
subState4();
break;
case 3:
subState1();
break;
default:
subState1();
}

//-------------------------------------
// Routine d'interruption

void getIntBP()
{
currState++;
if(currState>3) currState=0;
}

//-----------------
// Routine état 1

void subState1()
{
// Do something
}
//-----------------
// Routine état 2

void subState2()
{
// Do something
}

//-----------------
// Routine état 3

void subState3()
{
// Do something
}

//-----------------
// Routine état 4

void subState4()
{
// Do something
}

Go Up