Ecrire pour un afficheur LCD [ Divers / C ] - C - Programmation
Marsh Posté le 27-10-2011 à 17:10:54
Ben comme les erreurs sont manifestement dans "./at89x51.h"
comment répondre sans voir ce fichier?
A+,
Marsh Posté le 27-10-2011 à 17:47:28
Oui, mais ça ne nous dit pas comment tu relies ça à quelque chose que tu commandes et qui lui envoie un signal sur ses pins.
A+,
Marsh Posté le 27-10-2011 à 17:57:03
Ah, pardon,
J'ai connecté l'afficheur au port parallèle d'un Compatible IBM PC selon le schéma donné dans le Linux magasine N°8, comme suit :
Afficheur port parallèle
pin 1 => broche 24 GND
pin 2 => +5volt
pin 3 => unused
pin 4 => broche 17
pin 5 => broche 24 GND
pin 6 à 14 => broche 1 à 9
Merci Gilou.
Marsh Posté le 27-10-2011 à 18:16:35
Donc il va falloir que tu transposes ça (les commandes pour l'afficheur) en commandes positionnant le registre du port parallèle.
Si tu es sous Linux, faut peut être voir du coté de parapin pour avoir une librairie prête à l'emploi.
A+,
Marsh Posté le 27-10-2011 à 18:33:49
Ca correspond pas au Datasheet: il y a 16 pins, et le pin 5, je suis pas sur qu'il faille le mettre à GND (si tu lis jamais les flags et les valeurs mémoire de l'afficheur, c'est sans doute bon, mais la dans le code en exemple, c'est testé (les flags) dans LCD_busy(), mais il y a une méthode sans aussi, et donc j'ai un doute). Les pins 15 et 16, c'est le courant pour les LEDs, tu as relié ça ailleurs, c'est pour ça que tu en parles pas?
Tel que je vois les choses, il est logique d'associer les pins 2-9 (bidirectionnels) du port parallèle à DB0-DB7, donc aux pins 7-14 de l'afficheur.
Pour RS, R/W et E on n'a besoin que de la direction en output, donc on devrait associer trois des pins 1, 14, 16 ou 17 à RS, R/W et E, donc aux pins 4, 5 et 6 de l'afficheur (tu as associé RS au pin 17 du port parallèle, et E au port 1 du PP, mais il semblerait logique d'associer R/W au port 14 ou 16 du PP plutôt au'au 24 (GND))
A+,
Marsh Posté le 27-10-2011 à 18:52:49
Les 15 et 16 c'est pour le rétro- éclairage, ça ça fonctionne.
Pour le 5, il est connecté avec le 1 à la broche 24 ; Broche qui devrait être la masse si je me trompe pas.
C'est le schéma donné pas Linux mag pour un afficheur à base de micro- contrôleur HD44780.
Mais c'est pas le même que j'ai apparemment, et effectivement en regardant le datasheet, ça à pas l'air d'être ça.
Si c'est juste un problème de connection c'est bien, parce-que j'ai un bout de code, que je donne tiens.
Code :
|
Du coup, je la branche où la pin 5 ?
edit, correction des fautes dans le code.
Marsh Posté le 27-10-2011 à 19:02:35
Je t'ai répondu dans un ajout à mon post tu la branche sur la 14 ou la 16 du PP pour pouvoir y écrire, vu que quand le signal y est à 1, ca indique un mode en lecture (utile pour lire le flag et savoir quand l'afficheur est près a accepter une nouvelle commande).
Ou bien tu la laisse comme elle est, et tu utilises un délai fixe entre chaque commande, c'est moins optimal, mais peut être plus simple.
A+,
Marsh Posté le 27-10-2011 à 19:10:20
D'abord merci Gilou.
gilou a écrit : |
Ok, ça, c'est ce qui est fait.
gilou a écrit : |
Ok, je vais faire ça... La pin 5 sur la broche 14 du port parallèle.
Après faut voir pour le code qui va avec, si on peut ajuster le code ci-dessus, ce serait pas mal.
Marsh Posté le 27-10-2011 à 19:15:04
Dans le code que tu donnes (j'ai pas été vérifier la validité des commandes), les usleep(1) semblent irréaliste: attendre 1 micro-seconde?
Sur le premier site que tu as donné, il teste avec une boucle que le flag busy de l'afficheur soit OK (ou bien il attend un délai fixe, de l'ordre de 20 ms on dirait)
De toute façon, tentes plutôt d'utiliser une librairie comme celle que je t'ai indiquée (parapin), ça devrait te simplifier la tache je pense.
A+,
Marsh Posté le 27-10-2011 à 19:37:19
Ok, je vais voir ce que je peux faire avec cette bibliothèque.
(J'ai perdu mon étain.)
Merci Gilou.
Marsh Posté le 27-10-2011 à 20:14:58
Oui parce qu'en regardant ici: http://parapin.sourceforge.net/doc [...] onfiguring
on voit assez bien comment le code C pour le Keil C peut se transposer.
Code :
|
devrait donner
Code :
|
A+,
Marsh Posté le 27-10-2011 à 22:04:51
Voilà, j'ai lu un poil de documentation sur parapin ; Soit j'ai pas compris, soit j'ai compris mais ça me parait louche donc question :
Que dois-je faire une fois que j'ai setté mais pins ?
Ca va paraître sous évalué, mais voici ce que j'ai fait... plop du code C, c'est rare de ma part.
Code :
|
Marsh Posté le 27-10-2011 à 22:46:16
gilou a écrit : Oui parce qu'en regardant ici: http://parapin.sourceforge.net/doc [...] onfiguring |
Merci Gilou, du coup, je comprends qu'il n'y a rien d'autre à faire qu'a setter les bon pin au bon moment.
J'ai plus à utiliser outb ?
Citation :
|
Je comprends pas par contre pourquoi on mettrait LP_DATA_PINS en entrée
Marsh Posté le 27-10-2011 à 23:34:09
Comme je t'ai dit, tu peux essayer de reporter le code lu sur le premier site
Code :
|
le code de parapin est tres simple et tient dans deux petits fichiers, parapin.c et parapin.h, qui devraient pouvoir être linkés directement.
Le code est SGDG a toi de voir s'il t'inspire.
Citation : J'ai plus à utiliser outb ? |
grosso modo, c'est ce que fait parapin, avec les bons masques
Lis le code de parapin.h et parapin.c, c'est fort compréhensible.
A+,
Marsh Posté le 27-10-2011 à 23:42:39
Citation : Je comprends pas par contre pourquoi on mettrait LP_DATA_PINS en entrée |
La ligne suivante?
pin_input_mode(LP_DATA_PINS);
C'est pour lire la valeur de LCD_D7 qui est (connecté à) un des LP_DATA_PINS (qui sont connectés à LCD_D0 ... LCD_D7)
Les LP_DATA_PINS doivent être tous simultanément en mode input ou output, d'ou le passage global en input mode.
A+,
Marsh Posté le 27-10-2011 à 23:56:24
gilou a écrit :
|
Oui, j'ai bien compris que tu voulais lire les donnée, mais pourquoi lire des données puisque c'est moi qui écrit les données.
Mais merci, je devrais me débrouiller.
J'espère revenir avec un code qui tourne.
Merci encore Gilou, a+
Marsh Posté le 28-10-2011 à 04:31:20
j'ai installé le serveur d'impression cups.
Du coup LCD_busy termine.
J'ai toujours pas de changement sur l'afficheur par contre.
J'ai arrêté le serveur d'impression tout de même.
J'ai fais :
|
J'ai bien connecter le pin 5 à la broche 16 du port parallèle avec mon étain (oui, je l'ai retrouvé).
Marsh Posté le 28-10-2011 à 10:44:52
Tu lis LCD_D7, s'il est a 1, ça indique que l'afficheur est busy.
Citation : il sort pas de la boucle |
Donc on aurait toujours LCD_D7 à 1?
J'ai pourtant juste traduit le code de
Code :
|
en code avec parapin.
EDIT: J'ai trouvé un projet ou cet afficheur est utilisé pour construire un altimètre. Avec des routines (en assembleur) qui me semblent bien plus correctes (au vu de la doc constructeur) que celles trouvées sur les pages web que tu avais. Je retranscris ça en C et je te le poste.
A+,
Marsh Posté le 28-10-2011 à 10:53:02
Bonjour Gilou.
Ok pour le bit 8.
Oui, c'était toujours busy parce qu'en fait ça lisait pas, parce que ça settait pas, parce que c'était pas en out_mode.
Maintenant c'est bon pour le busy mais toujours pas d'affichage.
J'ai testé avec des délais u poil partout, pas mieux, j'ai déplacé les instruction set_pin sur les DB 2 9 après le set_pin de En pas mieux.
J'avais vu le code de l'altimettre, j'ai même tenté de le compiler. Un code en ASM, je crois...
Eh !
Merci Gilou. T'as déjà fait pas mal. Si t'as du temps je suis preneur.
J'y ai passé la nuit, je sais pas pourquoi ça fonctionne pas ce matin. J'ai peut-être pas tout essayé...
Marsh Posté le 28-10-2011 à 12:17:34
Bon, a mes erreurs de transcription du code assembleur près, ce devrait marcher j'espère:
C'est assez brut de décoffrage, j'ai pas trop eu le temps de me relire.
Les routines en assembleur dont je suis parti (pour une interface avec un contrôleur PIC et non un port parallèle sont sur le site du projet d’altimètre)
Code :
|
EDIT à 14:10 remplacé une erreur de copier coller pour la dernière commande du LCD_INIT: LCD_iEntryModeSet -> LCD_iClearDisplay
A+,
Marsh Posté le 28-10-2011 à 15:08:17
C'est pas ça encore.
Ca affichait rien. J'ai déplacé quelque commande et j'ai ajouté des délais d'attente. Ca à fini par réagir un poil.
Quand je dis un poil, durant l'initialisation, avant même le premier LCD_SendCommand, ça affiche des caractère plein à moitier sur les deux première ligne et les 2 ligne suivante complètes.
J'ai changé d'afficheur entre temps, c'est le même modèle, mais comme j'avais peur d'avoir grillé le premier j'en ai soudé un autre... C'est pour quoi la longueur de ma réponse.
Je vais passer quelque temps dessus, je vais cherché, si tu vois des erreur....
A+
Marsh Posté le 28-10-2011 à 15:51:30
Ca devrait être bon.
A tout hasard, fais un essai avec LCD_INIT() ou le code commence après la ligne
// a partir de maintenant on pourra tester le signal BUSY pour l'attente
et en supprimant ce qui est avant
car c'est ainsi qu'est la routine d'initialisation sur Rickey's World , sans la partie complexe avant.
Si tu peux aussi tester ceci:
Code :
|
Juste pour tester que set_lcd_data fait bien son boulot.
A+,
Marsh Posté le 28-10-2011 à 16:56:38
Gilou, alors en fait, j'ai un problème récurent qui disparait sous certaine condition, j'ai appelé ça un problème système.
En fait le buzy tourne en boucle sauf si avant j'arrive à initialiser avec l'imprimante, j'en voie du texte sur lp0 et j'arrête cups, normalement je m'assure avaec la commande "modprobe parport_pc io=0x378 irq=7". parfois ça marche, le boucle termine normalement.
Après, avec aucune des deux modif, j'ai réussi à démarrer.
Et pas d'éffet non plus sur l'afficher, qui commençais à clignoter.
17heure déjà.
Marsh Posté le 28-10-2011 à 17:04:08
Pour la deuxieme modif, ça ta bien affiché la même chose pour les valeurs trouvée et celles attendues?
A+,
Marsh Posté le 28-10-2011 à 17:07:14
Si le busy tourne en boucle tu peux essayer de le remplacer par un délai d'attente fixe de 200 ms par exemple. Ça devrait être suffisant.
A+,
Marsh Posté le 28-10-2011 à 17:09:16
Je connais pas cet opérateur, semble- t- il très intéressant ma fois.Ca m'affichet ça :
void:/home/root/paralcd# ./paralcd a |
Marsh Posté le 28-10-2011 à 17:19:24
Et sans le busy déjà, le programme plante pas dans la boucle, il sert à quoi ce teste buzy, busy, c'est occupé de mémoire.
Donc, en fait c'est la mouise quand mee non.
Rien ne s'affiche en tout cas, sa clignote même pas une fois.
Je remet mais délais aussi, j'ai oublié que pour que ça clgnote, j'ai déplacé du code et ajouté des délais.
Marsh Posté le 28-10-2011 à 17:21:58
Damned: Je viens de voir ici que sur le port // pin 14 est "hardware inverted" comme le pin 1 et le 17, MAIS PAS LE 16!
Donc c'est le pin 14 qu'il va falloir associer au pin LCD 5 et non pas le 16!
Va falloir que tu joues avec la soudure.
Avec un peu de chance, c'est ça qui fait tout foirer, car le flag RW est a 1 quand il devrait être à 0, systématiquement, je pense.
J’espère que cette histoire de "hardware inverted" fait pas que tout est à l'envers au niveau des signaux de contrôle.
A+,
Marsh Posté le 28-10-2011 à 17:30:56
gilou a écrit : Damned: Je viens de voir ici que sur le port // pin 14 est "hardware inverted" comme le pin 1 et le 17, MAIS PAS LE 16! |
A zut, j'ai pouratnt regardé avant de changé, t'avais l'air de vouloir le mettre sur le 16, je me suis dis, je vais pas le contrarier.
Juste une soudure.
Marsh Posté le 28-10-2011 à 18:02:05
Faudra changer
#define LCD_RW LP_PIN16
par
#define LCD_RW LP_PIN14
dans le code.
A+,
Marsh Posté le 28-10-2011 à 18:29:02
J'ai retester sur les deux afficheur, aucun des deux ne fonctionne.
J'ai testé l'imprimante, ça imprime.
Je suis confus, j'ai que deux afficheurs.
Tà pas d'autre teste, et pourquoi le port est busy ?
Oups, pour un fois il l'est pas.
Je refais les testes précédant pardon, je m'emportais.
Marsh Posté le 28-10-2011 à 18:38:26
voidhome/root/paralcd# ./paralcd a
Data Pin Status: 11111111
Expected: 00110000
C'est le même résultat.
Marsh Posté le 28-10-2011 à 18:49:52
Moi dejà je croyais que qu'un unsigned char était un 7bits.
Marsh Posté le 28-10-2011 à 19:13:04
Non non, un unsigned char c'est 8 bits.
si tu essayes cette version modifiée du test, ça donne quoi?
Code :
|
Marsh Posté le 28-10-2011 à 19:29:49
Encore le même résultat.
void:/home/root/paralcd# ./paralcd a |
Marsh Posté le 28-10-2011 à 19:43:34
De toute façon, je fatigue, la, car c'était idiot cette modif du test.
Code :
|
Ca devrait être le bon code. J'ai rajouté un clear_pin(LCD_DATA); à tout hasard.
et
set_pin(LCD_E);
clear_pin(LCD_E);
car il faut un strobe envoyé au LCD, sinon, ca risque pas d'être lu.
A tout hasard, si tu remplaces le
clear_pin(LCD_CNTL);
par
set_pin(LCD_CNTL);
ça donne quoi?
Parce que la, je vois pas quoi trop tenter d'autre:
j'envoie une valeur au LCD, et je voudrais juste vérifier qu'il l'a reçue(je suppose qu'il garde ses pins en l'état après réception), et la, on dirait pas...
A+,
Marsh Posté le 27-10-2011 à 15:58:33
Bonjour
Je m'aventure dans la programmation pour un afficheur LCD qui n'est apparemment pas celui que je croyait.
En effet, je pensais avoir acquit un afficheur basé sur le micro-contrôleur Hitachi HD44780, mais il semble que ce ne soit pas le modèle escompté.
Mon afficheur est un Xiamen Ocular GDM2004D.
Je viens de trouver quelques info ainsi que quelque ligne de code que j'essaie de compiler en vain.
Ce qui fait que je viens chercher de l'aide sur mon forum préféré pour programmer cet afficheur.
Vous trouverez facilement le datasheet en googlant avec la référence de l'afficheur.
Côté code. j'ai trouvé ce web qui semble montrer comment piloter l'afficheur : Rickey's World
J'ai donc coller/copier le fichier at89x51.h, que vous trouverez à cette adresse : Koders.com, mais impossible de compiler ; Le code ne semble pas conforme à du C, malgrès que ça soit en être ; Mais comme je ne connais as le C, j'apprends.
Je vais ensuite construire mon programme à partir des bouts de code fournit sur le site de Rickey's World
Si vous pouviez me dire dans un premier temps ce qui cloche dans ce fichier at89x51.h
Et me corriger si je m'et trompé, je plaisante, si je me suis trompé.
Merci pour votre aide.
J'ai compilé avec la ligne de commande suivante :
gcc -o lcd_prog lcd_prog.c
...
Le code suivant :
Et j'ai presque autant d'erreur que de ligne relative au fichier ./at89x51.h.
void:/home/root/8051# gcc -o lcd_prog lcd_prog.c
In file included from lcd_prog.c:1:
./at89x51.h:32: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__at’
./at89x51.h:33: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__at’
./at89x51.h:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__at’
.../... Etc