Go Down

Topic: Séquence de LED commandée par un registre à décalage 74HC595  (Read 1 time) previous topic - next topic

VicPi

Bonjour,

j'apprends le langage Arduino grâce au livre "le grand livre de l'arduino" et je suis au montage 6.

Il y a quelque chose que je ne comprends pas, je vous montre l'exercice en question avant :

1/
2/

Donc voici mon code :

Code: [Select]
int shiftPin = 8;  //SH_CP
int storagePin = 9;  //ST_CP
int dataPin = 10; //DS
int waitTime = 500;
byte patternDataArray[] = {B1000001, B0100010, B0010100, B0001000, B0010100, B0100010}; //Tableau permettant l'élaboration des différents motifs, il se déroule 3 fois
byte dataLedBlinkArray[] = {B1000000, B0100000, B0010000, B0001000, B0000100, B0000010, B0000001}; //Puis les LED clignotent l'une après l'autre
int i;

void setup() // 3 broches, permettant de contrôlé le registre à décallage, comme sorties
{
  pinMode(shiftPin, OUTPUT);
  pinMode(storagePin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  
}

void loop()
{

  for(int r = 0; r < 3; r++) //l'élaboration des différents motifs, il se déroule 3 fois
  {
    
    for(i = 0; i < 6; i++)
    {
      digitalWrite(storagePin, LOW);
      shiftOut(dataPin, shiftPin, MSBFIRST, patternDataArray[i]);
      digitalWrite(storagePin, HIGH);
      delay(waitTime);
    }
  
  }

  for(int s = 0; s < 7; s++) // Puis les LED clignotent l'une après l'autre
    {
      digitalWrite(storagePin, LOW);
      shiftOut(dataPin, shiftPin, MSBFIRST, dataLedBlinkArray[s]);
      digitalWrite(storagePin, HIGH);
      delay(waitTime);
    }
  
  
}


Lorsque j'utilise MSBFIRST, toutes les LEDs clignotent l'une après l'autre.
Comme le montre cette vidéo à 00:11:

https://www.youtube.com/watch?v=QHYFAH9UiVQ

PROBLEME : En revanche lorsque j'utilise LSBFIRST, la première LED n'allume pas :/ :

https://www.youtube.com/watch?v=qtnv8TS5-3Y


Que faire ? Merci d'avance ! :)


En savoir plus sur l'instruction shiftOut ici : http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ShiftOut

fablath

Bonjour,

Code: [Select]
byte patternDataArray[] = {B01000001, B00100010, B00010100, B00001000, B00010100, B00100010}; //Tableau permettant l'élaboration des différents motifs, il se déroule 3 fois
byte dataLedBlinkArray[] = {B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001}; //Puis les LED clignotent l'une après l'autre


il y a 8 bits dans un byte... donc si tu n'utilise que 7 led le fait d'utiliser LSBFIRST ou MSBFIRST ne peux pas donner le même résultat!

VicPi

D'accord merci bcp !!! Mais pourquoi alors le motif des LEDs marchent normalement alors qu'il y en a que 6 (des motifs) ? :(

fablath

Pour LSBFIRST ou MSBFIRST ce n'est pas le nombre de motif qui compte, qu'il y en ai 1 ou 1000 c'est pareil, la différence c'est l'ordre d'écriture, donc la correspondance entre les bytes écris et le câblage des 74HC595 :

avec 7 leds en sortie du 595,
Code: [Select]

      shiftOut(dataPin, shiftPin, MSBFIRST, B01000000);

et
Code: [Select]

      shiftOut(dataPin, shiftPin, LSBFIRST, B01000000);

ne peuvent pas afficher la même chose!

Branches 8 leds, tu verras mieux la différence!

VicPi

Bizarre..je comprends toujours pas.. :(

Je comprends ton exemple mais toi tu as mis 8 chiffres, alors que moi j'en ai mis 7, comme mon nombre de LEDs. :/

fablath

La taille du byte est fixe : 8 bits, valeur de 0 à 255 :
https://www.arduino.cc/en/Reference/Byte

si tu n'utilise que 7 bits (valeur 0 à 127) la fonction shiftOut() écrira quand même un byte (de 8 bits), la différence entre MSBFIRST et LSBFIRST est que le bit que tu n'utilise pas (qui a donc pour valeur 0) serra envoyé en premier ou en dernier:

VicPi


Go Up