Go Down

Topic: Bugs avec mon code (Pov Clock) (Read 976 times) previous topic - next topic

kri13400

Aug 31, 2013, 07:17 pm Last Edit: Sep 01, 2013, 07:58 pm by kri13400 Reason: 1
Salut à tous,
Je poursuis lentement mais surement mon projet d'horloge à persistance rétinienne (circulaire),elle fonctionne parfaitement MAIS:
J'ai fabriqué 2 fonctions (une qui écrit à l'endroit, l'autre à l'envers) qui permettent d'afficher des caracteres avec une variable en parametre. (Si ma variable est égale à 1 j'affiche le nombre 1)
Tout va bien sauf quand je dépasse le nombre de 2*40 if (2* pour mes deux fonctions), là le truc redémarre tout le temps et ne marche plus (j'ai mis un moment à le comprendre d'ailleurs)
A savoir que j'avais commencé par des switch cases et que le résultat était le même...
Je dois ajouter des caracteres et d'autres fonctions pour la paufiner, comment s'y prendre? ou est l'erreur? Limité par la mémoire peut-être?
Quelqu'un a t-il déjà eut ce problème?
HELP! Merci d'avance pour votre aide!

Christian_R

Sans code ni montage ça va être dur de t'aider
Christian

kri13400

#2
Sep 01, 2013, 07:57 pm Last Edit: Sep 01, 2013, 08:08 pm by kri13400 Reason: 1
Merci pour ta réponse, en gros c'est un arduino nano monté sur un ventilateur PC et 8 Leds bleus appelées led0 led1 etc (+3 autre verte blanche et rouge pour le contour, mais elles ne servent pas à l'affichage des caractères, c'est de la déco).
Je procède comme ça: quand ça tourne j'affiche une colonne de 8 "pixels" (j'ai défini un caractère à 8 pixels par 5), je la laisse affichée x microseconde, j' affiche la deuxieme,etc jusqu' à la cinquième et un petit espace pour que les caractères ne soient pas tous collés:

Code: [Select]
boolean TROIS [8][5] = {
 {0,1,1,1,0},
 {1,0,0,0,1},
 {0,0,0,0,1},
 {0,1,1,1,0},
 {0,0,0,0,1},
 {0,0,0,0,1},
 {1,0,0,0,1},
 {0,1,1,1,0},
};


J'appelle ensuite ces tableaux avec cette fontion:

Code: [Select]
void AffColonnes (boolean tab [][5])
 {
  for (j=0; j<5; j++)
   {
       for (i=0; i<8; i++)
         {
           digitalWrite(LED[i] ,tab [i][j]);    
         }
         delayMicroseconds (delai);
   }
     for (i=0; i<8; i++)
     {
       digitalWrite(LED[i] ,initialisation [i]);    
     }
     delayMicroseconds (delai);
 }


Et je me sers de cette fonction dans cette autre fonction:

Code: [Select]
void afficher (int chiffre)
{
   if (chiffre == 0)
   {
       AffColonnes (ZERO);
   }

   else if (chiffre == 1)
   {
       AffColonnes (UN);
   }

     
   else if (chiffre == 2)
   {
       AffColonnes (DEUX);
   }
etc...


Que j'appelle ensuite simplement de cette maniere:

Code: [Select]
  afficher (0);
           afficher (1);
           afficher (2);
           afficher (var);

"L'écran" du coup me permet de débugger puisque je peux afficher des variables...

Voilà en gros... Mon problème survient lorsque je dépasse le nombre de 40 if dans les fonction afficher (il y a une autre fonction afficher qui fait la meme chose mais écrit les caractères à l'envers).
Une fois que j'ai dépassé le nombre de 80 if au total (40 par fonction), au démarrage ça se passe bien jusqu' à l'affichage de l'heure qui se met à planter... (j'ai fait une petite séquence de démarrage avant d'afficher l'heure pour débugger, qui se déroule bien) et ça redémarre...
Si je commente un if dans chaque fonction tout revient à la normale...
Peut-être faut il coder d'une autre maniere? (les switchs cases comme je le disais réagissent exactement pareil)
Voilà en gros si quelqu' un peut m'aider parce que c'est bloquant pour la suite, merci à vous!

fdufnews

Si tu définissais tes caractères dans un seul tableau tu t'éviterais bien des complications.
Actuellement tu codes un caractère sur 40 octets (8 x5) alors que tu pourrais le stocker sur 5 octets
Code: [Select]
boolean TROIS [8][5] = {
  {0,1,1,1,0},
  {1,0,0,0,1},
  {0,0,0,0,1},
  {0,1,1,1,0},
  {0,0,0,0,1},
  {0,0,0,0,1},
  {1,0,0,0,1},
  {0,1,1,1,0},
};


peut être remplacé par
Code: [Select]

  byte TROIS[5]={   // le caractère est tourné d'un quart de tour
     0b01000010,
     0b10001001,
     0b10001001,
     0b10001001,
     0b01110110
};


Ensuite au lieu de faire un million de if ou de case si tu faisais un un tableau de tableau tu pourrais accéder directement à l'élément que tu veux

Code: [Select]
byte carMap[Nb_caracteres][5]={
{
     0b01111110,    // caractère 0
     0b10000001,
     0b10000001,
     0b10000001,
     0b01111110
},
{
     0b00000000,    // caractère 1
     0b00000000,
     0b00000010,
     0b11111111,
     0b00000000
},
...........
{
     0b01000010,    // caractère 3
     0b10001001,
     0b10001001,
     0b10001001,
     0b01110110
},
.........
};


Ensuite tu modifies ta routine d'affichage
Code: [Select]
void AffColonnes (char tab [5])
  {
   for (j=0; j<5; j++)
    {
        for (i=0; i<8; i++)
          {
            digitalWrite(LED[i] ,tab [j]>>i);   
          }
          delayMicroseconds (delai);
    }
      for (i=0; i<8; i++)
      {
        digitalWrite(LED[i] ,initialisation [i]);     <--- je suppose qu'ici tu éteints les LED tu pourrais mettre directement 0
      }
      delayMicroseconds (delai);
  }


Ensuite tu fais
Code: [Select]

void afficher (int chiffre){
      AffColonnes(carMap[chiffre]);
}



Code pas testé et il est tard. Il y a peut être des erreurs mais l'idée est là

kri13400

Salut!
Effectivement l'idée est là!
Je m'étais perdu dans mes millions de if alors qu'il n'y avait aucune utilité sauf pour les chiffres puisque je ne peux appeler un tableau par un chiffre, et pour afficher des variables facilement j'étais obligé de passer par là...
Pour les octets j'ai gardé cette forme en bits pour la lisibilité, je suis encore débutant et j'ai peur de me paumer, mais une fois mon code terminé j'y passerais avec du bitwise et je passerais alors sur un modèle 16 leds RGB.
Du coup j'ai repris tout mon code (environ 2000 lignes à présent), et j'ai put y ajouter des fonctions pour faire des "fondus" avec mon texte, là je bloque un peu mais j'espère trouver des solutions  :~
Dès que tout ça sera acquis je réfléchirais aussi à ton idée de tableaux de tableaux!
Piano piano... ^^ En tout cas un grand merci pour ton aide! ;)

Go Up