Go Down

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

Claude_L

Bonjour à tous.

Mon système comporte un bouton poussoir câblé sur l'entrée d'interruption.
Une fois dans la routine d'interruption, en fonction de la routine dans laquelle mon système se trouve avant l'appel par le bouton, je dois appeler une autre routine, et ainsi de suite.
Le problème est que je ne sors jamais réellement de l'interruption car j'appelle mes routine à partir d'un "case".

Je n'ai pas le temps de faire du polling dans les différentes routines donc positionner des drapeaux à partir de la routine d'interruption pour les exploiter ensuite est exclu.

J'ai eu besoin d'utiliser un tel système il y a fort longtemps en assembleur HC11 et cela consistait à mettre l'adresse de la routine voulue dans la pile à  l'adresse du vecteur de retour et de faire une instruction de sortie d'interruption.
En fait, ce noyau temps réel, je sais c'est pompeux, est constamment sous régime d'interruption.

Y a-t-il un moyen de faire de même avec un Arduino ?

Voici un aperçu de ce que souhaite réaliser :

Code: [Select]
// ------------------------
// Routine d'initialisation

void setup()
{

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

attachInterrupt(1, getIntBP, FALLING);
currState = state1;

}

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

void loop()
{
// Do nothing
}

//-------------------------------------
// Routine de gestion du bouton sous IT

void getIntBP()
{

switch (currState)
{
case state1:
subState2();
break;
case state2:
subState3();
break;
case state3:
subState4();
break;
case state4:
subState1();
break;
default:
subState1();

}

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

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

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

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

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

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

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



B@tto

Pourquoi ne pas simplement incrémenter une variable dans ton interruption, et faire un select case dans la loop ?

Claude_L

Parce que je ne vais pas dans la boucle look sauf en sortie de setup.
Il faudrait, dans cette hypothèse, que je fasse un select case dans toutes mes routines, ce qui est trop lourd.

B@tto

Je crois que tu m'as pas compris, un code vaut mieux qu'un long discours ^^ :
Code: [Select]

void loop(){
switch (currState)
{
case 1:
subState2();
break;
case 2:
subState3();
break;
case 3:
subState4();
break;
case 4:
subState1();
break;
default:
subState1();

}
}
void getIntBP(){
CurrentState++;
if(CurrentState>4) CurrentState=1;
}





Claude_L

Je ne comprends pas bien comment je peux me retrouver dans look après être passé dans une de mes boucles.
Le déroulement normal :

Je vais directement dans une des boucles et je fais des choses très "chaudes" en termes de temps. On appuie sur le bouton, donc on se retrouve dans la routine d'interruption. même si je positionne des choses dans cette routine, il va falloir que je les teste au retour et c'est cela que je veux éviter. En fait toutes mes routines sont des boucles look et le seul moyen de passer de l'une à l'autre est l'appui sur le bouton.

Go Up