Bonsoir,
Je suis en train de construire un led globe(POV) compose de 48 led(6 registre a decallage).
je l ai teste avec un code simpliste sans prendre en compte mon capteur effet hall
qui me permet de determiner le temps que dure un tour et j arrive a obtenir mon image non stabilise.
Bref, depuis j essaie d ajoute ce fameux capteur a mon code en utilisant les interruption mais je n arrive pas.
Je sais pas si je procede correctement.
je vous donne mon code :
unsigned char data[516];
int larg = 86;
byte dataPin = 5;
byte clockPin = 6;
byte lockPin = 7;
volatile bool reload = 0;
unsigned long tmpActuel = 0;
unsigned long tmpPreced = 0;
unsigned long tmpPause = 0;
void setup()
{
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(lockPin,OUTPUT);
attachInterrupt(1,interrupt,FALLING);
}
void interrupt()
{
reload = 1;
}
void reloadPauseTime()
{
tmpActuel = micros();
tmpPause = (tmpActuel - tmpPreced) / larg;
tmpPreced = tmpActuel;
reload = 0;
}
void loop()
{
if(reload)
{
reloadPauseTime();
}
int c = 0;
for(int i = 0;i<larg;i++)
{
//digitalWrite(lockPin,LOW);
PORTD = B01000000; //Met lockPin a 0 et laisse clockPin a 1
for(int j = 0;j<6;j++)
{
for(int i = 0;i<8;i++)
{
PORTD = B00000000; //Met clockPin(10) a 0.
if(!(data[c] & (1u << i))) //Si i bit de c = 1.
{
PORTD = B00100000; //Met dataPin(8) a 1.
}
PORTD = B01000000; //Remet clockPin(10) a 1.
}
c++;
}
//digitalWrite(lockPin,HIGH);
PORTD = B11000000; //Remet lockPin a 1 et laisse clockPin a 1
delayMicroseconds(tmpPause);
}
}
OK merci je vais tenter ca.J y avais deja vaguement songe mais j ai lu que l on ne pouvais pas utiliser la fonction micros() dans la fonction d interruption???
unsigned char data[];
int larg;
char dataPin = 5;
char clockPin = 6;
char lockPin = 7;
unsigned long tmpActuel = 0;
unsigned long tmpPreced = 0;
unsigned long tmpPause = 0;
void setup()
{
//DDRD = B11100000;
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(lockPin,OUTPUT);
EIMSK = B00000010;
EICRA = B00001000;
sei();
}
void affichage()
{
int c = 0;
for(int i = 0;i<larg;i++)
{
//digitalWrite(lockPin,LOW);
PORTD = B01000000; //Met lockPin a 0 et laisse clockPin a 1
for(int j = 0;j<6;j++)
{
for(int i = 0;i<8;i++)
{
PORTD = B00000000; //Met clockPin(10) a 0.
if(!(data[c] & (1u << i))) //Si i bit de c = 1.
{
PORTD = B00100000; //Met dataPin(8) a 1.
}
PORTD = B01000000; //Remet clockPin(10) a 1.
}
c++;
}
//digitalWrite(lockPin,HIGH);
PORTD = B11000000; //Remet lockPin a 1 et laisse clockPin a 1
delayMicroseconds(tmpPause);
}
}
ISR(INT1_vect)
{
tmpActuel = micros();
tmpPause = (tmpActuel-tmpPreced) / larg;
tmpPreced = tmpActuel;
affichage();
}
void loop()
{
}
J avais bien compris qu il fallait faire le minimum de chose dans l interruption
J ai pas compris comment tous faire dans la fonction d interruption sans utiliser micro ou delay.
Ok c est bien ce que je m etais dit.
Bon j arrive enfin a avoir quelque chose mais l affichage est trop rapide, l image a l air stable meme si j essaye de ralentir la rotation l image de change pas ca prouve que le capteur remplit son role, le probleme doit se situer dans le calcul.
Je vois pas d ou ca peut venir, je divise le temps d un tour par le nombre de colonne normalement ca devrait fonctionne =(
Edit: J ai inclus une petite marge d erreur a mon calcul et j ai enfin reussi a stabiliser mon image!!!
Un GRAND merci a vous!!!!