Décodage language Arduino

Bonjour

Je suis sur un projet de treuil avec un moteur pas a pas qui doit se dérouler et se réenrouler d'un nombre de tour donné par un encodeur rotatif.
Mes connaissances en programmation sont limitées, et je bute sur le déchiffrage d'un code qui pourrait m'aider.

Pouvez vous m'expliquer cette fonction?

void ICACHE_RAM_ATTR enc_read()
{
  uint8_t current_data = digitalRead(DT) << 1 | digitalRead(CLK);
 
  if( current_data == previous_data )
    return;
 
  if( bitRead(current_data, 0) == bitRead(previous_data, 1) )
    quad -= 1;
  else
    quad += 1;
  previous_data = current_data; 
 
}
 
int8_t encoder_update(void)
{
  int8_t val = 0;
  while(quad >= 4){
    val += 1;
    quad -= 4;
  }
  while(quad <= -4){
    val -= 1;
    quad += 4;
  }
  return val;
}

Merci pour votre aide :slight_smile:

Il s'agit de code ESP8266, et non pas ARDUINO.

ICACHE_RAM_ATTR indique qu'il s'agit d'une routine d'interruption, apparemment déclenchée par une horloge.
Si la pin data a changé de valeur quad est décrémenté ou incrémenté.
encoder_update apparemment récupère la valeur de quad, en divisant par quatre.

Bonjour ! je n'utilise jamais de moteurs, donc ma réponse ne sera pas très précise

void ICACHE_RAM_ATTR enc_read()
{
  uint8_t current_data = digitalRead(DT) << 1 | digitalRead(CLK);
 
  if( current_data == previous_data )
    return;
 
  if( bitRead(current_data, 0) == bitRead(previous_data, 1) )
    quad -= 1;
  else
    quad += 1;
  previous_data = current_data;
 
}

ca c'est la fonction de lecture de la position moteur
L' état du capteur est lu si la lecture est possible (digitalRead(DT) << 1 ) ou alors un backup timé ailleurs dans le code digitalRead(CLK). Enfin, j'interprète çà il faudra aller regarder ailleurs dans le code pour voir à quoi servent DT et CLK, mais çà me semble être çà.

Si la data lu est le même que le précédent, alors on ne fait rien, on sort de cette fonction, toutes les instructions après ne sont pas exécutées

if( current_data == previous_data )
   return;

Sinon:
Si le bit lu est égal au bit lu une position précédente on retranche 1 à la position moteur. sinon on rajoute 1. on fait un back up de la position actuelle dans la position précédente

if( bitRead(current_data, 0) == bitRead(previous_data, 1) )
   quad -= 1;
 else
   quad += 1;
 previous_data = current_data;
int8_t encoder_update(void)
{
  int8_t val = 0;
  while(quad >= 4){
    val += 1;
    quad -= 4;
  }
  while(quad <= -4){
    val -= 1;
    quad += 4;
  }
  return val;
}

Pour la mise à jour de l'encoder, ces 2 boucles permettent de calculer la valeur à renvoyer à partir de quad qui a été lue dans la première fonction.

Merci à tous pour vos lumières

DT et CLK font référence aux bornes du Data et du poussoir du codeur rotatif .

Que signifie " << 1 " et " | " dans cette ligne de code ?

 uint8_t current_data = digitalRead(DT) << 1 | digitalRead(CLK);

je n'ai pas trouvé cette syntaxe :o

Bonsoir

Un petit résumé du langage C ne serait pas de trop !! ça se trouve en quantité sur la toile !!

voir par exemple içi la catégorie des opérateurs bit à bit :

http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceEtendue