autodétection de la résolution d'un LCD type HD44780

Nov 11, 2009 7 Replies

Bonjour,



oui je sais c'est la version fran=E7aise de ce que je viens d'envoyer sur comp.arch.embedded mais je m'aper=E7ois qu'en =E9crivant, =E7a met les id=E9es au clair et me fait aussi avancer.


Donc voil=E0 : dans le pass=E9, j'ai eu =E0 connecter des modules alphanum=E9riques =E0 des PICs (par exemple) et =E7a risque de recommencer (j'esp=E8re avec YASEP). J'ai donc amass=E9 une petite collection de LCD standards chin=E9s =E0 droit et =E0 gauche, avec des r=E9solutions de 1 =E0 8 lignes, de 8 =E0 40 caract=E8res.



A chaque fois qu'un nouveau module est essay=E9, au moins la r=E9solution change, et il faut recompiler le logiciel du CPU. Ce qui n'est pas tr=E8s pratique par exemple si je livrais un projet =E0 un client, et que ce dernier d=E9sirait dans le futur changer de r=E9solution (c'est une hypoth=E8se).



Dans ce cas on ajoute sur le circuit imprim=E9 un ou des jumpers, ou des pads de soudure, ou d'autres trucs qui prennent des broches pour rien.


Je me suis dit (il y a =E0 peine qqs heures donc c'est tout frais et pardonnez-moi l'id=E9e brouillon) que ce n'=E9tait pas n=E9cessaire et que quelques r=E9sistances de pull-up et pull-down (>100K) soud=E9s sur le LCD lui-m=EAme font tout simplement l'affaire.



En effet, ces modules sont souvent utilis=E9s en "mode nibble" (4 bits de donn=E9es) avec la broche d'=E9criture c=E2bl=E9e en =E9critur= e (donc le module LCD n'=E9crit jamais sur le bus). Et avec 4 bits on peut encoder quasiment toutes les r=E9solutions trouvables :



bits 4 & 5 : car/ligne : 0 0 8 1 0 16 0 1 20 1 1 40 ?



bits 6 & 7 : lignes : 0 0 1 1 0 2 0 1 4 1 1 erreur ?



Donc au moment du d=E9marrage, le CPU met le bus en lecture, lit les 4 bits et d=E9tecte si la combinaison est correcte (si le LCD est absent ou non-"patch=E9"). Ensuite les routines d'affichage sont mises =E0 jour avec le bon nombre de lignes et de caract=E8res, avec une valeur de 1x8 si erreur.



L=E0 o=F9 je commence un peu =E0 douter, c'est que je me souviens d'avoir trouv=E9 des courants de fuite ou des r=E9sistances de tirage lors de mes exp=E9rimentations. J'avais mis des petites LEDs rouges =E0 tr=E8s haut rendement, avec une forte r=E9sistance, sur le bus de donn=E9e, et elles s'allumaient parfois (sans que le CPU le demande) mais je ne me souviens plus dans quelles conditions.


Quelqu'un pourrait donner plus d'infos et d'autres retours d'exp=E9riences =E0 ce sujet ? Est-ce que =E7a vaut la peine que je "patche" ma collection de modules pour tester ce syst=E8me, ou bien c'est vou=E9 directement =E0 l'=E9chec en raison de param=E8tres que j'aurais oubli=E9 ?



YG



--=20

formatting link
/
formatting link


whygee a écrit :

L'idée est très intéressante.

la datasheet du hd44780 parle de pull-up resistances sur les fils de data et de contrôle qui génèrent un courant de 125uA, donc 40kohms vers le plus.

pour mettre des pull-down efficaces, il te faut mettre du 22k ou du 10k.

JJ

es

cool :-)

s vers=20

ah, j'avais donc bien oubli=E9 un d=E9tail. c'est dingue d'arriver =E0 alimenter une LED avec 125uA :-)

=2E effectivement. selon la tension, =E7a va faire des fuites de courant. pour les montages =E0 =E9conomie d'=E9nergie, =E7a peut =EAtre un souci. Cependant, s'il y a d=E9j=E0 des pull-ups, =E7a simplifie tout :-) d'abord pour d=E9tecter si les r=E9sistances de config sont l=E0 (on lit 1111), et aussi pour r=E9duire le nombre de r=E9sistances (on met juste celles vers 0V).

Bonne nuit,

YG [qui a encore 10 PCB =E0 construire pour demain ;-)]

--=20

formatting link
/
formatting link

s vers=20

=2E d'apr=E8s mes calculs pour un syst=E8me compatible 3,3V, il faut une r=E9sistance inf=E9rieure =E0 8Kohms. Je vais voir si j'ai des CMS en 7,5K.

Aussi, afin de r=E9duire la consommation, j'ai commenc=E9 =E0 faire une table des combinaisons pour que les r=E9solutions les plus courantes n=E9cessitent le moins de r=E9sistances.

valeur bits 4-7 fonction 0 "0000" : R=E9serv=E9 (extension, lire bits 0 =E0 3 ?) 1 "1000" : 4x16 2 "0100" : 4x40 3 "1100" : 1x20 4 "0010" : R=E9serv=E9 (configuration alternative d'une r=E9solut= ion) 5 "1010" : 1x40 6 "0110" : 2x24 7 "1110" : 4x20 8 "0001" : R=E9serv=E9 (configuration alternative d'une r=E9solut= ion) 9 "1001" : 2x8 10 "0101" : 2x32 11 "1101" : 2x20 12 "0011" : 2x40 13 "1011" : 2x16 14 "0111" : 1x16 15 "1111" : 1x8 / LCD absent

chaque '0' correspond donc =E0 1 r=E9sistance.

J'=E9cris actuellement un document qui fait le point sur tout =E7a, je le mettrai en ligne dans les prochains jours.

YG

--=20

formatting link
/
formatting link

sitodisitof=E9 :

formatting link

YG encore

--=20

formatting link
/
formatting link

Bonjour, Bravo, merci pour ton efficacité ! Bonne nuit ?! henry

Bel effort, mais j'ai deux petites remarques:

- dans le "summary" tu devrais preciser l'ordre car il est a l'envers de l'usage ( poids faible a droite, forts a gauche) . exemple en lisant 1000, pour moi par défaut c'est 8 et pas 1.

- il y a une erreur dans la liste precedente ce summary: le 1x20 apparait deux fois (1100 et 1011) et le 2x16 n'y est pas. Je pense que c'est , selon le summary 1011.

Sinon bon boulot.

Alain

e=20

00,=20

effectivement.

it=20

elon=20

=E7a m'apprendra =E0 faire ce genre de trucs =E0 des heures innommables.

ouais, mais va surtout falloir le faire marcher un de ces jours :-)

merci pour les corrections, YG

--=20

formatting link
/
formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required