Changes between Initial Version and Version 1 of SujetTP4-2015


Ignore:
Timestamp:
Mar 5, 2015, 4:14:11 AM (10 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP4-2015

    v1 v1  
     1{{{#!comment
     2Ce TME a été rédigé par Julien Peeters, il a été déplacé pour être modifié.
     3}}}
     4
     5= TP4 : Pilotage d'un écran LCD en mode utilisateur =
     6
     7Objectifs:
     8* Configuration des GPIOs pour le pilotage d'un périphérique
     9* Fonctionnement d'un écran LCD et fonctions de base
     10* Affichage du monitoring système
     11
     12Pré-requis (Raspberry Pi):
     13* Outils de compilation croisée
     14* Configuration et utilisation des GPIO
     15
     16Ressources:
     17* [[http://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller | LCD Display HD44780]]
     18* [[https://www.sparkfun.com/datasheets/LCD/HD44780.pdf | Datasheet du HD44780]]
     19* [[http://web.alfredstate.edu/weimandn/lcd/lcd_addressing/lcd_addressing_index.html | Adressage de la mémoire interne de l'afficheur]]
     20
     21Prenez le temps de lire le document sur les afficheurs LCD HD44780 avant de commencer le TP.
     22
     23Modalités d'évaluation:
     24* Vous devez rendre un compte rendu au format PDF '''exclusivement''' de '''maximum''' 2 pages et structuré de la manière suivante:
     25  * Introduction: quel problème vous devez résoudre; en d'autres mots quelles sont les fonctionnalités à implémenter.
     26  * Le fonctionnement de principe: quelle solution avez vous choisi, quels sont vos choix techniques.
     27  * Implémentation et résultats: vos observations, quels problèmes avez-vous rencontrez et comment les avez-vous résolus.
     28  * Conclusion
     29* Vous devez également rendre votre code sous la forme d'une archive tar.gz; le nom de fichier est formatté comme suit: nom1_nom2.tar.gz (binôme) nom1_nom2_nom3.tar.gz (trinôme). Faites attention, la qualité de code (indentation, structure, nom des fonctions et variables...) sont également notés.
     30
     31== 1. Configuration des GPIO pour le pilotage de l'écran ==
     32
     33Pour commencer le TP, copier le contenu du répertoire /users/enseig/jpeeters/m1.peri/lab2 dans votre répertoire de travail.
     34{{{
     35$ cp -r /users/enseig/jpeeters/m1.peri/lab2 ~/peri/lab2
     36}}}
     37
     38Comme vous pouvez le voir dans le document ci-joint, un écran LCD de type HD44780 dispose de plusieurs signaux de contrôle et de données. Les signaux de contrôle sont au nombre de 3: RS, RW et EN. Les signaux de données sont au nombre de 4 ou 8 suivant le mode.
     39
     40Dans ce TP, nous utiliserons l'écran en mode 4-bit car la carte Raspberry Pi dispose d'un nombre limité de GPIO. De plus, le signal RW sera connecté directement à la masse car nous allons gérer que les opérations d'écriture (Note: les GPIO ne supporte pas les niveaux de tension 0-5V émis par l'afficheur).
     41
     42Les signaux de contrôle RS et EN sont utilisés de la manière suivante:
     43* RS vaut 1 pour l'envoi d'une donnée (e.g. un caractère) et vaut 0 pour l'envoi d'une commande.
     44* EN correspond à l'horloge; la valeur sur le bus de données (4 bits) est pris en compte à chaque front descendant de ce signal.
     45
     46Voici le mapping des GPIO pour les différents signaux:
     47{{{
     48-----------------+---------------+
     49|   Signal LCD   |     GPIO      |
     50-----------------+---------------+
     51| RS             | 18            |
     52| EN             | 23            |
     53| D0, D1, D2, D3 | 4, 17, 27, 22 |
     54+----------------+---------------+
     55}}}
     56
     57Pour le contrôle des GPIO on utilisera la librairie libgpio fournie lors du précédent TP.
     58
     59Questions:
     60* Comment faut-il configurer les GPIOs pour les différents signaux de l'afficheur LCD ?
     61* Quelle valeur faut-il configurer comme valeur d'initialisation pour les différents signaux ?
     62* Pouvez-vous donner, en résumé, les étapes clés pour l'initialisation des GPIO en mode utilisateur ?
     63
     64== 2. Fonctionnement de l'écran et fonctions de base ==
     65
     66La prise en compte de la valeur présente sur le bus de 4 bits n'est effective que lors d'un front descendant du signal EN. Pour créer un front descendant, il vous faut garder le signal EN à 1 pendant une demi période et le remettre à 0 pendant une demi période supplémentaire. Une période de 100 us parait être une bonne valeur pour la période.
     67
     68Question:
     69* Ecrire une fonction lcd_strobe qui permet de générer un front descendant
     70
     71Nous utilisons l'afficheur LCD en mode 4 bits. Or, les commandes et les données sont transmises sur 8 bits ou 1 octet. Ainsi, toutes les commandes et toutes les données sont transmises en deux étapes: les 4 bits de poids fort et ensuite les 4 bits de poids faible.
     72
     73Question:
     74* Ecrire une fonction lcd_write_4bit_value qui envoie une valeur de 4 bits sur le bus de l'afficheur LCD.
     75* Ecrire une fonction lcd_write_value qui envoie une valeur de 8 bits sur le bus de l'afficheur LCD en utilisant la fonction lcd_write_4bit_value.
     76
     77Note: n'oubliez pas qu'une valeur sur le bus n'est pris en compte que lors d'un front descendant du signal EN.
     78
     79Nous avons maintenant les fonctions de base pour commander l'afficheur LCD. Il ne manque plus qu'a distinguer l'envoi de commandes et l'envoi de données. C'est le signal RS qui gère cela. Référez-vous à la documentation.
     80
     81Questions:
     82* Ecrire une fonction lcd_send_4bit_cmd qui envoie une commande sur 4 bits à l'afficheur LCD.
     83* Ecrire une fonction lcd_send_cmd qui envoie une commande sur 8 bits à l'afficheur LCD.
     84* Ecrire une fonction lcd_send_data qui envoie une donnée sur 8 bits à l'afficheur LCD.
     85
     86Nous avons toutes les fonctions dont nous avons besoin. Maintenant regardons d'un peu plus près la phase d'initialisation de l'afficheur LCD. Au démarrage, l'afficheur est dans un mode non défini (8 bits ou 4 bits). Il faut donc le forcer en mode 4 bits.
     87
     88Question:
     89* Ecrire une fonction lcd_init qui réalise la séquence d'initialisation suivante. Vérifiez sont fonctionnement sur une carte Raspberry Pi.
     90
     91{{{
     921. Fonction 8-bit (4 MSB bits), wait 50 us /* 8-bit mode */
     932. Fonction 8-bit (4 MSB bits), wait 50 us
     943. Fonction 8-bit (4 MSB bits), wait 50 us
     954. Fonction 4-bit (4 MSB bits), wait 50 us /* 4-bit mode */
     96
     975. Fonction with 2 lines, wait             /* 2 rows */
     98
     996. Display control with display on, wait   /* Activate display */
     100
     1017. Entry mode with forward cursor, wait    /* Increment cursor on read/write operation */
     102
     1038. Cursor/display shift right, wait        /* Cursor move on the display */
     104
     1059. Clear display                           /* Clear */
     106}}}
     107
     108* Rajouter à la fonction lcd_init les étapes supplémentaires qui initialise les GPIOs.
     109* Ecrire la fonction lcd_deinit qui vide la mémoire de l'afficheur (i.e. clear) et déinitialise les GPIOs.
     110
     111Vous êtes prêt à tester votre code et vérifier qu'il affiche correctement une chaine de caractère.
     112
     113Question:
     114* Ecrivez un programme qui affiche la chaine de caractère "Hello World!" sur l'afficheur. Vérifiez son fonctionnement sur une carte Raspberry Pi.
     115
     116Il peut être utile de manipuler la position du curseur pour choisir où placer les caractères sur l'afficheur.
     117
     118Pour cela, l'afficheur dispose de trois instructions: Cursor home, Display clear et Set DDRAM address. La dernière instruction est relative à la mémoire interne de l'afficheur (Display Data RAM).
     119
     120La mémoire DDRAM est construite de la manière suivante:
     121{{{
     1220x00 ..... Ligne 1 ..... 0x13 0x14 ..... Ligne 3 ..... 0x27
     1230x40 ..... Ligne 2 ..... 0x53 0x54 ..... Ligne 4 ..... 0x67
     124}}}
     125
     126Questions:
     127* Ecrire une fonction lcd_clear_display qui vide la mémoire de l'afficheur et place le pointeur d'adresse à 0.
     128* Ecrire une fonction lcd_home qui replace le pointeur d'adresse à 0.
     129* Ecrire une fonction lcd_set_cursor qui positionne le curseur aux coordonnées (x,y) avec x la colonne, y la ligne.
     130* Ecrivez un programme qui affiche "Hello World!" sur chacun des lignes de l'afficheur.
     131
     132== 3. Affichage du monitoring système ==
     133
     134Maintenant que vous disposer de tous les éléments pour contrôler l'afficheur LCD. Nous allons monitorer le système grâce au fichier /proc/loadavg dont le contenu est décrit comme:
     135{{{
     136The first three fields in this file are load average figures giving the number of jobs in the run queue (state R) or
     137waiting for disk I/O (state D) averaged over  1,  5, and 15 minutes.  They are the same as the load average numbers
     138given by uptime(1) and other programs.  The fourth field consists of two numbers separated by a slash (/). The first
     139of these is the number of currently runnable kernel scheduling entities (processes, threads).  The value after the
     140slash is the  number  of  kernel  scheduling entities that currently exist on the system.  The fifth field is the PID
     141of the process that was most recently created on the system.
     142}}}
     143
     144Question:
     145* Ecrivez un programme qui lit le contenu du fichier /proc/loadavg et qui affiche son contenu sur l'afficheur avec une fréquence d'actualisation de 1 seconde.
     146
     147Bonus:
     148* Parser le contenu du fichier /proc/loadavg pour afficher des valeurs plus facilement compréhensibles.