Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1584 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8
Page Suivante
Auteur Sujet :

[ Divers / C ] Ecrire pour un afficheur LCD

n°2110649
Profil sup​primé
Posté le 10-11-2011 à 01:30:46  answer
 

Reprise du message précédent :
Ca plante toujours à l'utilisation de firefox. Je vais faire tourner un peu.
 
La j'ai retrouvé le code qui fonction sans précondition, si ce n'est qu'il ne faux pas avoir planté l'afficheur avant.
 
Au boot ça marche, après j'ai capté quand l'intérompre ou pas. J'ai des programme pour récupérer un plantage. Faut que j'arrive à tout réunir. Et manquera plus que le buzy.

mood
Publicité
Posté le 10-11-2011 à 01:30:46  profilanswer
 

n°2110650
Profil sup​primé
Posté le 10-11-2011 à 02:19:56  answer
 


 
Je l'ai !  :D  

Code :
  1. void wait_LCD() {
  2.   unsigned char control = GetControl();
  3.   unsigned char data;
  4.  
  5.   while (data) {
  6.    
  7.     Set_RS(control);
  8.     usleep(1);
  9.    
  10.     usleep(1);
  11.     SetData(0xFF);         // Set All Pins to FF before read
  12.     Set_RW(control);
  13.     Set_E(control);        // Strobe command to LCD
  14.     usleep(4);
  15.     Clear_E(control);
  16.    
  17.     data = GetData();      // Read Data
  18.     data &= 0x80;          // Get high bit
  19.    
  20.    
  21.   }
  22.   Clear_E(control);
  23.   usleep(1);
  24.   Clear_RW(control);      // Avoid Bus conflict
  25.   Set_RS(control);
  26.   usleep(1);
  27. }


 
On peut même enlever maxtries, ça booste, et ça plante pas à l'usage de firefox.  
 
 
Gillooouuuuuuuuuu !
 [:chapi-chapo]

Message cité 1 fois
Message édité par Profil supprimé le 10-11-2011 à 02:23:39
n°2110651
Profil sup​primé
Posté le 10-11-2011 à 03:25:57  answer
 

J'ai fais une petite archive avec des exemple d'utilisation : GDM2004D.tar.gz

n°2110652
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 03:36:07  profilanswer
 

Sauf que si tu initialises pas  
unsigned char data;
avec une valeur non nulle, tu as pas de raison de passer dans la boucle si ton compilo initialise data à 0.
Il faut au moins déclarer
unsigned char data = 0xFF;
Sinon,  [:uriel]  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110658
Profil sup​primé
Posté le 10-11-2011 à 07:46:05  answer
 

En effet, ça marche pas. Arrfff !  :fou:  
Bonjour Gilou !  :jap:

n°2110661
Profil sup​primé
Posté le 10-11-2011 à 08:18:22  answer
 


Celui-là donnne cela

void:GDM2004D# ./lcd_sys  
DATAREG: f
DATAREG: 10
DATAREG: 11
DATAREG: 12
DATAREG: 80
DATAREG: 90
DATAREG: a1
DATAREG: ca
DATAREG: da
DATAREG: 0
DATAREG: 1
DATAREG: 2
DATAREG: 83
DATAREG: 4
DATAREG: 0
DATAREG: 81
DATAREG: 83
DATAREG: 5
DATAREG: 87
DATAREG: 8
DATAREG: 9
DATAREG: 88
DATAREG: 89
DATAREG: 8a
DATAREG: c
DATAREG: 8e
DATAREG: f
DATAREG: 90
DATAREG: 11
DATAREG: 92
DATAREG: 94
DATAREG: 95
DATAREG: 97
DATAREG: 18
DATAREG: 19
DATAREG: 40
DATAREG: c1
DATAREG: 42
DATAREG: c3
DATAREG: 44
DATAREG: c5
DATAREG: 46
DATAREG: 4f
DATAREG: c9
DATAREG: 4a
DATAREG: cc
DATAREG: ce
DATAREG: d0
DATAREG: d1
DATAREG: 5


 
 
Celui ci donne ceci...
 

void:GDM2004D# ./lcd_sys  
DATAREG: 0
DATAREG: 1
DATAREG: 2
DATAREG: 3
DATAREG: 80
DATAREG: 20
DATAREG: c4
DATAREG: 20
DATAREG: 80
DATAREG: 1
DATAREG: 82
DATAREG: 0
DATAREG: 81
DATAREG: 20
DATAREG: 84
DATAREG: 20
DATAREG: 86
DATAREG: 8
DATAREG: a
DATAREG: 88

