SE4 2022/2023 EC2

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Objectifs

Il vous est demandé de :

  • 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
  • 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

Matériel nécessaire

Le matériel nécessaire consiste en un kit Arduino Uno.

Travail réalisé

Câblage

Photo des composants sur l'écran
Photo du banc d'essai vue de face

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

Écran avec affichage du texte

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

ReX : Je ne vois pas où les séquences ci-dessus sont implantées dans le code.

Thomas : Ligne 37 à 79 de main.c

ReX : Dans le main du répertoire FINAL.

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.

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 type 1 << 7 plutôt qu'en décalant une variable. Même chose pour la fonction DataPortWrite8bits.

ReX : Factoriser le code de l'initialisation des registres DDR.

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

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.

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.

ReX : Merci d'effectuer le calcul dans le code à partir d'un paramètre en bauds.

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.

ReX : Pas de test sur ESC dans main.c pas plus dans lcd_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.

Documents Rendus

HD44780_avrgcc_lib

Fichier:SE4 2022 2023 EC2.zip

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

ReX : Vous n'expliquez pas l'architecture du code dans votre Wiki. Explication pour l'archive GIT.

ReX : En résumé :

  • rien dans le Wiki sur le banc d'essai câblage en particulier, ce qui rend le test de vérification pénible,
  • Thomas : 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.
  • un code rendu sans explication de la structure puis retiré, puis remis.
  • un code imparfait, des demandes de correction, aucun retour,
  • Thomas : Réponse donnée par mail (rien n'est parfait).
  • un code fonctionnel en mode 4 bits, mais pas en mode 8 bits,
    • Thomas : Il faut respecter le pin out présent dans lcd_44780.h et changer le mode ligne 59 du même fichier
  • 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.
  • 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.
  • Dommage, vos trop nombreuses approximations et votre mauvaise volonté font oublier le succès de programmation du contrôleur d'affichage.

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.