Problème avec les sorties du registre de décalage.

Hello
Je fait un petit blocage depuis midi !

L’idée est de faire un petit dé avec un registre de dé. Le problème c’est que les LEDs ne s’allume pas correctement! Côté circuit, j’ai vérifié plusieurs fois et les branchements sont ok.

Côté programme, j’ai l’impression qu’il n’y a pas d’erreur, mais je ne suis pas certain.

Par exemple quand j’ai 4, j’ai les serties Q1, Q2, Q3 et Q7 en HIGH alors qu’il devrait avoir Q1, Q2, Q6 et Q7 (0x63 = 0110 0011)

/*

-- Déscription --
Création d'un dé.
Chaque led est directement raccordé à une sortie du registre de décalage 74HC595.
L'appui sur le bouton fait défiler des nombres aléatoire.
Une fois le bouton lâcher. Le nombre s'affiche.

-- info led --

6 		7
3	4	5
1 		2

-- Sortie Registre --

Vide	Q0
Led 1 	Q1
Led 2	Q2
Led 3	Q3

Led 4	Q4
Led 5	Q5
Led 6	Q6
Led 7 	Q7

*/

#define WAITTIME 30

// Register pin
int dataPin 	= 8;	// DS 		SER
int shiftPin	= 9;  	// SH_CP 	RCLK
int storagePin	= 10;	// ST_CP 	SRCLK
// Button
int buttom	= 7;


void setup() {
	// Initialize register pin
	for(int i=8; i<11; i++){
	    pinMode(i, OUTPUT);
	}
	// Initialize buttom pin
	pinMode(7, INPUT);

}

void loop() {
	// Detects buttom presse
	if(digitalRead(buttom) == HIGH){
	    displayLed(random(1, 7));
	}
}

void displayLed(int value){

	// Activation du stockage
	digitalWrite(storagePin, LOW);

	// Détermine la combinaison des LEDs
	switch (value) {
		// Allumager la LED Q4
		case 1 :
			shiftOut(dataPin, shiftPin, LSBFIRST, 0x8);
		break;

		// Allumer les LEDs 1+7 ou 2+6
		case 2 :
			shiftOut(dataPin, shiftPin, LSBFIRST, 0x22);
		break;

		// Alumage des LEDs 1+4+7 ou Q2 Q4 Q6
		case 3 :
	    shiftOut(dataPin, shiftPin, LSBFIRST, 0x2A);
	    break;
		
		// Allumage des LEDs Q1 Q2 Q6 Q7
	    case 4 :
	    shiftOut(dataPin, shiftPin, LSBFIRST, 0x63);
	    break;

	    // Allumage des LEDs Q1 Q2 Q4 Q6 Q7
	    case 5 :
	    shiftOut(dataPin, shiftPin, LSBFIRST, 0x6B);
	    break;

	    // Allumage des LEDs sur Q1 Q2 Q3 Q5 Q6 Q7
	    default:
	    shiftOut(dataPin, shiftPin, LSBFIRST, 0x77);
	}

	// Passer les valeurs dans le second registre.
	digitalWrite(storagePin, HIGH);
	delay(WAITTIME);
}

Est ce que tu as essayé les cas 1 par 1 sans chercher à faire défiler où à utiliser un bouton ?

C'est ce que je ferais avec un une suite de programmes, un par cas, les plus rudimentaires possible et en vérifiant au voltmètre l'état de toutes les sorties du RAD même celle qui ne servent pas. Cela sera plus simple à contrôler. Et si c'est bon c'est que l'erreur sera dans le programme.

Oui et j'ai les même problème en enlevant tout les case et en laissent seulement le default.

Si je veux allumer le chiffre 6 soit Q1, Q2, Q3, Q5, Q6 et Q7, j'ai Q1, Q2, Q3, Q4, Q6 et Q7 qui passe a HIGN.

Alors que les LEDs sont connecter dans le bon ordre.

shiftOut(dataPin, shiftPin, LSBFIRST, 0x77);

Active bien les sorties Q1, Q2, Q3, Q5, Q6 et Q7?

La meilleure méthode que je connaisse pour découvrir les erreurs c'est de faire des opérations de plus en plus simple. Essaye d'envoyer le code qui devrait aller bien pour allumer une seule del et compare le résultat, tu as peut être une confusion entre LSB et MSB --> je dis ça mais c'est une idée comme une autre, je ne rentre pas dans ton code.

Je viens de trouver! j’avais le Vcc sur du 3v3 et non sur du 5v. C’est bizarre que sur du 3v3 il ne fonctionne pas vu que dans le datasheet, il est écrit qu’il peut fonctionner entre -0.5 et +7v

Tu devrais lire les datasheets des composants que tu utilises : il y a des explications bien utiles. En mettant du 5 V sur une entrée du circuit CMOS alimenté en 3,3 V tu peut dire merci aux diodes de protection contre les décharges électrostatiques (ESD) qui on évité que le circuit entre en "lach-up" ce qui se termine généralement par sa destruction.

Ces diodes de protection montées en inverse ne figurent pas sur les schémas fonctionnels puisque qu'elle n'interviennent pas sur le fonctionnement mais elles sont souvent citées à l'intérieur de la datasheet. Avec 5 V sur une entrée tu as mis la diode supérieure en polarisation directe.