Changes between Initial Version and Version 1 of SujetTP3-2017


Ignore:
Timestamp:
Feb 12, 2016, 6:14:23 AM (9 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP3-2017

    v1 v1  
     1{{{#!comment
     2Ce TME a été créé par Julien Peeters et modifié par Franck Wajsbürt
     3}}}
     4
     5= TP3 : 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://www.newhavendisplay.com/specs/NHD-0420DZ-FL-YBW.pdf | Datasheet du LCD de la plateforme]]
     18* [[http://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller | LCD Display HD44780]]
     19* [[https://www.sparkfun.com/datasheets/LCD/HD44780.pdf | Datasheet du HD44780]]
     20* [[http://web.alfredstate.edu/weimandn/lcd/lcd_addressing/lcd_addressing_index.html | Adressage de la mémoire interne de l'afficheur]]
     21
     22Prenez le temps de parcourir les documents sur les afficheurs LCD HD44780 avant de commencer le TP.
     23
     24== 1. Configuration des GPIO pour le pilotage de l'écran ==
     25
     26L'é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 E. Les signaux de données sont au nombre de 4 ou 8 suivant le mode.
     27
     28Dans 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 de la carte Raspberry Pi ne supporte pas les niveaux de tension 5V émis par l'afficheur).
     29
     30Les signaux de contrôle RS et E sont utilisés de la manière suivante:
     31* RS vaut 1 pour l'envoi d'une donnée (e.g. un caractère) et vaut 0 pour l'envoi d'une commande.
     32* E est un signal de validation; la valeur sur le bus de données (4 bits) est pris en compte à chaque front descendant de ce signal.
     33
     34Voici le mapping des GPIO pour les différents signaux:
     35
     36||=   Signal LCD  =||=     GPIO     =||
     37||       RS        ||       7        ||
     38||       E         ||       8        ||
     39|| D4, D5, D6, D7  || 22, 23, 24, 25 ||
     40
     41
     42Pour le contrôle des GPIO, vous utiliserez ce que vous avez vu lors du précédent TP.
     43
     44Pour contrôler l'afficheur nous devons répondre aux questions suivantes:
     45* Comment faut-il configurer les GPIOs pour les différents signaux de l'afficheur LCD ?
     46* Comment écrire des valeurs vers le LCD ?
     47* Quelles valeurs doivent être envoyées vers l'afficheur pour réaliser l'initialisation ?
     48* Comment envoyer demander l'affichage d'un caractère ?
     49* Comment envoyer des commandes telles que l'effacement de l'écran, le déplacement du curseur, etc. ?
     50
     51== 2. Fonctionnement de l'écran et fonctions de base ==
     52
     53Comme cela a été présenté en cours la prise en compte de la donnée est réalisée lors d'un front descendant du signal E.
     54Pour créer un front descendant:
     55* on place la donnée,
     56* puis le signal E est mis à 1 pendant 1µs puis remis à 0 pendant une 1µs supplémentaire pour garantir le délai entre deux commandes.
     57
     58{{{#!protected
     59Question:
     60* Ecrire une fonction lcd_strobe (nommée nybble dans le cours) qui permet de générer le signal E.
     61
     62Nous 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.
     63
     64Question:
     65* Ecrire les fonctions lcd_command et lcd_data en vous aidant du cours.
     66
     67Nous 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.
     68
     69Question:
     70* Ecrire une fonction lcd_init qui réalise la séquence d'initialisation telle que vue en cours. Vérifiez son fonctionnement sur une carte Raspberry Pi.
     71Vous ajouterez l'initialisatiion des GPIOs.
     72
     73* Ecrire la fonction lcd_cleanup qui vide la mémoire de l'afficheur (i.e. clear) et remet les GPIOs en entrée. Savez-vous pourquoi c'est nécessaie ?
     74
     75Vous êtes prêt à tester votre code et vérifier qu'il affiche correctement une chaine de caractère.
     76
     77Question:
     78* Ecrivez un programme qui affiche la chaine de caractère "Hello World!" sur l'afficheur. Vérifiez son fonctionnement sur une carte Raspberry Pi.
     79
     80Il peut être utile de manipuler la position du curseur pour choisir où placer les caractères sur l'afficheur.
     81
     82Pour 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).
     83
     84La mémoire DDRAM est construite de la manière suivante:
     85||0x00 ..... Ligne 1 ..... 0x13||
     86||0x40 ..... Ligne 2 ..... 0x53||
     87||0x14 ..... Ligne 3 ..... 0x27||
     88||0x54 ..... Ligne 4 ..... 0x67||
     89
     90Questions:
     91* Ecrire une fonction lcd_clear_display qui vide la mémoire de l'afficheur et place le pointeur d'adresse à 0.
     92* Ecrire une fonction lcd_home qui replace le pointeur d'adresse à 0.
     93* Ecrire une fonction lcd_set_cursor qui positionne le curseur aux coordonnées (x,y) avec x la colonne, y la ligne.
     94* Ecrivez un programme qui affiche "Hello World!" sur chacun des lignes de l'afficheur.
     95
     96== 3. Affichage du monitoring système ==
     97
     98Maintenant 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:
     99{{{
     100The first three fields in this file are load average figures giving the number of jobs in the run queue (state R) or
     101waiting for disk I/O (state D) averaged over  1,  5, and 15 minutes.  They are the same as the load average numbers
     102given by uptime(1) and other programs.  The fourth field consists of two numbers separated by a slash (/). The first
     103of these is the number of currently runnable kernel scheduling entities (processes, threads).  The value after the
     104slash is the  number  of  kernel  scheduling entities that currently exist on the system.  The fifth field is the PID
     105of the process that was most recently created on the system.
     106}}}
     107
     108Question:
     109* 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.
     110
     111Bonus:
     112* Parser le contenu du fichier /proc/loadavg pour afficher des valeurs plus facilement compréhensibles.
     113
     114}}}