Go Down

Topic: 74HC595 newbie perdu (Read 3711 times) previous topic - next topic

Moilion


Moilion

Lorsque je fais ceci:

//installation des broches allant du 75HC595 à l'arduino
int SER_Pin = 8;   //pin 14 on the 75HC595
int RCLK_Pin = 9;  //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 11 on the 75HC595





byte etatReg=0;   // <--- variable globale

const byte LedVerte=B00000001; // définition d'une sortie du registre à décalage
const byte LedOrange=B00000010;
const byte LedRouge=B00000100;

/*
   Si on doit changer plusieurs sorties en même temps
   on peut appeler setOuput plusieurs fois de suite
   on ne lance qu'une fois writeRegisters
*/

/* setOutput(byte pin, byte state)
      Positionne la sortie n° pin du registre à la valeur state
      state = 0 on éteind
      state <> 0 on allume
*/
void setOutput(byte pin, byte state){
   byte mask;
   
   mask=1 << pin; // décale le bit à la position occupée par la sorie à changer
   if (state){      // si state est différent de zéro on allume
      etatReg |= mask;
   }else{         // si state==0 on éteind
      etatReg &= ~mask;
   }
   writeRegisters(etatReg);
}

// writeRegisters(byte valeur)
//Transfère valeur dans un registre à décalage
//   Note: on suppose qu'il n'y a qu'un registre à décalage
//   donc la boucle va de 0 à 7

void writeRegisters(byte valeur){
byte tampon;

  tampon = valeur;
  digitalWrite(RCLK_Pin, LOW);

  for(int i = 7; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);

    digitalWrite(SER_Pin, tampon);
    digitalWrite(SRCLK_Pin, HIGH);
   tampon >>= 1;

  }
  digitalWrite(RCLK_Pin, HIGH);

}

void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
}

void loop(){
 
  setOutput (LedVerte,0);
  delay (500);
  writeRegisters;
setOutput (LedVerte,1);
  delay (500);
  writeRegisters;
  setOutput (LedOrange,1);
  writeRegisters;








Les Leds sorties de Q4 à Q8 s'allument normalement, mais aucune ne clignote, si j'ai bien compris le code, normalement une des deux sorties devraient clignoter...

fdufnews

#17
May 31, 2013, 09:45 pm Last Edit: May 31, 2013, 09:46 pm by fdufnews Reason: 1
Code: [Select]
void loop(){

 setOutput (LedVerte,0);
 writeRegisters(etatReg);  // tu n'avais pas mis l'argument à l'appel de cette fonction
 delay (500);
 setOutput (LedVerte,1);
 writeRegisters(etatReg);  // tu n'avais pas mis l'argument à l'appel de cette fonction
 delay (500);
 setOutput (LedOrange,1);
 writeRegisters(etatReg);  // tu n'avais pas mis l'argument à l'appel de cette fonction
}


D'autre part j'ai fait une petite erreur. Je ne voulais pas mettre writeRegisters dans cette fonction pour ne pas ralentir l'exécution si on appelait plusieurs fois de suite setOutput
Code: [Select]
void setOutput(byte pin, byte state){
byte mask;

mask=1 << pin; // décale le bit à la position occupée par la sorie à changer
if (state){ // si state est différent de zéro on allume
etatReg |= mask;
}else{ // si state==0 on éteind
etatReg &= ~mask;
}
                                             // <--- j'ai supprimé writeRegisters(etatReg);
}


Maintenant tu peux aussi ajouter quelques Serial.print dans les principales fonctions pour voir ce qui se passe et comprendre pourquoi le logiciel ne fonctionne pas comme attendu

skywodd

Bonjour,

J'ai l'impression que vous vous cassez la tête pour pas grand chose.

En reprenant le code du post ci dessus, mais en plus simple :
Code: [Select]
const byte SER_PIN   = 8;
const byte RCLK_PIN  = 9;
const byte SRCLK_PIN = 10;

Tout d'abord les numéros de broches doivent être constants, de préférence de type byte et en majuscule (par convention, c'est plus simple à lire).

Code: [Select]
const byte LED_VERTE  = B00000001;
const byte LED_ORANGE = B00000010;
const byte LED_ROUGE  = B00000100;

De même pour tes constantes perso.

Code: [Select]
void setup() {
  pinMode(SER_PIN, OUTPUT);
  pinMode(RCLK_PIN, OUTPUT);
  pinMode(SRCLK_PIN, OUTPUT);
}

La partie setup() reste inchangée.

Code: [Select]
inline void ledShiftOut(byte val) {
  digitalWrite(RCLK_Pin, LOW);
  shiftOut(SER_PIN, SRCLK_PIN, MSBFIRST, val);
  digitalWrite(RCLK_Pin, HIGH);
}

Histoire de rendre les choses plus simple pourquoi ne pas utiliser la fonction Arduino shiftOut() tout prête ?
Pour rendre les choses encore plus simple on peut même l'englober dans une fonction avec les deux digitalWrite() pour le latch.
http://arduino.cc/en/Reference/ShiftOut

Code: [Select]
void loop(){
  static byte val = 0;
 
  bitWrite(val, LED_VERTE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ORANGE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ROUGE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_VERTE, 0);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ORANGE, 0);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ROUGE, 0);
  ledShiftOut(val);
  delay (500);
}

Par la suite dans ton loop() tu peut faire ce que tu veut avec tes leds.
(ici c'est un simple chenillard avec 3 leds)

2 astuces sont utilisées dans loop()
bitWrite() pour "écrire" un bit : http://arduino.cc/de/Reference/BitWrite
"static" : pour éviter une variable globale inutile (en fait cette variable se comporte comme une variable globale mais n'est accessible que depuis la fonction en question).

Le code complet :
Code: [Select]
const byte SER_PIN   = 8;
const byte RCLK_PIN  = 9;
const byte SRCLK_PIN = 10;

const byte LED_VERTE  = B00000001;
const byte LED_ORANGE = B00000010;
const byte LED_ROUGE  = B00000100;

inline void ledShiftOut(byte val) {
  digitalWrite(RCLK_Pin, LOW);
  shiftOut(SER_PIN, SRCLK_PIN, MSBFIRST, val);
  digitalWrite(RCLK_Pin, HIGH);
}

void setup() {
  pinMode(SER_PIN, OUTPUT);
  pinMode(RCLK_PIN, OUTPUT);
  pinMode(SRCLK_PIN, OUTPUT);
}

void loop(){
  static byte val = 0;
 
  bitWrite(val, LED_VERTE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ORANGE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ROUGE, 1);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_VERTE, 0);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ORANGE, 0);
  ledShiftOut(val);
  delay (500);
 
  bitWrite(val, LED_ROUGE, 0);
  ledShiftOut(val);
  delay (500);
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up