Pages: [1]   Go Down
Author Topic: Manipulation de bit dans un octet ??  (Read 1225 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Code:
/* 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
}
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 29, 2011, 11:09:50 am by xarolium » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'essaye de m'imaginer le montage mais j'ai du mal smiley-lol 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 smiley-wink
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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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);
« Last Edit: May 30, 2011, 01:57:46 am by xarolium » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Met en place un debounce pour vérifier que le changement d'état est durable.

après
Code:
ValeurOctet= shiftIn(dataPinIn, clockPinIn);
if (PreValeurOctet != ValeurOctet || PreValeurOctet1 != ValeurOctet1){
ajoute
Code:
while(PreValeurOctet != ValeurOctet){ // si il y a du changement
PreValeurOctet = ValeurOctet; // on mémorise la valeur précédente
ValeurOctet = shiftIn(dataPinIn, clockPinIn); // on obtient la valeur actuelle
delay(100); // on attend un peu histoire de laisser un possible changement ce faire
} // le programme boucle tant qu'il y a du changement une fois fini ValeurOctet contient la valeur binaire "stable" (si aucune variation après 100ms)

C'est juste une idée pas sur que cela marche directe mais ça devrait être un bon début d'idée.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Skywodd pour ton aide

J'ai trouvé une autre solution que d'utiliser un délai
en fait ce que je voulais c'est que le changement s'effectue a chaque passage de l 'état 0 a l’état 1 ou 2 boutons appuyer et je me suis débrouillé  avec ça

La fonction délai me posait quelques problèmes car mon projet est un séquenceur et que je ne maitrise pas le trop le temps
« Last Edit: May 31, 2011, 11:56:29 am by xarolium » Logged

Pages: [1]   Go Up
Jump to: