Скачать презентацию Driver de port parallèle Commande d un module d affichage Скачать презентацию Driver de port parallèle Commande d un module d affichage

9dfd136eb1b520ef87f7f606024489b9.ppt

  • Количество слайдов: 49

Driver de port parallèle Commande d’un module d’affichage LCD jc/md/lp-01/05 Module d'affichage LCD sur Driver de port parallèle Commande d’un module d’affichage LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 1

Objectif du chapitre • Faire fonctionner un module d’affichage LCD couplé sur le port Objectif du chapitre • Faire fonctionner un module d’affichage LCD couplé sur le port parallèle de la cible CEPC – – Étude sommaire du port parallèle standard des PC Étude sommaire du module LCD Écriture d’un driver pour ce module Écriture d’une application pour afficher deux lignes sur le module LCD – Téléchargement dans le CEPC – Exécution jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 2

Port Parallèle d’un PC (1) • Le port parallèle standard (SPP) est un port Port Parallèle d’un PC (1) • Le port parallèle standard (SPP) est un port prévu dès l’origine du PC pour obtenir une liaison plus rapide que la liaison série de l’époque, utile pour commander une imprimante • Dans un PC-XT ou dans un PC-AT le SPP n’était pas sur la carte mère mais sur une carte additionnelle qui contenait aussi un port série • Carte à installer dans un connecteur du bus ISA jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 3

Port Parallèle d’un PC (2) • Il était possible d’installer sur le bus ISA Port Parallèle d’un PC (2) • Il était possible d’installer sur le bus ISA deux cartes série/parallèle en choisissant par des straps deux décodages d’adresse possibles – 0 x 378 : Parallel Printer 1 (LPT 1) associé à l’IRQ 7 – 0 x 278 : Parallel Printer 2 associé à l’IRQ 5 • Cet adaptateur parallèle n’était même pas un boîtier spécifique mais l’association d’un PAL et de quelques latches et drivers constituant trois registres • Plus tard sont apparus des circuits spécifiques plus polyvalents jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 4

Port Parallèle d’un PC (3) • Registre de données (D 0 -D 7) – Port Parallèle d’un PC (3) • Registre de données (D 0 -D 7) – à l’adresse de base du port • Registre de Status (S 3 -S 7) – à l’adresse de base du port + 1 – utilisé pour ses cinq bits de poids forts seulement S 3 -S 7, S 0 -S 2 inutilisés ou inexistants • Registre de commande (C 0 -C 4) – à l’adresse de base du port + 2 – Utilisé pour ses cinq bits de poids faibles C 0 -C 4, C 5 C 7 inutilisés ou inexistants – ici nous n’utilisons que C 0 -C 4 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 5

Registres du port parallèle Registre de données Adresse de base D 7 D 6 Registres du port parallèle Registre de données Adresse de base D 7 D 6 Poids fort D 5 D 4 D 3 D 2 Registre de status (lecture) D 1 D 0 Poids faible Adresse de base + 1 S 7 S 6 S 5 S 4 S 3 Registre de contrôle Adresse de base + 2 C 4 jc/md/lp-01/05 C 3 C 2 Module d'affichage LCD sur le port parallèle : présentation C 1 C 0 6

Registres données et commande D 0 C 0 D 1 C 1 D 2 Registres données et commande D 0 C 0 D 1 C 1 D 2 C 2 D 3 C 3 D 4 D 5 D 6 D 7 Registre données jc/md/lp-01/05 Buffer Registre commande Module d'affichage LCD sur le port parallèle : présentation Buffer 7

Registre status • Inutilisé dans notre application jc/md/lp-01/05 Module d'affichage LCD sur le port Registre status • Inutilisé dans notre application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 8

Écriture sur un port VOID WRITE_PORT_UCHAR(PUCHAR Port, UCHAR Value); Parameters Port [in] Pointer to Écriture sur un port VOID WRITE_PORT_UCHAR(PUCHAR Port, UCHAR Value); Parameters Port [in] Pointer to the port that must be a mapped memory range in I/O space. Value [in] Byte to be written to the port. Return Values None. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 9

Module d’affichage LCD HD 44780 • Le module possède – Une mémoire de 80 Module d’affichage LCD HD 44780 • Le module possède – Une mémoire de 80 caractères : Display Data RAM (DD RAM) – Un générateur de police de caractère – Deux registres internes DR et IR • Taille de l’afficheur utilisé : – Nombre de lignes d’affichage : 2 – Nombre de caractères par ligne : 20 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 10

