Dé électronique

Bonjour,

j’ai ressortie la CNC et le logiciel pour faire des Circuit Imprimé et pour m’y remettre doucement j’ai décider de faire un petit dé électronique.

Je me suis inspiré de montages existants et fait un code tout simple qui fait tourner les 6 combinaisons vite et en ralentissant s’arrête sur le tirage.

Pour finir je transfert cela dans un attiny85 pour faire fonctionner le dé avec une pile bouton 3v.
Tout marche pour le mieux mais et c’est la que j’ai besoin de vos compétences, je suis tombé sur un programme qui permet de faire la même chose mais qui met l’attiny en veille ce qui m’intéresse beaucoup. J’ai donc récupérer le code mais il est fait pour un attiny13 le voici :

//------------------------------
// Dé électronique à ATtiny13
// (C) 2009, Pierre-Yves Rochat
//------------------------------
// Version "EPFL", août 2010

#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

// Nombre de seconde avant le sommeil
#define DelaiSommeil 10

// Paramètre du "Hello":
// Nombre de fois le motif (0 à 7)
#define NbHello 5
// Durée des motifs (autour de 30)
#define DureeHello 30

// Ports utilisée pour les groupes de LED:
#define PortLeds PORTB
#define BitUn PORTB0
#define BitDeux PORTB2
#define BitTrois PORTB4
#define BitSix PORTB1

// Port utilisé pour le poussoir
#define PinPoussoir PINB
#define BitPoussoir PORTB3

// Groupements pour obtenir les chiffres:
#define Un ~(1<<BitUn)
#define Deux ~(1<<BitDeux)
#define Trois ~((1<<BitUn)|(1<<BitTrois))
#define Quatre ~((1<<BitDeux)|(1<<BitTrois))
#define Cinq ~((1<<BitUn)|(1<<BitDeux)|(1<<BitTrois))
#define Six ~((1<<BitDeux)|(1<<BitTrois)|(1<<BitSix))

// autres combinaisons:
#define Zero ~0
#define Sept ~((1<<BitUn)|(1<<BitDeux)|(1<<BitTrois)|(1<<BitSix))
#define	Special ~(1<<BitSix)

// Procédure pour afficher la valeur;
void Affiche (char valeur) {
	PortLeds=Zero;
	if (valeur==1) PortLeds=Un;
	if (valeur==2) PortLeds=Deux;
	if (valeur==3) PortLeds=Trois;
	if (valeur==4) PortLeds=Quatre;
	if (valeur==5) PortLeds=Cinq;
	if (valeur==6) PortLeds=Six;
}

// Procédures pour endormir le processeur
ISR (PCINT0_vect) { // l'interruption termine le mode sleep
	sleep_disable();
}

void Sommeil() {
	PortLeds= Zero;
	PCMSK|=(1<<BitPoussoir); // Pin Change sur PB3
	GIMSK|=(1<<PCIE); // Pin Change Interupt Inable
	sei();
	set_sleep_mode(SLEEP_MODE_PWR_DOWN); // mieux: 3v à 2.5v en 10 sec.
	sleep_enable();
	sleep_cpu(); // on passe en mode sleep.
	// l'interruption le réveillera
}

// Animation de réveil:
void Hello() {
	volatile unsigned int i, j;
	PortLeds=~(1<<BitUn);
	for(i=0; i<10000; i++);

	for(j=0; j<NbHello; j++){
		PortLeds=~(1<<BitDeux);
		for(i=0; i<(DureeHello*100); i++);
		PortLeds=~(1<<BitSix);
		for(i=0; i<(DureeHello*100); i++);
		PortLeds=~(1<<BitTrois);
		for(i=0; i<(DureeHello*100); i++);
	}

}

// Effet lors de l'arrrêt
void Effet (char valeur) {
	volatile unsigned int i;
	PortLeds=Sept;
	for(i=0; i<3000; i++); // suspens
	Affiche (valeur);
}

// Gestion du poussoir, avec sommeil
void GestionPoussoir(unsigned char valeur) {
	volatile unsigned int i;
	unsigned int Minuterie=0;

	Affiche(valeur); // on peut remplacer par Zero pour économier la pile
	for(i=0; i<300; i++); // pour attendre un peu

	while(PinPoussoir&(1<<BitPoussoir)) { // attente que le poussoir soit pressé
		for(i=0; i<(DelaiSommeil*30); i++);
		Minuterie++;
		if (Minuterie==1000) {
			Sommeil();
			Minuterie=0;
			Hello();
		}
		Affiche(valeur);
	}
}



// programme principal
//--------------------
int main(){
	DDRB=(1<<BitUn)|(1<<BitDeux)|(1<<BitTrois)|(1<<BitSix); // sorties
	PORTB=(1<<BitPoussoir); // entrée, avec Pull-up

	Hello();
	while(1){ // boucle sans fin	
		Affiche(1);
		GestionPoussoir(1);
		Affiche(2);
		GestionPoussoir(2);
		Affiche(3);
		GestionPoussoir(3);
		Affiche(4);
		GestionPoussoir(4);
		Affiche(5);
		GestionPoussoir(5);
		Affiche(6);
		GestionPoussoir(6);
	}
}

j’ai donc essayé de l’injecter dans le attiny85 avec un shield avec arduino uno “arduino as isp” attiny85 1 mhz mais le résultat est farfelue et parfois je tombe sur une valeur qui allume les 7 LED ce qui est illogique et surtout le dé ne s’éteind pas et donc ne dois pas ce mettre en veille.

Quand j’alimente le dé il ce lance tout seul tourne et donne un chiffre ensuite après quelques instants un H apparait toutes les leds sont allumées. et ensuite quand je ré appui je tombe toujours sur la même valeur, si j’appui avant que le H apparaisse ça me met n’importe quoi.

Quelqu’un à une idée ?

je précise que le schéma électronique à été vérifié et que cela ne viens pas de la partie électronique avec mon programme de base tout fonctionne parfaitement.