SE4 2022/2023 EC2
Objectifs
Il vous est demandé de :
Cahier des charges version 1:
- de réaliser un prototype de système comportant un Arduino Uno, un écran LCD 2 ou 4 lignes à contrôleur HD44780 et les quelques composants nécessaires
- vous devez écrire un programme C pour gérer le contrôleur HD44780 à partir de l'ATMega328p, vous utilisez le compilateur
avr-gcc
pour générer l'exécutable - votre projet doit être constitué d'un répertoire comprenant un makefile et la source C, le makefile doit implanter les cibles clean, all et upload
- en utilisant vos fonctions pour le contrôleur HD44780 vous ferez en sorte que les données reçues sur le port série de l'Arduino soient affichées sur l'écran
- vous sélectionnerez les cinq séquences VT100 qui vous paraissent les plus importantes et vous les implanterez dans votre code
Ajout au cours du projet :
- comparer la taille des binaires d'un programme affichant sur 4 lignes un même texte compilé via l'IDE Arduino et via AVR-GCC
- factorisation du code
- calcul de la valeur de configuration du registre de Bauds à partir de la fréquence en entrée d'initialisation de l'UART.
- librairie disponible aussi pour les écrans 1 ligne.
Matériel nécessaire
Le matériel nécessaire consiste en un kit Arduino Uno.
Travail réalisé
Câblage
J'utilise ici un Arduino Nano et un écran LCD WH2004L-YYH-JT
Le montage est constitué d'un potentiomètre 10k entre VSS et VDD afin de sélectionner la tension VO qui permet de gérer le contraste de l'écran.
Un groupe de quatre résistances en parallèles (pas de résistances de plus haute puissance à ma disposition) permettent de limiter le courant et contrôler la tension du rétroéclairage de l'écran et donc sa luminosité.
Ecran LCD | ATMEGA328p | Arduino Nano |
---|---|---|
VSS | GND | GND |
VDD | 5V | 5V |
VO | X | X |
RS | PD2 | 2 |
RW | PD3 | 3 |
E | PD4 | 4 |
DB0 | PD5 | 5 |
DB1 | PD6 | 6 |
DB2 | PD7 | 7 |
DB3 | PB0 | 8 |
DB4 | PB1 | 9 |
DB5 | PB2 | 10 |
DB6 | PB3 | 11 |
DB7 | PB4 | 12 |
A | X | X |
K | GND | GND |
Comparaison
Les fichiers utilisés pour faire la comparaison se trouvent dans le dossier Compare du GitHub.
Texte à afficher
Lorem ipsum dolor
sit amet,consectetur
adipiscing elit, sed
do eiusmod tempor
Tailles
Arduino IDE
1820 octets de stockage flash
125 octets de RAM
26 248 octets PrintLoremArduino.ino.elf
5 135 octets PrintLoremArduino.ino.hex
AVR-GCC
958 octets de stockage flash
82 octets de RAM
8 304 lcd_lorem_program.elf
2 709 lcd_lorem_program.hex
Séquences VT100
Les séquences VT100 que j'ai sélectionnées sont :
cursorhome Move cursor to upper left corner Echap+H
cursorup Move cursor up one line Echap+A
cursordn Move cursor down one line Echap+B
cursorrt Move cursor right one char Echap+C
cursorlf Move cursor left one char Echap+D
Elles proviennent du site internet https://espterm.github.io/docs/VT100%20escape%20codes.html
Architecture du projet
Le projet se trouve final se trouve dans le GitHub mise en lien dans le dossier src/ et comporte un fichier hd_44780.h permettant de configurer l'écran à l'application. Un fichier hd_44780.c contenant toutes les fonctions permettant de contrôler l'écran et de l'initialiser. Et un fichier main.c contenant la partie lecture des données reçus sur le port série et l'affichage de celle-ci ainsi que la détection des commandes VT100 et l'exécution des fonctions correspondantes.
ReX : Merci de corriger les coquilles et de mettre entre balises code
les noms de fichiers.
Librairie HD44780 pour AVRGCC et AVR uC
La librairie permet dans le fichier hd44780.h :
- Choisir les pins pour chaque broche de données.
- Choisir le mode 2 lignes ou 4 lignes pour l'écran.
- Choisir le mode 4 bits ou 8 bits pour le bus de données parallèles.
- Choisir le type de curseur entre :
- "no_CURSOR" qui n'affiche rien sur la position où l'on se trouve sur l'écran.
- "underlined" qui affiche un soulignage de la position actuelle.
- "blinking" qui fait clignoter la case sur laquelle on se trouve.
- "underlined_blinking" la somme de underlined et blinking.
- Implémenter une fonction LCDSetup qui permet d'initialiser l'écran avec les paramètres ci-dessus.
- Implémenter une fonction ShiftUp qui permet de se déplacer vers le haut sur l'écran
- Implémenter une fonction ShiftDwon qui permet de se déplacer vers le bas sur l'écran.
- Implémenter une fonction ShiftRight qui permet de se déplacer vers la droite sur l'écran.
- Implémenter une fonction ShiftLeft qui permet de se déplacer vers la gauche sur l'écran.
- Implémenter une fonction LCDon qui permet d'activer l'affichage.
- Implémenter une fonction LCDoff qui permet de désactiver l'affichage.
- Implémenter une fonction NewLine qui permet de passer au début de la ligne suivante.
- Implémenter une fonction WriteChar qui permet d'écrire un caractère sur la case sur laquelle on se trouve.
- Implémenter une fonction LCDgotoXY qui permet de se déplacer à une position voulue sur l'écran.
La configuration doit être faite dans le fichier lcd_hd44780.h
La librairie fonctionne avec une majorité de microcontrôleur AVR, car la librairie permet de configurer les pins une à une, port à port.
ReX : Merci de corriger les coquilles et de mettre entre balises code
les noms de fichiers et de fonctions.
Main
Le programme main.c contient les fonctions d'initialisation et de lecture des données sur le port série. Une boucle tant que permet d'attendre constamment un octet sur le port série puis lorsqu'il arrive le traiter et attendre un nouvel octet sur le port série.
La fonction USART_init() permet d'initialiser le port série en 7 bits de données et 1 bit de stop. 103 correspond à 9600 bauds pour une fréquence d'horloge processeur de 16 MHz (À modifier en fonction de la configuration du microcontrôleur et les besoins).
ReX : Merci de corriger les coquilles et de mettre entre balises code
les noms de fichiers et de fonctions.
Les séquences VT100 sont détectés de la manière suivante :
- Si le caractère ascii correspondant à échap arrive (27) on n'affiche pas tout de suite et on attend de voir le caractère suivant.
- Si le caratère suivant n'est pas
[
alors on affiche 27 (soit rien) - Sinon, on attend le caractère suivant et s'il s'agit de A, B, C, D ou H, on peut alors activer la fonction correspondante car il s'agit d'une séquence VT100 sinon on affiche les caractères reçus jusqu'ici.
Documents Rendus
Discussions
Code supprimé :
ReX :
Pourquoi avoir supprimé l'archive avec le code ?Thomas : Le nom n'était pas bon et je n'ai pas trouvé le moyen de le modifier directement. Comme le code n'était pas bon, je n'ai pas trouvé judicieux de reposter directement l'ancien code sous le nouveau nom
Explication architecture :
ReX :
Vous n'expliquez pas l'architecture du code dans votre Wiki.Explication pour l'archive GIT. Résumé ReX : un code rendu sans explication de la structure puis retiré, puis remis.
Banc d'essai :
ReX : rien dans le Wiki sur le banc d'essai câblage en particulier, ce qui rend le test de vérification pénibleThomas : Le pin out de l'ATMEGA328P se trouve dans le fichier lcd_44780.h ligne 5 à 47 et a été conçu pour être facilement modifiable.
ReX : Le câblage a été ajouté dans le Wiki, le code n'est pas facilement modifiable.
Demande de correction :
ReX : un code imparfait, des demandes de correction, aucun retour
Thomas : Réponse donnée par mail (rien n'est parfait).
ReX : Dans votre courriel vous indiquez ne pas souhaiter effectuer les modifications, il faudra pourtant les faire.
Mode 8 bits non fonctionnelle :
Rex : un code fonctionnel en mode 4 bits, mais pas en mode 8 bits.
Thomas : Il faut respecter le pin out présent dans <code> lcd_44780.h </code> et changer le mode ligne 59 du même fichier.
ReX : Oui, et ça ne fonctionne pas et c'est logique vu que votre code ne passe d'un mode à l'autre.
Mode 8 bits non fonctionnelle 2
ReX : Comment le contrôleur LCD sait-il qu'il faut utiliser le mode 4 bits ou 8 bits ? je ne vois rien dans le code pour lui indiquer le mode ?
Thomas : Réponse en bas de page
ReX : C'est confirmé par le test avec un WH2004L-TMI-JT, le mode 8 bits n'est pas fonctionnel.
Thomas : Réponse en bas de page
Taille d'écran non adaptable :
ReX : le code fonctionne pour un écran 4 lignes de 20 caractères, mais n'est pas adaptable à un écran d'un autre nombre de lignes,
Thomas : Il faut modifier la définition du nombre de lignes et de colonnes dans lcd_44780.h ligne 50 et 51.
ReX : Oui, et ça ne fonctionne pas et c'est logique vu que le cas 1 ligne n'est pas prévu, rendez votre code générique et factorisez-le.
Taille d'écran non adaptable 2:
ReX : Un test effectué avec un WH2004L-TMI-JT, un autre test effectué avec un WH601A-NYG-JT (1 ligne, 16 caractères). Thomas : La consigne était écran 2 ou 4 lignes. Même si ce n'est pas prévu, le code devrait fonctionner tous de même avec un écran une ligne.
Code VT100:
ReX : Une confusion dans la compréhension des codes VT100, programme non conforme de ce côté,
Thomas : Les commandes VT100 fonctionnent correctement. Preuve en vidéo.
ReX : Non, voir commentaire plus haut.
Code VT100 2:
ReX :
Pas de test sur ESC dans.main.c
pas plus danslcd_hd44780.c
Thomas : Dans le fichier main.c ligne 41 le code ASCII 27 fait référence à la touche ECHAP
ReX : Voir dans le répertoire
FINAL
.ReX : Vous n'avez pas compris la séquence des codes VT100. Ils ne sont préfixés que d'un caractère : ESC. Aucun caractère
[
. Du coup votre code n'est pas fonctionnel concernant les code VT100.Thomas : Vous retrouverez ici [1] les commandes VT100 sur lesquels je me suis basé et elles sont préfixès d'un ESC et [ puis une lettre.
ReX : OK pour
ESC [ H
(mais erreur plus haut dans la liste des séquences VT100 choisies, non pour les 4 autres, relis bien ton document.
Macro GoTo :
ReX : Pour la fonction
LCDgotoXY
écrire une macro permettant de garder un nombre entre deux bornes, factorisez le code avec cette macro. Dans la même fonction, factorisez le code en utilisant un tableau des adresses de lignes.
Factorisation de code :
ReX : factoriser le code de la fonction
DataPortWrite4bits
en particulier en transformant les 4 écritures en une boucle de 4 itérations, optimisez en comparant avec des constantes de type1 << 7
plutôt qu'en décalant une variable. Même chose pour la fonctionDataPortWrite8bits
. ReX : Factoriser le code de l'initialisation des registres DDR.
Calcul de Baud :
ReX : Merci d'effectuer le calcul dans le code à partir d'un paramètre en bauds.
Commentaire personnel :
ReX : Dommage, vos trop nombreuses approximations et votre mauvaise volonté font oublier le succès de programmation du contrôleur d'affichage.