CrcLib: avertissements d'utilisation
Cette page présente de l’information essentielle à propos de CrcLib.
Règles à suivre
Assurez-vous de respecter les règles suivantes pour assurer l’exécution correcte d’un code contenant des méthodes de la CrcLib:
Ne pas utiliser la méthode native à Arduino delay().
Ne pas utiliser de capteurs qui émettent seulement une variable-width pulse, qui s’appelle aussi TTL pulse, comme le Parallax PING et ses semblables, comme le HC-SR04.
Utiliser les méthodes while(), do…while() et for() avec prudence. Si l’exécution du programme est gardée intentionnellement dans une boucle pour une longue durée de temps, assurez vous d’inclure un appel à la méthode
CrcLib::Update()
à l’intérieur pour que les données utilisées par la CrcLib soient rafraîchies assez souvent.
Pourquoi suivre ces règles?
La méthode delay() arrête complètement l’exécution du code pour une durée donnée et c’est une mauvaise chose la plupart du temps. Un code Arduino qui roule la CrcLib devrait, comme la vaste majorité des codes pour microcontrôleurs, toujours passer sur le même cycle d’instructions à une certaine vitesse.
Pour que les méthodes de la CrcLib fonctionnent correctement, la méthode CrcLib::Update()
doit être appelée très, très souvent: toutes les 0 à 10 millisecondes.
D’un certain sens, le fonctionnement de la CrcLib force ses utilisateurs à ne pas se servir de mauvaises habitudes de programmation, l’exemple le plus notable étant le bloquage de l’exécution du programme.
Apprenez comment bien reproduire les fonctionnalités de la méthode Delay() sans que l’exécution de votre code s’arrête. L’analogie de la pizza décrite ici donne un excellent exemple de ce que la méthode delay() fait.
Les capteurs TTL pulse ne marcheront pas pour la même raison mentionnée précédemment. Les Sketch Arduino donnés avec ces capteurs utilisent la méthode native à Arduino pulseIn(), qui se sert pas mal du même arrêt indésirable de l’exécution du code tant que la réponse du capteur est chronométrée.
Exemple de code d’une boucle infinie while() intentionnelle
Une des manières les plus faciles de lancer la partie “roulante” d’un code un certain moment après que le CrcDuino ait été démarré est d’utiliser un bouton qui fait tomber le code dans une boucle infinie.
Ici, le contact Normalement Ouvert d’un bouton, que nous avons appelé BUTTON_LAUNCH_PROGRAM
, a été câblé physiquement pour faire une continuité électrique entre la broche SIG
du port CRC_PWM_1
et une broche GND
. Une mise à terre de la broche fera tomber l’entrée numérique à LOW
comme elle lira 0 Volts. Dès que l’entrée tombe à LOW
, le code entrera dans le condition if(CrcLib::GetDigitalInput(BUTTON_LAUNCH_PROGRAM)==LOW)
, et tombera immédiatement par la suite dans la boucle while(1==1)
. Vu que 1 égalera toujours 1, l’exécution du code ne quittera jamais la boucle while(1==1)
.
L’appel “hors de la boucle” à CrcLib::Update()
permettra de rafraîchir les données tant que le code n’est pas encore rentré dans la boucle while(1==1)
, et l’appel “dans la boucle” s’en chargera quand le code est rendu dans cette partie du programme.
#include <CrcLib.h>
#define BUTTON_LAUNCH_PROGRAM CRC_DIG_1 //Ceci renomme CRC_DIG_1 à BUTTON_LAUNCH_PROGRAM
void setup() {
CrcLib::Initialize();
CrcLib::SetDigitalPinMode(CRC_DIG_1,INPUT);
Serial.begin(2000000);
}
void loop() {
CrcLib::Update(); //Appel hors de la boucle
Serial.println("Out of the loop");
Serial.println(CrcLib::GetDigitalInput(BUTTON_LAUNCH_PROGRAM));
if (CrcLib::GetDigitalInput(BUTTON_LAUNCH_PROGRAM)==LOW) //Le bouton est enfoncé
{
while(1==1)
{
Serial.println("Program executes this loop until board reset or power loss");
CrcLib::Update(); //Appel dans la boucle
//Insérer le code du robot ici.
}
}
}
Articles liés
-
-
Déverminage - Codes d'erreur CrcLib (Système CrcDuino System)
-