Signaux du module LCD • • • Port de données D 0 -D 7 Signaux du module LCD • • • Port de données D 0 -D 7 RS Register Select E Enable R/W Lecture/écriture, pour nous 0 VDD Alimentation, pour nous sera prise sur le port sur la broche C 2 • VSS Masse • VL Contrôle du contraste, pour nous 0, contraste maximal jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 11

Câblage du module LCD sur le port parallèle Module d’affichage LCD D 7 D Câblage du module LCD sur le port parallèle Module d’affichage LCD D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 RS E R/W VSS VL VDD VDD 10 KΩ D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 10 KΩ C 3 C 0 Port parallèle 9 8 jc/md/lp-01/05 7 6 5 4 3 2 17 VDD VL à la masse donne le contraste maximum 1 Module d'affichage LCD sur le port parallèle : présentation 12

Registres internes du module LCD • Deux registres internes – IR registre d’instruction – Registres internes du module LCD • Deux registres internes – IR registre d’instruction – DR registre de données • Commande des registres par deux signaux – RS : Register Selector relié à la broche C 3 du port parallèle différencie ces deux registres – E : Enable relié à la broche C 0 du port parallèle valide l’introduction des données dans les registres jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 13

Séquence d’écriture dans IR et DR Repos IR RS=0 E=0 Repos DR RS=1 E=0 Séquence d’écriture dans IR et DR Repos IR RS=0 E=0 Repos DR RS=1 E=0 Donnée → IR RS=0 E→ 0 jc/md/lp-01/05 Donnée → DR RS=1 E→ 0 Module d'affichage LCD sur le port parallèle : présentation 14

