Question

J'ai un écran LCD HD44780 et j'utilise la bibliothèque LiquidCrystal fournie avec le package de développement Arduino. Cependant, ce n'est pas fiable. J'ai remarqué quelques problèmes, et au lieu d'être piloté par des interruptions, il dort tant que le développeur pense que la puce devrait prendre pour exécuter l'opération.

À partir des feuilles de spécifications, le drapeau BUSY sera défini pendant l’exécution, ce qui signifie qu’il est possible d’être piloté par interruption.

Est-ce que quelqu'un connaît une bibliothèque qui fait cela, et faut-il que tous les 8 bits soient connectés ou puis-je le garder à 4 broches?

Était-ce utile?

La solution

Je ne pense pas que vous ayez besoin d'une interruption pour cela. LiquidCrystal.cpp Dans la distribution Arduino, il vous suffit de changer le code LiquidCrystal :: write4bits , LiquidCrystal :: write8bits et LiquidCrystal :: pulseEnable . Les deux premières méthodes devraient commencer par surveiller la ligne occupée (BD7) avant d’écrire des données, et la dernière serait modifiée pour supprimer la pause de 100 us.

Je pense que la raison pour laquelle cela n'a pas été fait dans le code par défaut est que beaucoup d'utilisateurs de ces écrans LCD lient simplement R / W à la masse de sorte que l'affichage est toujours en mode écriture, rendant impossible la lecture du signal BUSY. Toutefois, ceci est passé dans la bibliothèque en définissant _rw_pin sur -1, afin que le code d’impulsion et d’écriture puisse utiliser conditionnellement la broche r / w comme moyen de détecter l’occupation en tant qu’optimisation de la vitesse.

Autres conseils

Il est possible d’utiliser 8 bits sur trois broches; vous avez juste besoin d'un registre à décalage. J'utilise un HEF4094BP de mouser.com (l'expédition coûtera plus cher que la puce réelle)

le schéma de câblage et les modifications de code pour le registre à décalage se trouvent ici: http: // www. arduino.cc/playground/Code/LCD3wires

Il y a quelque temps, j'ai modifié LiquidCrystal lib pour prendre en charge l'indicateur "busy". Notez que le fonctionnement réel basé sur les interruptions est impossible . Pour chaque lecture, vous devez basculer deux fois la ligne E . Par conséquent, vous devrez interroger le drapeau occupé.

J'ai ensuite effectué quelques tests de performance, indiquant que l'interrogation de l'indicateur occupé était plus lente que l'attente de la plupart des commandes. (Les exceptions sont les commandes "clear" et "home"). En effet, la commutation entre les modes lecture et écriture nécessite des étapes supplémentaires telles que 8 appels supplémentaires vers digitaWrite et 8 appels supplémentaires vers pinMode . Même avec les Arduinos à 16 MHz, cela est plus lent que d’attendre 100 & s.!

Après cela, j’ai écrit une bibliothèque qui manipule les registres de broches directement et en vrac - les 8 broches avec un seul accès aux registres. Après cela, je me suis retrouvé dans le stade pour tirer quelque avantage des sondages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top