Salut,
Bonne idée la machine a état (le switch/case) c'est souvent l'idéal sur un microcontrôleur, c'est simple et redoutablement efficace.
Par contre, tu ne gères toujours pas tes boutons par des interruptions mais toujours par du polling dans le soft. C'est souvent très embêtant car si l'utilisateur appuie juste avant ou juste après le if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE) le programme ne le verra pas. Souvent le polling fonctionne tout de même mais sache que tu ne maîtrises pas grand choses pour ne pas dire que c'est grandement de la chance dans bien des cas de figures.
Pourquoi le polling est hasardeux ?
- Le programme est souvent court et comme il tourne en boucle, il passe de ce fait rapidement sur if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE) et ça fonctionne. Sauf que plus ton programme va grandir et plus il se passera de temps entre deux if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE) au risque de louper un appuie sur le bouton, par l'utilisateur. Si jamais du place des tempos dans ton programme, tu vas encore plus accentuer ce problème.
- Le fantôme de l'anti-rebond naturel est lié a l'incidence de que j'ai écrit au dessus, plus il se passe de temps entre deux if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE) et plus on se moque des rebonds car ils arriveront entre deux lectures du bouton. Il arrive très souvent qu'on en arrivera à négliger carrément ce problème de rebond puisqu'il ne pose pas de problèmes, jusqu'au jour où le programme se raccourcisse (optimisation ? mise à jour ? modification ?) ce qui va diminuer le temps entre deux if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE) et là on peut tomber sur un rebond que le programme pensera être un appuie.
- On compte souvent sur l'utilisateur pour que le temps d'appui sur l'interrupteur soit relativement long sauf que rien en le garantie et que le jour à ce n'est pas un homme qui appuie sur le bouton mais que tu lis un signal logique, un état haut ou un état bas comme un bouton, suivant sa rapidité il y a toutes les chances que la version polling te fasse le rater, en tombant pas mal chance entre deux if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_7) == FALSE), et tout dépendra de la taille de ton programme et des tempos.
Personnellement j'ai toujours gérer mes interrupteurs par des interruptions. Bref !
Tu peux faire ça je pense :
1 2 3 4 5 6 7 8 9 10
| if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_6) == FALSE){
choix = 0; // on s'arrête
GPIO_WriteLow(GPIOC,GPIO_PIN_1);
GPIO_WriteLow(GPIOB,GPIO_PIN_1);
GPIO_WriteLow(GPIOB,GPIO_PIN_2);
GPIO_WriteLow(GPIOB,GPIO_PIN_3);
} |
Partager