Go Down

Topic: [Résolu] Problème lors de l'appel d'une fonction dans la compilation (Read 935 times) previous topic - next topic

schizophrene

Oct 10, 2011, 07:00 pm Last Edit: Oct 12, 2011, 08:33 pm by schizophrene Reason: 1
Salut à tous!

Alors tout d'abord, je remercie B@tto, il saura pourquoi :)


Mon soucis du jour... :

J'utilise un TLC5940 pour mon projet (disposition en 3*5, mais pas en matrice), et m'est venue l'idée de créer un fonction permettant de lire des lettres (même si ce n'est pas le but premier).

J'ai donc créé le prototype de ma fonction dans un fichier .h:
Code: [Select]
void lireLettre(byte Hlettre, int HPLEIN );
(où 'Hlettre' est la lettre à lire, et 'HPLEIN' la valeur PWM pour le TLC5940)

et l'implémentation de cette fonction dans un fichier .cpp:
Code: [Select]
void lireLettre(byte Hlettre[], int HPLEIN)
{
 int Hi;
 for (Hi = 0; Hi < 15; Hi++)
 {
   if (Hlettre[Hi] == 1)
   {
     Tlc.set(Hi,HPLEIN);
     Tlc.update();
   }
 }
}


La définition d'une lettre est de ce type:
Code: [Select]
extern byte A[15] = {1,1,1,1,1,1,0,1,0,0,1,1,1,1,1};
(où 1 = led allumée, 0 = led éteinte)


Les instructions de la fonction fonctionnent parfaitement quand je ne mets que ça dans un sketch, pas de problème de ce côté-ci.

Par contre, en prototypant ma fonction et les tableaux 'lettre', en appelant dans mon code de cette façon: "lireLettre(A,PLEIN);", j'obtiens cette erreur:
Code: [Select]
Projet_X_1_0.cpp: In function 'void loop()':
Projet_X_1_0:55: error: invalid conversion from 'byte*' to 'byte'
Projet_X_1_0:55: error: initializing argument 1 of 'void lireLettre(byte, int)'


Si j'écris l'appel de fonction comme-ci: "lireLettre(*A,PLEIN);", j'obtiens ça:
Code: [Select]
Projet_X_1_0.cpp.o: In function `loop':
C:\Users\SCHIZO~1\AppData\Local\Temp\build716184740382005681.tmp/Projet_X_1_0.cpp:59: undefined reference to `lireLettre(unsigned char, int)'



Quelqu'un à une idée à me proposer pour remédier à ce problème? Merci d'avance.


skywodd

Bonjour,

Il y a une petite erreur dans le prototype c'est tout.

Code: [Select]
void lireLettre(byte *Hlettre, int HPLEIN );
faut pas oublier l'étoile.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

schizophrene

Arf, pas pensé à tester ça! Je le ferai tout à l'heure ou demain :)

Merci skywodd!

schizophrene

Bon, en fait dans mon prototypage, j'avais oublié les crochets pour la variable 'Hlettre' ...
Mais ta solution fonctionne aussi skywodd :)

Par contre, dans les 2 cas, l'affichage de mes lettres ne se fait pas correctement! Pas pour toutes, mais toujours les mêmes...
Et ce n'est que quand je fais plusieurs appels de la fonction, pour afficher un mot.
Sinon, avec un seul appel de la fonction dans le sketch, la lettre s'affiche correctement.

taddot

peut-être un soucis de rafraichissement (affiche un caractère "vide" entre chaque lettre, pour vérifier)
pas taper... sauf application de l'article 35 ...

schizophrene

C'est pas entre les caractères que ça me posait un problème, mais dans la fonction 'lireLettre' elle-même: J'ai dû rajouter un delay() de 1ms après chaque écriture (Tlc.update()) sur une sortie.

J'ai encore un problème avec 3 lettres, (i,t et y), qui ne s'affichent pas correctement... alors qu'elles sont correctement définies dans mes tableaux!

taddot

#6
Oct 12, 2011, 11:02 am Last Edit: Oct 12, 2011, 11:07 am by taddot Reason: 1
question con : si tu mets le délay à 2 ms (ou même 5, histoire de tester) ?
As-tu essayé d'afficher un caractère vide entre chaque caractère ? (avec delay 1 ms et sans délay du tout) ? Essaie, ça va te prendre 5 minutes, et peut-être que la solution est là.

Ce qui est bizarre, c'est le pb avec le "y", car autant le "i" et le "t" peuvent partager un nombre de leds en commun important, autant avec le y, doit pas y avoir plus que 2 ou 3 leds ?

Si tu pouvais nous montrer à quoi ressemble les défauts... (désolé, je suis très visuel ;) )

remarque :
si je lis bien ta fonction, tu allumes la led si elle est défini comme allumée dans le caractère que tu passe en paramètre. Mais où est-il mentionné que tu l'éteins ? Deuxième remarque : pourquoi ne pas mémoriser l'état de chaque led dans un tableau, et à chaque nouvelle lettre, ne changer que l'état des leds qui sont modifiées ?
pas taper... sauf application de l'article 35 ...

schizophrene

Hello!

J'ai essayé de monter le delay jusqu'à 10ms, pas de changement notable.
J'ai, entre chaque lettre, intercalé un Tlc.clear (remet toutes les sorties du TLC5940 à zéro) et un delay de 10ms, pas de changement notable.
J'ai aussi essayé de l'intercaler avant la boucle for dans ma fonction, pas plus de changement.

Mais la bonne remarque tu me fais, c'est que je n'éteins pas led qui doit rester éteinte.
J'y avais pensé dès le début, mais le peu de programmation que je peux faire ces derniers temps m'a fait oublier cette option, que je testerai ce soir.

Sinon, le fait de comparer avec l'état précédent des leds est une autre bonne idée, peut-être avec un peu plus de programmation à faire (mais ça, c'est loin d'être le problème :))

Si j'ai le temps, je ferais une petite vidéo.

Merci pour ces suggestions, je te tiens au courant de l'avancement.

schizophrene

Hello!

Bon, en fait hier soir j'avais déjà modifié ma fonction pour écrire 0 (éteindre) les leds concernées quand elles doivent l'être. Mais... j'avais oublié de rajouter le delay de 1ms dans cette partie...

Du coup, le code de ma fonction devient:
Code: [Select]
void lireLettre(byte Hlettre[], int HPLEIN)
{
  int Hi;
  for (Hi = 0; Hi < 15; Hi++)
  {
    if (Hlettre[Hi] == 1)
    {
      Tlc.set(Hi,HPLEIN);
      Tlc.update();
      delay(1);
    }
    else
    {
      Tlc.set(Hi,0);
      Tlc.update();
      delay(1);
    }
  }
}

et elle fonctionne parfaitement :)

taddot

pas taper... sauf application de l'article 35 ...

schizophrene

#10
Oct 13, 2011, 11:55 am Last Edit: Oct 13, 2011, 11:57 am by schizophrene Reason: 1
Oui oui, résolu (déjà mis dans le titre du topic)! :)

Et merci pour les suggestions, qui m'ont surtout fait voir mes erreurs ou mes oublis... ^_^

Go Up