Go Down

Topic: Pb de latence en charliplexing (Read 753 times) previous topic - next topic

melka

Bonsoir tout le monde
J'ai monté une matrice de 20 leds (4x5) en utilisant le charliplexing.



et voilà le code :
Code: [Select]
int nbPins = 5;
int nbLeds = nbPins*(nbPins-1);
int pins[] = {8,9,10,11,12};

int leds[20][5] = {   // DECLARATION DES PINS POUR CHAQUE LED : 0 = OUTPUT LOW, 1 = OUTPUT HIGH, 2 = INPUT
 //1
 {1,0,2,2,2},
 {0,1,2,2,2},
 {1,2,0,2,2},
 {0,2,1,2,2},
 //2
 {2,1,0,2,2},
 {2,0,1,2,2},
 {2,2,1,2,0},
 {2,2,0,2,1},
 //3
 {2,2,1,0,2},
 {2,2,0,1,2},
 {2,0,2,2,1},
 {2,1,2,2,0},
 //4
 {2,2,2,1,0},
 {2,2,2,0,1},
 {2,1,2,0,2},
 {2,0,2,1,2},
 // 5
 {0,2,2,2,1},
 {1,2,2,2,0},
 {0,2,2,1,2},
 {1,2,2,0,2}
};

void setup() {
pinMode(13,OUTPUT);     // VOYANT DE FONCTIONNEMENT
digitalWrite(13, HIGH);
}

void light(int led) {
 for (int j=0;j<nbPins;j++) {
   switch (leds[led][j]) {
     case 0 :
       pinMode(pins[j],OUTPUT);
       digitalWrite(pins[j],LOW);
       break;
     case 1:
       pinMode(pins[j],OUTPUT);
       digitalWrite(pins[j],HIGH);
       break;
     case 2:
       pinMode(pins[j],INPUT);
       break;
   }    
 }
}

void loop() {
 light(2);
}


Je peux sans pb allumer chaque led indépendamment en appellant light(ledID).

Mon problème vient du fait que si je fais une boucle du style :
Code: [Select]

void loop() {
  light(2);
  delay(20ms);
  light(5);
  delay(20ms);
}


Je vais me retrouver avec une led autre que la 2 ou 5 qui "clignote" faiblement, comme si j'avais fait un analogWrite(pin,10); sur une pin qui à une PWM...

Je pense que cela est du au fait que entre la led 2 et la 5, on a delai d'execution pour switcher les 5 pins en output low/output high/input, et je me retrouve pendant un temps très court avec une configuration des pins du style :
{0,1,1,2,2}, donc deux pins en output high (par exemple) > deux leds allumées en même temps.

Auriez vous une idée de comment "gommer" ce delai ?

Merci ^^

melka
http://melka.one.free.fr/blog/
http://www.flickr.com/photos/melkaone/

Go Up