Pages: [1]   Go Down
Author Topic: [Résolu] Problème lors de l'appel d'une fonction dans la compilation  (Read 742 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut à tous!

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


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:
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:
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:
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:
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:
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.

« Last Edit: October 12, 2011, 01:33:11 pm by schizophrene » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

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

Code:
void lireLettre(byte *Hlettre, int HPLEIN );
faut pas oublier l'étoile.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Merci skywodd!
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

peut-être un soucis de rafraichissement (affiche un caractère "vide" entre chaque lettre, pour vérifier)
Logged

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink )

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 ?
« Last Edit: October 12, 2011, 04:07:19 am by taddot » Logged

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley)

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

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

donc un ch'ti "résolu" ?
Logged

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui oui, résolu (déjà mis dans le titre du topic)! smiley

Et merci pour les suggestions, qui m'ont surtout fait voir mes erreurs ou mes oublis... smiley-kitty
« Last Edit: October 13, 2011, 04:57:16 am by schizophrene » Logged

Pages: [1]   Go Up
Jump to: