Go Down

Topic: Manipulation de bit dans un octet ?? (Read 1 time) previous topic - next topic

xarolium

Bonjour,

Je recherche un fonction qui me permettrai de faire ce qui suit:

Je test un octet:
  *si un seul Bit  de l octet est a 1
      j envoie la valeur de l'octet
  * si deux Bit de l octet sont a 1
      jenvoi la valeur de l'octet modifier comme suit : si octet = B00100100 jenvoi => B00111100
                                                                       ou si octet = B00010100 j'envoi => B00011100 ...
                                                                      (en fait je veux "combler" les Bits a 0 qui sont entre
                                                                      les deux Bits a 1 de loctet par des 1
* si trois ou plus de bits sont a 1
     ne rien faire



Je sais pas si cela est possible en tout cas j'ai cherche pendant quelque heure et le je suis a bout d'idee
dnoc je fais appelle a vous

merci

skywodd

Bonjour,

Ce petit bout de code devra t'être bien utile. J'ai mis des commentaires si on comprend pas ce que l'on fait ça ne sert à rien ;)

Code: [Select]
/* Fonction de remplissage entre deux bits à 1 si le nombre de bit à 1 = 2 */
byte processValue(byte input){ // argument byte -> sortie byte
  byte nombreOfOne = 0; // variable contenant le nombre de bit à 1
  byte i; // variable d'itération (byte pour economie de ram)

  for(i=0;i<8;i++) // on scan tout les bits
    nombreOfOne += bitRead(input,i); // si bit à on incrémente la variable nombreOfOne

  switch(nombreOfOne){ // selon le nombre de bit à 1 on fait ...

  case 1: // si 1 bit à 1
    return input; // on renvoie telle quel le byte
    break; // et on sort du switch

  case 2: // si 2 bit à 1
    for(i=0;i<8;i++) // on scan tout les bits
      if(bitRead(input,i)){ // si le bit est à 1
        break; // on sort de la boucle -> i contient l'emplacement du 1er "1"
      }

    for(i++;i<8;i++) // on scan les bit aprés le 1er "1"
      if(!bitRead(input,i)) // si le bit est à 0
        bitSet(input,i); // on le met à 1
      else // sinon
        break; // on sort de la boucle

    return input; // on renvoie le byte modifié
    break; // et on sort du switch
  } // si plus de 2 bit à 1 on fait rien
}
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

xarolium

#2
May 29, 2011, 06:01 pm Last Edit: May 29, 2011, 06:09 pm by xarolium Reason: 1
Merci Beaucoup Skywodd
tu mas permis de beaucoup mieux assimile les fonctions bitread and bitset que je n utilisais pas jusque la

merci encore

mais j ai encore un petit problème. Mes Bits sont en fait s des boutons ce qui fait que quand je relâche les deux boutons je repasse instanement a la valeur du dernier boutons que j'aurai relâche ou alors il faut que je les relâche  simultanément ce qui est quasi impossible

skywodd

J'essaye de m'imaginer le montage mais j'ai du mal XD en gros tu a 8 boutons poussoir, chacun correspondant à un bit de ton octet ?
En faite ton problème ce situe dans la gestion de l'état de tes boutons ?

Je doit avouez que sans un petit schéma et un début de code je vois mal comment t'aider ;)
Ce serai bien d'avoir ton morceau de code histoire de voir comment régler ce problème.
Si c'est juste un problème de temporisation / gestions des boutons ça devrait être facilement réglable.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

xarolium

#4
May 30, 2011, 08:52 am Last Edit: May 30, 2011, 08:57 am by xarolium Reason: 1
En fait le schéma est super simple:

J'ai 8 boutons relier a un Shift register 4021  => forme mon octet de donnée d'entrée
et 8 led relier a un shift register hc595 => forme mon octet de donnee de sortie

voila un bout de mon programme qui fonctionne tres bien sauf que quand je relache les deux boutons si je ne le fais pas simultanement je repasse en sorti automatiquement sur le valeur du dernier bouton apuyer

Code: [Select]
//Checker l'octet en entree
   PreValeurOctet = ValeurOctet;
   
   
   digitalWrite(latchPinIn,1);// On met le 4021 en mode lecture
   delayMicroseconds(20);
   digitalWrite(latchPinIn,0); 
   ValeurOctet= shiftIn(dataPinIn, clockPinIn);// on stock l octet dans une variable
 
 
   // si il y a eu un changement
     if (PreValeurOctet != ValeurOctet || PreValeurOctet1 != ValeurOctet1){
     
     byte nombreOfOne = 0; // variable contenant le nombre de bit à 1
     byte i; // variable d'itération (byte pour economie de ram)
         
      for(i=0;i<8;i++){ // on scan tout les bits
        nombreOfOne += bitRead(ValeurOctet,i); // si bit à on incrémente la variable nombreOfOne
      }
      switch(nombreOfOne){ // selon le nombre de bit à 1 on fait ...

        case 1: // si 1 bit à 1
         StateValeurOctet = ValeurOctet; // on renvoie telle quel le byte
         break; // et on sort du switch
     
        case 2: // si 2 bit à 1
          for(i=0;i<8;i++){ // on scan tout les bits
            if(bitRead(ValeurOctet,i)){ // si le bit est à 1
              break; // on sort de la boucle -> i contient l'emplacement du 1er "1"
            }
          }
          for(i++;i<8;i++){ // on scan les bit aprés le 1er "1"
            if(!bitRead(ValeurOctet,i)){ // si le bit est à 0
              bitSet(ValeurOctet,i); // on le met à 1
            }
            else // sinon
            break; // on sort de la boucle
          }
       StateValeurOctet = ValeurOctet  ; // on renvoie le byte modifié
       break; // et on sort du switch
      } // si plus de 2 bit à 1 on fait rien
    }
SendToLed (StateValeurOctet);

Go Up