Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

Cette page présente de l’information essentielle à propos de CrcLib.

View the english version of this page.

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:

  1. Ne pas utiliser la méthode native à Arduino delay().

  2. Ne pas utiliser de capteurs qui émettent seulement une variable-width pulse, also called qui s’appelle aussi TTL pulse, like the Parallax PING and its knockoffs like the comme le Parallax PING et ses semblables, comme le HC-SR04.

  3. Use Utiliser les méthodes while(), do…while() and et for() functions with caution. If the program execution is intentionally kept for a long time inside a loop, make sure to include a 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() call in it so that data used by CrcLib is correctly refreshed at an appropriate rate.

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.

...

  1. à l’intérieur pour que les données utilisées par la CrcLib sont 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 pin SIG du port CRC_PWM_1 et une pin GND. Une mise à terre de la pin fera tomber l’entrée digitale à 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
languagecpp
#include <CrcLib.h>

#define BUTTON_LAUNCH_PROGRAM CRC_DIG_1    //ThisCeci renamesrenomme CRC_DIG_1 toà BUTTON_LAUNCH_PROGRAM

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 pressedappuyé
  {
    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)
cqllabel = "ar-deverminage"