Pour faire clignoter une LED, on peut utiliser différentes approches, plus ou moins complexes, dont certaines seront adaptées à toutes les situations et d'autres pas.
Note : par la suite, on considère que l'horloge du microcontrôleur est précise et exactement de 16MHz.
Commençons par un premier exemple correspondant à ce qui a été vu au moment d'étudier les entrées / sorties tout ou rien.
Pour rappel, voici une portion du code du programme blinkingALed_V1.c tel qu'il a été réalisé précédemment :
int main(void)
{
// Initialisation
initSwitchesButtons();
initLEDs();
// Boucle principale
while(1)
{
setLED(RED, ON);
_delay_ms(1000);
setLED(RED, OFF);
_delay_ms(1000);
}
}
Puisque toutes les ressources du processeur sont utilisées pour faire une boucle vide dont la durée est fixée, on ne peut rien lui faire faire d'autre pendant ce temps. On dit que la fonction _delay_ms() est une fonction bloquante puisque l'exécution de la boucle principale du programme ne peut se poursuivre que lorsque la fonction _delay_ms() se termine.
Pour de très faibles délais, quelques microsecondes, cela ne peut aucune problème. Au delà, on comprend aisément qu'il va être difficile de faire faire autre chose à notre programme s'il faut chaque fois attendre une ou plusieurs secondes pour la tâche soit effectuée.
Pour illustrer cela, considérons le programme suivant dans lequel on souhaite faire clignoter la LED rouge avec une périodicité de 2s et, dans le même temps, on veut que la LED orange recopie l'état du bouton poussoir SW2.
// Boucle principale
while(1)
{
// Clignotement de la LED rouge
setLED(RED, ON);
_delay_ms(1000);
setLED(RED, OFF);
_delay_ms(1000);
// Recopie de l'état du bouton poussoir SW2 sur la LED ORANGE
if (getSwitchButton(SW2) == PRESSED) setLED(ORANGE, ON); else setLED(ORANGE, OFF);
}
Que se passe-il lorsqu'on appuie sur SW2 ? On doit attendre que les instructions liées au clignotement de la LED rouge aient été exécutées ! Par conséquent, le test de l'état du bouton poussoir SW2 n'aura lieu que toutes les 2s environ.
Conclusion : dès qu'on veut réaliser plusieurs choses dans notre boucle principale, on ne peut pas avoir de dispositifs bloquants dont la durée peuvent excède quelques microsecondes et peut nuire à la réactivité du système.