Commandes pour écrire IR • Signaux de commande en position de repos RS relié Commandes pour écrire IR • Signaux de commande en position de repos RS relié à C 3 et E relié à C 0 mais C 3 et C 0 sont complémentées d’où : commande. . 1 x x 1 (RS=0 E=0) • Mettre l’instruction sur le port parallèle D 0 -D 7 • Écrire cette instruction dans le registre IR commande. . 1 x x 0 (RS=0 E=1) • Retour à l’état de repos commande . . 1 x x 1 (RS=0 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 15

Commandes pour écrire DR • Signaux de commande en position de repos RS relié Commandes pour écrire DR • Signaux de commande en position de repos RS relié à C 3 et E relié à C 0 mais C 3 et C 0 sont complémentées d’où : commande. . 0 x x 1 (RS=1 E=0) • Mettre la donnée sur le port parallèle D 0 -D 7 • Écrire cette donnée dans le registre DR commande. . 0 x x 0 (RS=1 E=1) • Retour à l’état de repos commande . . 0 x x 1 (RS=1 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 16

Options • On peut commander la tension VDD avec la ligne C 2, ce Options • On peut commander la tension VDD avec la ligne C 2, ce qui évite une alimentation externe C 2 VDD 1 N 4148 + 1 µF • La ligne C 1 est réservée pour avoir un second signal Enable utilisé avec un afficheur à 4 lignes jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 17

Détail des commandes IR et DR • Afficheur LCD à deux lignes → C Détail des commandes IR et DR • Afficheur LCD à deux lignes → C 1 inutilisé, à 0 Alimentation par le port → C 2 toujours à 1 • Repos en prévision d’une commande pour IR %1101 = 0 x. D «CTRL» C 2=1 RS=0 E=0 • Entrée de la commande dans IR %1100 = 0 x. C «CTRLEN» C 2=1 RS=0 E=1 • Repos en prévision d’une commande pour DR %0101 = 0 x 5 «DATA» C 2=1 RS=1 E=0 • Entrée de la commande dans DR %0100 = 0 x 4 «DATAEN» C 2=1 RS=1 E=1 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 18

DDRAM du module LCD • Le module LCD contient une DDRAM gérée automatiquement par DDRAM du module LCD • Le module LCD contient une DDRAM gérée automatiquement par les écritures dans le registre DR • La donnée écrite dans le registre DR est transférée systématiquement dans la DDRAM à une adresse définie par un compteur d’adresse interne (AC) • AC incrémenté à chaque écriture dans DR • AC initialisé par écriture de l’instruction Set DDRAM address dans le registre IR jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 19

LCD à 2 lignes de 20 caractères DDRAM 0 x 00 0 x 13 LCD à 2 lignes de 20 caractères DDRAM 0 x 00 0 x 13 Première ligne 20 caractères 0 x 27 0 x 40 0 x 53 0 x 54 Seconde ligne 20 caractères 0 x 67 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 20

Instructions pour le LCD (1) • • • Clear Display: 0 x 01 Return Instructions pour le LCD (1) • • • Clear Display: 0 x 01 Return Home: 0 x 02 Entry Mode Set: 0 x 04 à 0 x 07 (%000001 I/D S) – I/D = 1 incrément – S = 0 pas de décalage • Display ON/OFF: 0 x 08 à 0 x 0 F (%00001 D C B) – D = 0 display OFF – C = 0 cursor OFF – B = 0 blink OFF jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 21

Instructions pour le LCD (2) • Function Set: 0 x 38 pour nous (%001 Instructions pour le LCD (2) • Function Set: 0 x 38 pour nous (%001 DL N F 00) – DL=1 Interface 8 bits – N=0 LCD à deux lignes (0 pour une ligne) – F=0 Matrice 5 x 7 • Set DDRAM address: 0 x 80 à 0 x. FF (%1 AAAAAAA) – AAAAAAA jc/md/lp-01/05 Adresse à placer dans le compteur AC Module d'affichage LCD sur le port parallèle : présentation 22

Initialisation du LCD • Timing à respecter après la mise sous tension • Séquence Initialisation du LCD • Timing à respecter après la mise sous tension • Séquence de commande obligatoire de configuration du LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 23

Timing à respecter après Power On jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle Timing à respecter après Power On jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 24

Séquence d’initialisation • RESET: Instruction 0 x 30 (Function Set: interface 8 bits) envoyée Séquence d’initialisation • RESET: Instruction 0 x 30 (Function Set: interface 8 bits) envoyée 3 fois • Display OFF • Display ON • Clear Display • Function Set: taille de l’interface, nombre de lignes et police. (non modifiable ensuite) • Mode Set: gestion affichage (décalage texte, incrément d’adresse mémoire) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 25

Exemple d’envoi de commande // Mise du port dans l’état repos commande WRITE_PORT_UCHAR(PARCOMMAND, CTRL); Exemple d’envoi de commande // Mise du port dans l’état repos commande WRITE_PORT_UCHAR(PARCOMMAND, CTRL); Sleep(15); // Attente de 15 ms après la mise sous tension // Function Set 1 (interface 8 bits) WRITE_PORT_UCHAR(PARDATA, 0 x 30); WRITE_PORT_UCHAR(PARCOMMAND, CTRLEN); Sleep(2); // Attente de 2 ms (signal ENABLE actif) WRITE_PORT_UCHAR(PARCOMMAND, CTRL); Sleep(5); // Attente de 5 ms jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 26

Travail à réaliser • • Préparer une plate-forme Préparer un driver à inclure Générer Travail à réaliser • • Préparer une plate-forme Préparer un driver à inclure Générer le noyau avec le driver Préparer une application Générer l’application sans l’inclure avec le noyau Télécharger le noyau dans la cible Exécuter l’application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 27

Driver • Le driver comprendra deux IOCTL – Écriture d’un caractère – Positionnement du Driver • Le driver comprendra deux IOCTL – Écriture d’un caractère – Positionnement du curseur • On définira un projet PARA_DRV de type WCE Dynamic Link Library à inclure dans le noyau • On créera un fichier PARA. def que l’on inclura dans le projet PARA_DRV jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 28

Application • L’application – écrira un texte sur la ligne 1 du LCD – Application • L’application – écrira un texte sur la ligne 1 du LCD – puis positionnera le curseur en début de ligne 2 – écrira un deuxième texte sur la ligne 2 • On définira l’application PARA_APP de type WCE Application à ne pas inclure dans le noyau jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 29

Driver jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 30 Driver jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 30

PARA. def jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 31 PARA. def jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 31

Driver (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC Driver (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CURSEUR CTL_CODE(FILE_DEVICE_UNKNOWN, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 32

Driver (2) // Définition des adresses du port parallèle #define PARBASE ((PUCHAR) 0 x Driver (2) // Définition des adresses du port parallèle #define PARBASE ((PUCHAR) 0 x 0378) #define PARDATA PARBASE #define PARCOMMAND PARBASE+2 // Définition des mots de commande #define CTRL 0 x. D #define CTRLEN 0 x. C #define DATA 0 x 5 #define DATAEN 0 x 4 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 33

Driver (3) BOOL APIENTRY Dll. Main(HANDLE h. Module, DWORD ul_reason_for_call, LPVOID lp. Reserved) { Driver (3) BOOL APIENTRY Dll. Main(HANDLE h. Module, DWORD ul_reason_for_call, LPVOID lp. Reserved) { return TRUE; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 34

Driver (4) DWORD PAR_Init(DWORD dw. Context) { DWORD dw. Ret = 1; RETAILMSG(1, (TEXT( Driver (4) DWORD PAR_Init(DWORD dw. Context) { DWORD dw. Ret = 1; RETAILMSG(1, (TEXT("PARA_DRV: PAR_Initn"))); // TODO: // Mise du port dans l’état repos commande jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 35

Driver (5) // TODO: // Envoi des trois Function Set de RESET // TODO: Driver (5) // TODO: // Envoi des trois Function Set de RESET // TODO: // Display OFF // TODO: // Display ON // TODO: // Clear Display // TODO: // Function Set (2 lignes, 8 bits) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 36

Driver (6) // TODO: // Mode Set (incrément, pas de décalage) // TODO: // Driver (6) // TODO: // Mode Set (incrément, pas de décalage) // TODO: // Mise du port dans l’état repos data return dw. Ret; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 37

Driver (11) BOOL PAR_Deinit(DWORD h. Device. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, Driver (11) BOOL PAR_Deinit(DWORD h. Device. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PARA_DRV: PAR_Deinitn"))); return b. Ret; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 38

Driver (12) DWORD PAR_Open(DWORD h. Device. Context, DWORD Access. Code, DWORD Share. Mode) { Driver (12) DWORD PAR_Open(DWORD h. Device. Context, DWORD Access. Code, DWORD Share. Mode) { DWORD dw. Ret = 1; RETAILMSG(1, (TEXT("PARA_DRV: PAR_Openn"))); return dw. Ret; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 39

Driver (13) BOOL PAR_Close(DWORD h. Open. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, Driver (13) BOOL PAR_Close(DWORD h. Open. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PARA_DRV: PAR_Closen"))); return b. Ret; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 40

Driver (14) BOOL PAR_IOControl(DWORD h. Open. Context, DWORD dw. Code, PBYTE p. Buf. In, Driver (14) BOOL PAR_IOControl(DWORD h. Open. Context, DWORD dw. Code, PBYTE p. Buf. In, DWORD dw. Len. In, PBYTE p. Buf. Out, DWORD dw. Len. Out, PDWORD pdw. Actual. Out) { int val; BOOL b. Ret; jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 41

Driver (15) switch(dw. Code) { // TODO: case IOCTL_PUTC: // TODO: case IOCTL_CURSEUR: jc/md/lp-01/05 Driver (15) switch(dw. Code) { // TODO: case IOCTL_PUTC: // TODO: case IOCTL_CURSEUR: jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 42

Driver (16) // TODO: // Positionnement du curseur // Préparation adresse du curseur // Driver (16) // TODO: // Positionnement du curseur // Préparation adresse du curseur // Mise du port en repos commande // Envoi de la commande de positionnement // Mise du port en repos data }// switch *pdw. Actual. Out=1; return b. Ret; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 43

Application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 44 Application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 44

Application (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC Application (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CURSEUR CTL_CODE(FILE_DEVICE_UNKNOWN, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 45

Application (2) int WINAPI Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPTSTR lp. Application (2) int WINAPI Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPTSTR lp. Cmd. Line, int n. Cmd. Show) { jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 46

Application (3) // TODO: // Déclarations et réservations // TODO: // Chargement du driver Application (3) // TODO: // Déclarations et réservations // TODO: // Chargement du driver // TODO: // Ouverture du driver // TODO: // Envoi première chaîne // TODO: // Positionnement du curseur au début de la ligne 2 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 47

Application (4) // TODO: // Envoi deuxième chaîne // TODO: // Fermeture des handles Application (4) // TODO: // Envoi deuxième chaîne // TODO: // Fermeture des handles return 0; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 48

Conclusion • Nous avons dû construire un driver et une application rudimentaires pour commander Conclusion • Nous avons dû construire un driver et une application rudimentaires pour commander un module d’affichage LCD installé sur un port parallèle standard de PC. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation 49