n°2110665
Profil sup​primé
Posté le 10-11-2011 à 08:52:47  answer
 

Et celui là,

Code :
  1. void wait_LCD() {             // Cas RS=0, (Reception et) RW = 1                                                                                                                                                     
  2.   unsigned char busy = 0x80; // Mask for D7                                                                                                                                                                         
  3.   do {
  4.     outb(0x20, CONTROLREG); // Signal LCD with a strobe [0x28 2: Read, 8: RW E active]                                                                                                                               
  5.     busy &= inb(DATAREG);
  6.     printf("DATAREG: %x\n", inb(DATAREG));
  7.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]                                                                                                                                   
  8.     usleep(1);              // Wait before next strobe: 500 ns                                                                                                                                                       
  9.   } while (busy?1:0);
  10. }


 
Donne quelque chose comme ça, et fonctionne quelque itération de temps à autre.

DATAREG: 20
DATAREG: 6d
DATAREG: 35
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20
DATAREG: 20

n°2110704
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 10:56:06  profilanswer
 

Normalement, le DATAREG: 20 indique que
1) Le flag busy est a 0
2) l'adresse courante du curseur est (0, 0) [0x20 est la première adresse caractère en RAM LCD]
Donc ça semble relativement bon si c'est le cas.
Sauf que si tu positionnes pas le flag RW a 1 (on peut supposer que RS est par défaut à 0) il n'y a aucune raison que ce soit compris comme une demande de statut par le LCD  
Sans flag RW a 1 c'est pris comme une commande de mode 4 bit et une ligne (commande qui doit normalement échouer, car ce n'est faisable qu'au cours d'un reset soft).
[et en principe, il faut positionner le pin de direction du port parallèle pour lire des valeurs dans DATAREG, mais peut être que les ports modernes sont bidirectionnels sans qu'on ait besoin de le faire]
A+,

Message cité 1 fois
Message édité par gilou le 10-11-2011 à 11:06:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110732
Profil sup​primé
Posté le 10-11-2011 à 11:54:12  answer
 

gilou a écrit :

Normalement, le DATAREG: 20 indique que
1) Le flag busy est a 0
2) l'adresse courante du curseur est (0, 0) [0x20 est la première adresse caractère en RAM LCD]
Donc ça semble relativement bon si c'est le cas.
Sauf que si tu positionnes pas le flag RW a 1 (on peut supposer que RS est par défaut à 0) il n'y a aucune raison que ce soit compris comme une demande de statut par le LCD  
Sans flag RW a 1 c'est pris comme une commande de mode 4 bit et une ligne (commande qui doit normalement échouer, car ce n'est faisable qu'au cours d'un reset soft).
[et en principe, il faut positionner le pin de direction du port parallèle pour lire des valeurs dans DATAREG, mais peut être que les ports modernes sont bidirectionnels sans qu'on ait besoin de le faire]
A+,


 
 
Ce serait mieux comme ça ?
 

Code :
  1. void wait_LCD() {             // Cas RS=0, (Reception et) RW = 1                                                                             
  2.   unsigned char control;
  3.   unsigned char busy = 0x80; // Mask for D7                                                                                                 \
  4.                                                                                                                                            
  5.   do {
  6.     outb(0x20, CONTROLREG); // Signal LCD with a strobe [0x28 2: Read, 8: RW E active]                                                      \
  7.                                                                                                                                            
  8.     control = GetControl() ;
  9.     control &=0xFD;
  10.     control &=0xFE;
  11.     outb(control, CONTROLREG); // Signal LCD with a strobe [0x28 2: Read, 8: RW E active]                                                   \
  12.                                                                                                                                            
  13.     usleep(1);              // Wait before next strobe: 500 ns                                                                              \
  14.                                                                                                                                            
  15.     busy = 0x80; // Mask for D7                                                                                                             \
  16.                                                                                                                                            
  17.     busy &= inb(DATAREG);
  18.     printf("DATAREG: %x\n", inb(DATAREG));
  19.     usleep(1);              // Wait before next strobe: 500 ns                                                                              \
  20.                                                                                                                                            
  21.     outb(0x01, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]                                                           \
  22.                                                                                                                                            
  23.   } while (busy?1:0);
  24.   printf("\n" );
  25. }


 
Par contre j'ai rien à l'affichage.
 
Mais ça sort de buzy wait immédiatement.  Avec le même code qui marche sans busy wait.

n°2110741
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 12:27:02  profilanswer
 

outb(0x20, CONTROLREG); OK, tu te mets en mode DATA en lecture
control = GetControl() ; ?? Si tu viens d'y mettre 0x20 ça a pas du changer
control &=0xFD;  RW mis a 1
control &=0xFE;  E mis a 1
outb(control, CONTROLREG); envoi du strobe (si ca marche, OK, sinon, vaut mieux faire control &=0xFD; outb(control, CONTROLREG);control &=0xFE;outb(control, CONTROLREG);  
Le reste me semble bon.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 10-11-2011 à 12:27:02  profilanswer
 

n°2110746
Profil sup​primé
Posté le 10-11-2011 à 12:42:53  answer
 

gilou a écrit :


control = GetControl() ; ?? Si tu viens d'y mettre 0x20 ça a pas du changer
 


J'ai e0 après avoir mis 0x20.  :heink:
 

Citation :

si ca marche, OK, sinon, vaut mieux faire


 
Le comportement est pas le même. j'ai envoyer control à chaque nouvelle affectation, j'ai un curseur maintenant. Il se promène... Mais il est revenu !  [:shimay:1]


Message édité par Profil supprimé le 10-11-2011 à 12:46:07
n°2110760
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 13:48:01  profilanswer
 

Tu mets 0x20 dans control,  
soit 0010 0000
Tu lis la valeur, et tu trouves
e0
soit
1110 0000
C'est pas inquiétant, car en fait les deux bits du haut sont pas modifiables.
On peut considérer que tu as mis
xx10 0000
et que tu as lu ensuite
xx10 0000
Donc c'est bon.
 
> Le comportement est pas le même. j'ai envoyer control à chaque nouvelle affectation, j'ai un curseur maintenant. Il se promène... Mais il est revenu !
Ben si on lit le datasheet, RS et RW sont aux bonnes valeurs avant le strobe.
Donc faire un control pour RE (et RS) suivi d'un pour le strobe est conforme au datasheet. En faire un seul, non.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110775
Profil sup​primé
Posté le 10-11-2011 à 14:32:53  answer
 

J'ai pas compris ce qu'il faut que je fasse là...  
 
 
 
 
 
Je retravaille sur celui ci à part ça...

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. #include <time.h>
  6. // Base port cablé sur LPT1 ici                                                                                                                                                                                     
  7. #define BASEPORT    0x378
  8. #define DATAREG     BASEPORT+0
  9. #define STATUSREG   BASEPORT+1
  10. #define CONTROLREG  BASEPORT+2
  11. #define STROBE 0
  12. #define CTRL 1
  13. #define READ 2
  14. unsigned char clear_bit(int bit, unsigned char reg) {
  15.   switch (bit) {     
  16.   case 0 : { // STROBE
  17.     reg &= 0xFE;   
  18.     break;
  19.   }
  20.  
  21.   case 1 : { //CTRL   
  22.     reg &= 0xFD;
  23.    
  24.     break;
  25.   }
  26.   case 2 : { //READ
  27.         reg &= 0xF7;
  28.     break;
  29.   }
  30.   default :
  31.     return -1;
  32.   }
  33.   return reg;
  34. }
  35. unsigned char set_bit(int bit, unsigned char reg) {
  36.   switch (bit) {     
  37.   case 0 : { // STROBE
  38.     reg |= 0x01;
  39.    
  40.     break;
  41.   }
  42.  
  43.   case 1 : { //CTRL   
  44.     reg |= 0x02;
  45.    
  46.     break;
  47.   }
  48.   case 2 : { //READ
  49.     reg |= 0x08;
  50.    
  51.     break;
  52.   }
  53.   default :   
  54.     return -1;
  55.   }
  56.   return reg;
  57. }
  58. unsigned char WriteCommon (unsigned char value, unsigned char reg) {
  59.   unsigned char data = 0x00;
  60.   reg = clear_bit(READ, reg);
  61.   outb(reg, CONTROLREG);
  62.   usleep(1);
  63.   value = value & 0x0F;
  64.   value = value << 4;
  65.   data = data & 0x0F;
  66.   data = data | value;
  67.   outb(data, DATAREG);
  68.   reg = set_bit(STROBE, reg);
  69.   outb(reg, CONTROLREG);
  70.   usleep(4.5);
  71.   reg = clear_bit(STROBE, reg); 
  72.   outb(reg, CONTROLREG);
  73.   usleep(4.5);
  74.   return reg;
  75.  
  76. }
  77. unsigned char WriteData (unsigned char value, unsigned char reg) {
  78.   reg = set_bit(CTRL, reg);
  79.   outb(reg, CONTROLREG);
  80.   reg = WriteCommon(value >> 4, reg);
  81.   reg = WriteCommon(value, reg); 
  82.   return reg;
  83. }
  84. unsigned char WriteCtrl (unsigned char value, unsigned char reg) {
  85.   reg = clear_bit(CTRL, reg);
  86.   outb(reg, CONTROLREG);
  87.   reg = WriteCommon(value, reg);
  88.   return reg;
  89. }
  90. unsigned char WriteLcd (char * value, unsigned char reg) {
  91.   while (*value) {
  92.     reg = WriteData(*value++, reg);
  93.     usleep(1);
  94.   }
  95.   return reg;
  96. }
  97. unsigned char InitLcd (unsigned char reg) {
  98.   reg = WriteCtrl(0x03, reg);
  99.   usleep(4500);   
  100.   reg = WriteCtrl(0x03, reg);
  101.   usleep(45);   
  102.   reg = WriteCtrl(0x03, reg);
  103.   usleep(4.5);     
  104.   reg = WriteCtrl(0x01, reg);
  105.   usleep(4.5);
  106.   reg = WriteCtrl(0x06, reg);
  107.   usleep(4.5);
  108.   reg = WriteCtrl(0x38, reg);
  109.   usleep(4.5);
  110.   reg = WriteCtrl(0x0F, reg);
  111.   usleep(4.5);
  112.   return reg;
  113. }
  114. int main (int argc, char * argv[]) {
  115.   unsigned char control = 0x00;
  116.   if (ioperm(BASEPORT, 3, 1)) {
  117.     perror("can't set IO permissions!" );
  118.     return -1;
  119.   }
  120.  
  121.   control = InitLcd(control);
  122.   printf("main: InitLcd....with control = %x\n", control );
  123.   control = WriteLcd(argv[1], control);
  124.     printf("main: WriteLcd....with control = %x\n", control);
  125.   if (ioperm(BASEPORT, 3, 0)) {
  126.     perror("can't reset IO permissions!" );
  127.     return -1;
  128.   }
  129.   return control;
  130. }


 
Mais j'arrive pas à avoir le curseur.
 
Si non, j'ai ca dans la console.

void:gnu_lcd# ./glcd bonjour
main: InitLcd....with control = 0
main: WriteLcd....with control = 2

n°2110783
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 14:57:14  profilanswer
 

J'avais lu le code avec WriteCommon etc, mais il faisait rien de différent ni mieux que le notre IMHO.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110785
Profil sup​primé
Posté le 10-11-2011 à 15:06:30  answer
 

Bon, je repart sur la dernière bibliothèque. Tant pis pi pour Wait_LCD; qui est réduit à un usleep 2000.
 
 

n°2110791
Profil sup​primé
Posté le 10-11-2011 à 15:53:42  answer
 

Merci Gilou encore. Tu m'as bien aidé. Merci.

n°2111053
Profil sup​primé
Posté le 12-11-2011 à 04:14:24  answer
 

Le dernier code du moniteur système sur LCD.
On prend l'usage cpu dans la sortie d'une commande ps, le hostname avec gethostname, l'usage mémoire total (ram+swap) dans /proc/meminfo, on affiche tout ça avec la date et l'heure. 12 caractères sont réservés pour le hostname.

Code :
  1. /* Ce programme affiche les information de /proc/meminfo sur un L'afficheur LCD */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include "./libparalcd.h"
  7. #include <time.h>
  8. int main (void) {
  9.  
  10.  char date[20] = "date(20)\0";
  11.  char hour[9] = "hour(8)\0";
  12.  char hostname[13] = "hostname(12)\0";
  13.  
  14.  char dummy[4096] = "\0";
  15.  
  16.  char file[] = "/proc/meminfo\0";
  17.  FILE *fp;
  18.  FILE *cpufp;  
  19.  char valeur[10] = "\0";
  20.  char name[10] = "\0";
  21.  char label_mem[]  = "mem : \0";
  22.  char label_cpu[]  = "cpu : \0";
  23.  
  24.  float mem_total,  mem_free, mem_used, mem_swap = 0.0;
  25.    
  26.  time_t current_date = time(NULL);
  27.  
  28.  int i = 0;
  29.    
  30.  char *p_conv = NULL;
  31.  
  32.  char value_total[14] = "\0";
  33.  char value_cpu[14] = "\0";
  34.  if (system(dummy)) return (1);
  35.      
  36.  
  37.  if (ioperm(BASEPORT, 3, 1)) {
  38.    perror("can't set IO permissions!" );
  39.    return -1;
  40.  }
  41.    
  42.  InitPort();
  43.  
  44.  while (1) {    
  45.    
  46.    LCD_Init();  
  47.    usleep(200);
  48.    
  49.    LCD_ClearDisplay();
  50.    SetPosition_LCD(1, 1);
  51.    usleep(1);      
  52.    LCD_WriteString(date);
  53.    usleep(1);      
  54.    SetPosition_LCD(2, 1);
  55.    usleep(1);  
  56.    LCD_WriteString(hostname);        
  57.    usleep(1);        
  58.    SetPosition_LCD(2, 13);      
  59.    usleep(1);
  60.    LCD_WriteString(hour);
  61.    usleep(1);
  62.    SetPosition_LCD(3, 1);
  63.    usleep(1);
  64.    LCD_WriteString(label_cpu);
  65.    usleep(1);
  66.    LCD_WriteString(value_cpu);    
  67.    usleep(1);
  68.    SetPosition_LCD(4, 1);
  69.    usleep(120);
  70.    LCD_WriteString(label_mem);
  71.    LCD_WriteString(value_total);
  72.    SetPosition_LCD(3, 12);
  73.    port_clear();
  74.    usleep(500000);    
  75.        
  76.    fp = fopen(file, "r" );
  77.    if (!fp) {
  78.      perror("/proc/meminfo" );
  79.      return -1;
  80.    }
  81.    
  82.    for (i = 1; i <= 13 ; i++) {
  83.      fscanf(fp, "%s%s%s\n", name, valeur, dummy);  
  84.      current_date = time(NULL);
  85.  
  86.      switch (i) {
  87.  
  88.      case 1 : {
  89.      
  90.     mem_total = (float)strtol(valeur, &p_conv, 10);    
  91.     break;
  92.      }
  93.      case 2 : {
  94.     
  95.     mem_free = (float)strtol(valeur, &p_conv, 10);    
  96.     break;
  97.      }
  98.     
  99.      case 12 : {
  100.         
  101.     mem_swap = (float)strtol(valeur, &p_conv, 10);
  102.     break;
  103.      }
  104.     
  105.  
  106.      case 13 : {
  107.     
  108.     
  109.     mem_swap = ((mem_swap - (float)strtol(valeur, &p_conv, 10))*100)/mem_swap;
  110.     mem_used = (((mem_total-mem_free)*100)/mem_total)+mem_swap;
  111.     sprintf(value_total, "%f", mem_used);
  112.     
  113.     break;
  114.      }
  115.      }
  116.    }
  117.    fclose(fp);    
  118.    gethostname(hostname, sizeof(hostname));    
  119.    usleep(1);
  120.    strcpy(value_cpu, "     " );
  121.    cpufp = popen("ps aux| awk 'NR > 0 { s +=$3 }; END {print s}'","r" );
  122.    fread(value_cpu, 1, sizeof(value_cpu)-1, cpufp);
  123.    fclose(cpufp);
  124.  
  125.    current_date = time(NULL);
  126.    strftime(date, sizeof(date), "%a %d %b %Y", localtime(&current_date));
  127.    strftime(hour, sizeof(hour), "%H:%M:%S", localtime(&current_date));    
  128.    usleep(350000);        
  129.  }
  130.  if (ioperm(BASEPORT, 3, 0)) {
  131.    perror("can't reset IO permissions!" );
  132.    return -1;
  133.  }
  134.  return 0;
  135. }


 
Ca qui donne quelque chose comme ça


Sat 12 Nov 2011
hostname(12)03:35:00
cpu : 19.6
mem : 27.774


Message édité par Profil supprimé le 12-11-2011 à 11:42:48
n°2111057
Profil sup​primé
Posté le 12-11-2011 à 06:10:33  answer
 

Gros éditage du code ci-dessus, cette fois c'est bon, j'ai fini.  

Spoiler :

Pour le moment.  :D

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C] Modifier un tableau existant ... pour bouger un pion ![C# / .Net] Migration OS 32Bits vers OS 64Bits. Quid des Perfs?
[C#] FormView, edit/insert mode[C] programme cherche les racines des polynomes
[C] trouver la longueur de la plus longue suite decroissante en CC++, Compter des caractères ...
Linux C/C++ broadcast UDP sur machine sans gatewayConvolution de 2 tableaux unidimensionnels avec FFTW C++
Plus de sujets relatifs à : [ Divers / C ] Ecrire pour un afficheur LCD


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR