« SE4 2022/2023 EC2 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
(Correction)
Ligne 62 : Ligne 62 :
ReX : Dans le <code>main</code> du répertoire <code>FINAL</code>.
ReX : Dans le <code>main</code> du répertoire <code>FINAL</code>.


== <big>Architecture du projet</big> ==
=== <big>Architecture du projet</big> ===


=== <u>Librairie HD44780 pour AVRGCC et AVR uC:</u> ===
==== <u>Librairie HD44780 pour AVRGCC et AVR uC:</u> ====
La librairie permet de :
La librairie permet de :


Ligne 104 : Ligne 104 :
ReX : Pour la fonction <code>LCDgotoXY</code> é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.
ReX : Pour la fonction <code>LCDgotoXY</code> é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.


=== <u>Main:</u> ===
==== <u>Main:</u> ====
Le main 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 nouveau octet sur le port série.
Le main 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 nouveau octet sur le port série.



Version du 26 juillet 2023 à 13:05

Objectifs

Il vous est demandé de :

  • comparer la taille des binaires d'un programme affichant sur 4 lignes un même texte compiler 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

Photo des composants sur l'écran

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

Travail réalisé

ReX : Pas de vidéo de démonstration.

Comparaison:

Texte à afficher:

Photo du banc d'essai vue de face

Lorem ipsum dolor

sit amet,consectetur

adipiscing elit, sed

do eiusmod tempor

Écran avec affichage du texte

Tailles :

ReX : taille de programme ? taille du programme plus taille RAM ?

ReX : taille RAM utilisée ?

Arduino IDE:

1820 octets de stockage flash

AVR-GCC:

958 octets de stockage flash

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

Librairie HD44780 pour AVRGCC et AVR uC:

La librairie permet de :

  • choisir les pins pour chaques broches de données.
  • choisir le mode 2 lignes ou 4 lignes pour l'écran.
  • choisir le mode 4bits ou 8bits pour le bus de données parralè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 le 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 où l'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ôlleurs AVR car la librairie permet de configurer les pins une à une, port à port.

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 main 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 nouveau 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 correpond à 9600bauds pour une fréquence d'horloge processeur de 16MHz (A modifier en fonction de la configuration du microcontrôlleur et les besoins).

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 si 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 http://www.braun-home.net/michael/info/misc/VT100_commands.htmles commandes VT100 sur lesquels je me suis basé et elles sont préfixès d'un ESC et [ puis une lettre.

Documents Rendus

https://github.com/TH0L3F/HD44780_avrgcc_lib

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.

ReX : En résumé :

  • rien dans le Wiki sur le banc d'essai (cablâge (Thomas : /!\ Câblage) en particulier), ce qui rend le test de vérification pénible ;
    • Thomas : Le pinout de l'ATMEGA328P se trouve dans le fichier lcd_44780.h ligne 5 à 47 et a été conçu pour être facilement modifiable
  • un code rendu sans explication de la structure puis retiré ;
    • 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
  • 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 ;
    • Il faut respecter le pinout 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 ;
    • 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 coté ;
    • Les commandes VT100 fonctionne correctement.
  • 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.