Salut la troupe!
Alors voilà, j'ai dans l'idée d'une fonction "time out".
Les bases : j'utilise le timer 0 (volontairement, je réécris un core utile et sans fioritures de micros(), delay() etc...).
Ce timer 0 tourne en continu, à vide.
Je définis une ISR ainsi :
volatile uint_16t msB;
ISR(TIMER0_COMPB_vect){
msB--;
}
Puis vient la complication :
L'idée est d'avoir un define qui génère un code de time out et serait appelé ainsi :
boolean ok = timeOut(2000, PIND&0x10); // attendre max 2000ms que l'entrée D4 passe à 1
Donc dans cet exemple, je j'attends que la condition "PIND&0x10" soit vraie, mais au bout d'un certain temps, on abandonne et on considère que le système qui doit valider la condition ne répond pas, et on en tiendra compte par la suite.
Une autre façon d'appeler ce time out pourrait être :
timeOut(2000, PIND&0x10);
if (timeOutOK) { // la condition est vérifiée
...
} else { // on a atteint le time out
...
}
La variable boolean timeOutOK ferait partie du core.
Le timeOut() serait un truc du genre :
boolean timeOutOK;
#define timeOut(tps,condition) (\
timeOutOK=false;\ // initialiser la variable de résultat : false si la condition ne se réalise pas dans le temps imparti.
msB=(tps); // initialiser le compteur msB
timer0_start;\ // démarrer le timer0
while(msB){\ // tourner en boucle tant que msB n'est pas à 0
if((condition)){\ // la condition est vérifiée?
timeOutOK=true;\ // alors on arrête tout, c'est bon!
break;\
}\
}\
timer0_stop;\ // arrêter le timer
)
D'après vous, c'est réalisable? ou tant pis, je me ferai hiech à mettre plusieurs lignes de code à chaque utilisation du time out...
??????
Merci!
Cinci.