Note |
---|
Cette page présente de l’information essentielle à propos de CrcLib. |
Rules to follow
Make sure to respect the following rules to ensure the proper execution of a code containing CrcLib functions:
...
Do not use the Arduino native delay() function.
...
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()
...
Why follow these rules?
The delay() function stops the code execution for a given time, and most of the time it’s a bad thing. An Arduino code that runs CrcLib should, like the vast majority of micro-controller code, always be looping through a set of instructions at a certain rate.
For CrcLib functions to work correctly, the CrcLib::Update()
function must be called very, very often: every 0 to 10 milliseconds.
In a way, how CrcLib works forces users not to resort to bad programming practices, the most notable being blocking the program execution.
Info |
---|
Learn how to safely reproduce the Delay() function when you don’t want to stop the continuous looping of your code. The pizza analogy described here gives a great exemple of what it’s like to use delay(). |
TTL pulse sensors won’t work for the same reason described above. The Arduino Sketch provided with these sensors use the Arduino native pulseIn() function, which use the basically stops the execution of the code while the sensor response is timed.
Code example of intentional infinite while() loop
One of the easiest way to launch the “running” part of a code some time after the board has been powered up is to use a button that makes the code fall into an infinite loop.
...
à 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.
Info |
---|
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)
condition, and immediately after fall into the , et tombera immédiatement par la suite dans la boucle while(1==1)
loop. Since 1 will always be equal to Vu que 1 égalera toujours 1, the code execution will never leave the l’exécution du code ne quittera jamais la boucle while(1==1)
loop.
The “Out of the loop” call to L’appel “hors de la boucle” à CrcLib::Update()
will allow data refreshing whilst the code has not yet entered the permettra de rafraîchir les données tant que le code n’est pas encore rentré dans la boucle while(1==1)
loop, and the “In loop” call will take care of data refreshing when the code has been trapped inside this part of the code, et l’appel “dans la boucle” s’en chargera quand le code est rendu dans cette partie du programme.
Code Block | ||
---|---|---|
| ||
#include <CrcLib.h> #define BUTTON_LAUNCH_PROGRAM CRC_DIG_1 //ThisCeci renamesrenomme CRC_DIG_1 toà BUTTON_LAUNCH_PROGRAM using namespace Crc; void setup() { CrcLib::Initialize(); CrcLib::SetDigitalPinMode(CRC_DIG_1,INPUT); Serial.begin(2000000); } void loop() { CrcLib::Update(); //OutAppel ofhors thede loopla callboucle Serial.println("Out of the loop"); Serial.println(CrcLib::GetDigitalInput(BUTTON_LAUNCH_PROGRAM)); if (CrcLib::GetDigitalInput(BUTTON_LAUNCH_PROGRAM)==LOW) //TheLe buttonbouton isest pressedenfoncé { while(1==1) { Serial.println("Program executes this loop until board reset or power loss"); CrcLib::Update(); //InAppel dans loopla callboucle //Insert theInsérer le code du robot code hereici. } } } |
Articles liés
Filter by label (Content by label) | ||
---|---|---|
|