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

 


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

[ Divers / C ] Ecrire pour un afficheur LCD

n°2109983
Profil sup​primé
Posté le 06-11-2011 à 08:04:23  answer
 

Reprise du message précédent :
Bonjour gilou.
 
J'arrive au getchar du main, mais j'affiche rien.
J'ai mis des délais de 500ns un peu partout, ça donne pas mieux.
 
A la fin de l'exécution tous les pin de données sont à 1.

Message cité 1 fois
Message édité par Profil supprimé le 06-11-2011 à 10:33:47
mood
Publicité
Posté le 06-11-2011 à 08:04:23  profilanswer
 

n°2109992
Profil sup​primé
Posté le 06-11-2011 à 11:17:53  answer
 

Maintenant ça affiche "  H e l l o"
                                " J o v a l i s e" sur les 3 et 4ieme ligne
 
J'ai touché à rien.  :pt1cable:
 
[:rofl]

Message cité 2 fois
Message édité par Profil supprimé le 06-11-2011 à 11:19:10
n°2109993
Profil sup​primé
Posté le 06-11-2011 à 11:44:02  answer
 


 
Arff, zut, zut, et re-zut, c'est le code suivant qui a cet effet, le code original fonctionne toujour pas apparemment, mais je suis plus sûr de rien là, en fait.
 

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. // Clear E : outb(control |= 0x01, CONTROLREG);  
  12. // Clear RW: outb(control |= 0x02, CONTROLREG);  
  13. // Clear RS: outb(control |= 0x08, CONTROLREG);
  14. // Set E   : outb(control &= 0xFE, CONTROLREG);
  15. // Set RW  : outb(control &= 0xFD, CONTROLREG);  
  16. // Set RS  : outb(control &= 0xF7, CONTROLREG);
  17. // Set incoming: outb(control |= 0x20, CONTROLREG);
  18. // Set outgoing: outb(control &= 0xD0, CONTROLREG);
  19. #define Clear_E(z)   outb(z |= 0x01, CONTROLREG)
  20. #define Clear_RW(z)  outb(z |= 0x02, CONTROLREG)
  21. #define Clear_RS(z)  outb(z |= 0x08, CONTROLREG)
  22. #define Set_E(z)     outb(z &= 0xFE, CONTROLREG)
  23. #define Set_RW(z)    outb(z &= 0xFD, CONTROLREG)
  24. #define Set_RS(z)    outb(z &= 0xF7, CONTROLREG)
  25. #define DataIn(z)    outb(control |= 0x20, CONTROLREG)
  26. #define DataOut(z)   outb(control &= 0xD0, CONTROLREG)
  27. #define GetControl() inb(CONTROLREG)
  28. #define GetData()    inb(DATAREG)
  29. #define SetData(z)   outb(z, DATAREG)
  30. #define REGISTERY_DELAY 500
  31. void wait_LCD() {
  32.  unsigned char control = GetControl();
  33.  unsigned char data = 0xFF;
  34.  int maxtries = 255;
  35.  while (data && maxtries) {
  36.    Clear_E(control);          
  37.    Clear_RS(control);  
  38.    Set_RW(control);    
  39.    SetData(0xFF);         // Set All Pins to FF before read
  40.    DataIn(control);    
  41.    Set_E(control);        // Strobe command to LCD
  42.    data = GetData();      // Read Data
  43.    data &= 0x80;          // Get high bit
  44.    DataOut(control);    
  45.    --maxtries;
  46.  }
  47.  Clear_E(control);    
  48.  Clear_RW(control);      // Avoid Bus conflict
  49. }
  50. void LCD_Init(){
  51.  unsigned char control = GetControl();
  52.  
  53.  Clear_RS(control);  
  54.  nanosleep(0, 100);
  55.  Set_E(control);
  56.  nanosleep(0, 100);
  57.  SetData(0x38);      // 8 bits, 2 lignes, (Fonte 5x8)
  58.  Clear_E(control);
  59.  nanosleep(0, REGISTERY_DELAY);
  60.  wait_LCD();
  61.  Clear_RS(control);
  62.  nanosleep(0, 100);
  63.  
  64.  nanosleep(0, 300);
  65.  Set_E(control);
  66.  SetData(0x0F);      // Display ON Cursor ON
  67.  nanosleep(0, REGISTERY_DELAY);
  68.  Clear_E(control);
  69.  wait_LCD();  
  70.  Clear_RS(control);
  71.  nanosleep(0, 1000);
  72.  
  73.  nanosleep(0, 100);
  74.  Set_E(control);
  75.  SetData(0x06);      // Left -> Right
  76.  nanosleep(0, 300);
  77.  Clear_E(control);
  78.  nanosleep(0, REGISTERY_DELAY);
  79.  wait_LCD();
  80. }
  81. void LCD_ClearDisplay() {
  82.  unsigned char control = GetControl();
  83.  nanosleep(0, 100);
  84.  Clear_RS(control);
  85.  nanosleep(0, 100);
  86.  
  87.  nanosleep(0, 300);
  88.  Set_E(control);
  89.  SetData(0x01);
  90.  nanosleep(0, 300);
  91.  Clear_E(control);
  92.  nanosleep(0, REGISTERY_DELAY);
  93.  wait_LCD();
  94. }
  95. void LCD_WriteChar(char c) {
  96.  unsigned char control = GetControl();
  97.  nanosleep(0, 100);
  98.  Set_RS(control);
  99.  nanosleep(0, 100);  
  100.  nanosleep(0, 300);
  101.  Set_E(control);
  102.  nanosleep(0, 100);
  103.  SetData(c);
  104.  nanosleep(0, 100);
  105.  Clear_E(control);  
  106.  nanosleep(0, REGISTERY_DELAY);
  107.  wait_LCD();
  108.  usleep(5000);
  109. }
  110. void LCD_WriteString(char *s) {
  111.  while (*s)
  112.    LCD_WriteChar(*s++);
  113. }
  114. void LCD_CursorStartLine1() {
  115.  unsigned char control = GetControl();
  116.  
  117.  Clear_RS(control);
  118.  SetData(0x80);
  119.  Set_E(control);
  120.  Clear_E(control);
  121.  wait_LCD();
  122. }
  123. void LCD_CursorStartLine2() {
  124.  unsigned char control = GetControl();
  125.  
  126.  Clear_RS(control);
  127.  SetData(0xC0);
  128.  Set_E(control);
  129.  Clear_E(control);
  130.  wait_LCD();
  131. }
  132. int main (int argc, char * argv[]) {
  133.  if (ioperm(BASEPORT, 3, 1)) {
  134.    perror("can't set IO permissions!" );
  135.    return -1;
  136.  }
  137.  LCD_Init();
  138.  usleep(REGISTERY_DELAY);
  139.  LCD_ClearDisplay();
  140.  usleep(REGISTERY_DELAY);
  141.  LCD_WriteString("          Hello" );
  142.  LCD_CursorStartLine2();
  143.  LCD_WriteString("          Jovalise" );
  144.  printf("Taper quelque chose pour quitter le programme\n" );
  145.  getchar();
  146.  if (ioperm(BASEPORT, 3, 0)) {
  147.    perror("can't reset IO permissions!" );
  148.    return -1;
  149.  }
  150.  return 0;
  151. }


 
Si tu vois la nuance.. Ls SetData sont placer entre les Set_E et les Clear_E !

Message cité 2 fois
Message édité par Profil supprimé le 06-11-2011 à 11:47:36
n°2109996
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 12:42:45  profilanswer
 

Tu ne peux pas mettre de délais de 500 ns, vu que usleeep est en micro secondes, et que vu la fiche constructeur, usleep(1) dot largement être suffisant.
 
Les pins de donnée a 1, tous?  
En fin de programme, le dernier ordre exécuté pour le registre data est un wait_LCD du LCD_WriteChar('!')
On est à la position 8 de la seconde ligne
On devrait donc avoir dans le registre de données le flag en bit de poids haut et pour le reste, l'adresse mémoire: On est en 2e ligne, donc on démarre a 0x40, on écrit 9 caractères: on ajoute 8 (on compte à partir de 0) 0x40 + 8 = 0x48 et on avance le curseur de une position automatiquement après écriture: 0x49
On doit donc avoir dans data 0x49 = 01001001 si le flag busy est à 0, et 0xC9 = 11001001 si le flag busy est a 1.
 
Ce programme est une simple transcription de ce qui est à cette page: http://www.8052.com/tutlcd
 
Bon, en le simplifiant au max, et en ajoutant des délais normaux (en supposant que le PC a une clock trop rapide par rapport au LCD), ça donne ceci:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. // Base port cablé sur LPT1 ici
  6. #define BASEPORT    0x378
  7. #define DATAREG     BASEPORT+0
  8. #define STATUSREG   BASEPORT+1
  9. #define CONTROLREG  BASEPORT+2
  10. // Clear E : outb(control |= 0x01, CONTROLREG);  
  11. // Clear RW: outb(control |= 0x02, CONTROLREG);  
  12. // Clear RS: outb(control |= 0x08, CONTROLREG);
  13. // Set E   : outb(control &= 0xFE, CONTROLREG);
  14. // Set RW  : outb(control &= 0xFD, CONTROLREG);  
  15. // Set RS  : outb(control &= 0xF7, CONTROLREG);
  16. // Set incoming: outb(control |= 0x20, CONTROLREG);
  17. // Set outgoing: outb(control &= 0xD0, CONTROLREG);
  18. #define Clear_E(z)   outb(z |= 0x01, CONTROLREG)
  19. #define Clear_RW(z)  outb(z |= 0x02, CONTROLREG)
  20. #define Clear_RS(z)  outb(z |= 0x08, CONTROLREG)
  21. #define Set_E(z)     outb(z &= 0xFE, CONTROLREG)
  22. #define Set_RW(z)    outb(z &= 0xFD, CONTROLREG)
  23. #define Set_RS(z)    outb(z &= 0xF7, CONTROLREG)
  24. #define DataIn(z)    outb(control |= 0x20, CONTROLREG)
  25. #define DataOut(z)   outb(control &= 0xD0, CONTROLREG)
  26. #define GetControl() inb(CONTROLREG)
  27. #define GetData()    inb(DATAREG)
  28. #define SetData(z)   outb(z, DATAREG)
  29. void wait_LCD() {
  30.     unsigned char control = GetControl();
  31.     unsigned char data = 0xFF;
  32.     int maxtries = 255;
  33.     while (data && maxtries) {
  34. Clear_E(control); 
  35. usleep(1);
  36. Clear_RS(control); 
  37. Set_RW(control);
  38. usleep(1);     
  39. SetData(0xFF);         // Set All Pins to FF before read
  40. DataIn(control);     
  41. Set_E(control);        // Strobe command to LCD
  42. usleep(1);
  43. data = GetData();      // Read Data
  44. data &= 0x80;          // Get high bit
  45. DataOut(control);     
  46. --maxtries;
  47.     }
  48.     Clear_E(control); 
  49.     usleep(1);   
  50.     Clear_RW(control);      // Avoid Bus conflict
  51.     usleep(1);
  52. }
  53. void LCD_Init(){
  54.     unsigned char control = GetControl();
  55.    
  56.     // On va utiliser les valeurs par défaut
  57.     /* **************************************************
  58.     Clear_RS(control);  
  59.     usleep(1);   
  60.     SetData(0x38);      // 8 bits, 2 lignes, (Fonte 5x8)
  61.     Set_E(control);  
  62.     usleep(1);   
  63.     Clear_E(control);
  64.     usleep(1);   
  65.     wait_LCD();
  66.     *************************************************** */
  67.     Clear_RS(control);
  68.     usleep(1); 
  69.     SetData(0x0E);      // Display ON Cursor ON
  70.     Set_E(control);
  71.     usleep(1); 
  72.     Clear_E(control);
  73.     usleep(1); 
  74.     wait_LCD();
  75.     Clear_RS(control);
  76.     usleep(1); 
  77.     SetData(0x06);      // Left -> Right
  78.     Set_E(control);
  79.     usleep(1); 
  80.     Clear_E(control);
  81.     usleep(1); 
  82.     wait_LCD();
  83. }
  84. void LCD_ClearDisplay() {
  85.     unsigned char control = GetControl();
  86.     Clear_RS(control);
  87.     usleep(1); 
  88.     SetData(0x01);
  89.     Set_E(control);
  90.     usleep(1); 
  91.     Clear_E(control);
  92.     usleep(1); 
  93.     wait_LCD();
  94. }
  95. void LCD_WriteChar(char c) {
  96.     unsigned char control = GetControl();
  97.    
  98.     Set_RS(control);
  99.     usleep(1); 
  100.     SetData(c);
  101.     Set_E(control);
  102.     usleep(1); 
  103.     Clear_E(control);
  104.     usleep(1); 
  105.     wait_LCD();
  106. }
  107. void LCD_WriteString(char *s) {
  108.     while (*s)
  109. LCD_WriteChar(*s++);
  110. }
  111. void LCD_CursorStartLine1() {
  112.     unsigned char control = GetControl();
  113.    
  114.     Clear_RS(control);
  115.     usleep(1); 
  116.     SetData(0x80);
  117.     Set_E(control);
  118.     usleep(1); 
  119.     Clear_E(control);
  120.     usleep(1); 
  121.     wait_LCD();
  122. }
  123. void LCD_CursorStartLine2() {
  124.     unsigned char control = GetControl();
  125.    
  126.     Clear_RS(control);
  127.     usleep(1); 
  128.     SetData(0xC0);
  129.     Set_E(control);
  130.     usleep(1); 
  131.     Clear_E(control);
  132.     usleep(1); 
  133.     wait_LCD();
  134. }
  135. int main (int argc, char * argv[]) {
  136.     if (ioperm(BASEPORT, 3, 1)) {
  137. perror("can't set IO permissions!" );
  138. return -1;
  139.     }
  140.     LCD_Init();
  141.     LCD_ClearDisplay();
  142.     LCD_WriteString("Hello" );  // En sortie, on doit avoir 00000101 ou 10000101 dans les pins data  
  143.                                // selon que le flag est busy ou pas
  144.     // LCD_CursorStartLine2();
  145.     // LCD_WriteString("Jovalise!" );
  146.     printf("Taper quelque chose pour quitter le programme\n" );
  147.     getchar();
  148.     if (ioperm(BASEPORT, 3, 0)) {
  149. perror("can't reset IO permissions!" );
  150. return -1;
  151.     }
  152.     return 0;
  153. }


 
Si ça marche pas, alors que c'est issu d'un truc vraiment standard, je vois pas trop ce que je peux faire de plus.
 
A+,
 
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109997
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 12:43:53  profilanswer
 

Ah ben c'est exactement ce que ça devait faire (aux adressage de ligne près).
Je vais bouffer la.
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109998
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 12:45:31  profilanswer
 


Je regarde après mon repas.  
A+,


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

gilou a écrit :

Tu ne peux pas mettre de délais de 500 ns, vu que usleeep est en micro secondes, et que vu la fiche constructeur, usleep(1) dot largement être suffisant.


J'ai utilisé nanosleep.  :whistle:  

gilou a écrit :


Les pins de donnée a 1, tous?  


Avec le code que tu vien de poster il sont tous à 1 en fin d'exécution.

gilou a écrit :


 
Si ça marche pas, alors que c'est issu d'un truc vraiment standard, je vois pas trop ce que je peux faire de plus.
 
A+,


T'as vu mon dernier post ?
Mais non, ce code ne fonctionne pas non plus. :/
 
Ce que tu peux faire c'est me dire ou je t'envoie la boutanche.  
Tu as déjà fait pas mal.
 
Avec les version qui vont bien, j'affiche du texte fixe, j'en  fait défiler un peu mais ça fini par planter mais je vais bien trouver l'astuce.
 
Par contre pour l'avant dernier code que tu as posté, la séparation des caractère tu vois pas d'où ça peut provenir ?

n°2110000
Profil sup​primé
Posté le 06-11-2011 à 12:58:14  answer
 

gilou a écrit :

Ah ben c'est exactement ce que ça devait faire (aux adressage de ligne près).
Je vais bouffer la.
A+,
 


 
Ah Ok :/
 

gilou a écrit :


Je regarde après mon repas.  
A+,


 
Bon appétit.

n°2110002
Profil sup​primé
Posté le 06-11-2011 à 13:08:55  answer
 

Ca marche plus, il y a un problème à l'initialisation.

n°2110003
Tamahome
⭐⭐⭐⭐⭐
Posté le 06-11-2011 à 13:15:38  profilanswer
 

[:hugeq:1]

mood
Publicité
Posté le 06-11-2011 à 13:15:38  profilanswer
 

n°2110004
Profil sup​primé
Posté le 06-11-2011 à 13:19:40  answer
 

j'ai changé ces lignes :

Code :
  1. #define Set_E(z)     outb(z &= 0xFE, CONTROLREG)
  2. #define Set_RW(z)    outb(z &= 0xFD, CONTROLREG)
  3. #define Set_RS(z)    outb(z &= 0xF7, CONTROLREG)


 
J'ai mis 0(zero) à la place de F, un coup et j'ai remis F, et ça remarche.

n°2110007
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 13:45:47  profilanswer
 


J'ai pas bien compris.
Mais si ce F a posé problème, c'est peut être a cause d'une valeur initiale du flag émission/réception mauvaise.
Initialiser le port en mode émission serait sans doute pas une mauvaise idée alors.
 

Code :
  1. void InitPort() {
  2.     unsigned char control = GetControl();
  3.     Clear_RW(control); // On met le port de données en mode || -> LCD par defaut
  4. }


 
et tu ajoutes dans le main, l'appel à InitPort avant le LCD_Init:

Code :
  1. ...
  2.     InitPort();
  3.     LCD_Init();
  4. ...


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110009
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 13:48:03  profilanswer
 

Quand ça marche, les caractères, ils sont toujours séparés?
A+,


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

gilou a écrit :

Quand ça marche, les caractères, ils sont toujours séparés?
A+,


 
Oui.

n°2110014
Profil sup​primé
Posté le 06-11-2011 à 13:56:36  answer
 

gilou a écrit :


J'ai pas bien compris.
Mais si ce F a posé problème, c'est peut être a cause d'une valeur initiale du flag émission/réception mauvaise.
Initialiser le port en mode émission serait sans doute pas une mauvaise idée alors.
 

Code :
  1. void InitPort() {
  2.     unsigned char control = GetControl();
  3.     Clear_RW(control); // On met le port de données en mode || -> LCD par defaut
  4. }


 
et tu ajoutes dans le main, l'appel à InitPort avant le LCD_Init:

Code :
  1. ...
  2.     InitPort();
  3.     LCD_Init();
  4. ...


A+,


 
Non, il y a autre chose, et c'est bien les trois qu'il faux changer. un ou deux ne suffisent pas.


Message édité par Profil supprimé le 06-11-2011 à 13:57:00
n°2110016
Profil sup​primé
Posté le 06-11-2011 à 14:19:46  answer
 

Si j'exécute ce code : (c'est un simple code d'exploitation de la bibliothèque suivante)

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <libparalcd.h>
  6.  
  7. int main (void)
  8. {
  9.  if (ioperm(BASEPORT, 3, 1)) {
  10.    perror("can't set IO permissions!" );
  11.    return -1;
  12.  }
  13.  
  14.  int i;
  15.  int position = 17;
  16.  char Text1[9] = {'H', 'e', 'l', 'l', 'o', '.', '.', '.', ' '};
  17.  char Text2[11] = {'H', 'a', 'r', 'd', 'w', 'a', 'r', 'e', '.', 'f', 'r'};
  18.  
  19.  LCD_SoftReset(1,1,0); // Ce serait bien de tester ceci aussi
  20.  usleep(500);
  21.  LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink  
  22.  
  23.  
  24.  LCD_Position(position);      
  25.  for (i = 0; i <= 8 ; i++) {
  26.    int j;
  27.    for (j = 0 ; j <= i ; j++) {
  28.      LCD_WriteChar(Text1[j]);        
  29.      usleep(5000);
  30.    }
  31.    
  32.    position = position - 1;
  33.    LCD_Position(position);
  34.    usleep(5000);
  35.  }
  36.  position = 82;
  37.  
  38.  LCD_Position(position);
  39.  sleep(1);
  40.  for (i = 0; i <= 10 ; i++) {
  41.    int j;
  42.    
  43.    for (j = 0 ; j <= 10 ; j++) {
  44.      LCD_WriteChar(Text2[j]);        
  45.      usleep(5000);
  46.    }
  47.    position = position - 1;
  48.    
  49.    LCD_Position(position);
  50.    usleep(5000);
  51.  }  
  52.  
  53.  
  54.  sleep(2);
  55.  LCD_SoftReset(1,1,0); // Ce serait bien de tester ceci aussi
  56.  usleep(5000);
  57.  LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink  
  58.  usleep(5000);
  59.  LCD_Home();
  60.  usleep(5000);  
  61.  //position = 24;  
  62.  //LCD_Position(position);
  63.  sleep(1);
  64.  for (i = 176; i <= 255 ; i++) {
  65.    
  66.    LCD_WriteChar(i);        
  67.    usleep(5000);
  68.  }  
  69.  
  70.  LCD_Home();
  71.  
  72.  if (ioperm(BASEPORT, 3, 0)) {
  73.    perror("can't reset IO permissions!" );
  74.    return -1;
  75.  }  
  76.  return 0;
  77. }


 
A avec cette bibliothèque

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/io.h>
  6.  
  7. // Base port cablé sur LPT1 ici
  8. #define BASEPORT    0x378
  9. #define DATAREG     BASEPORT+0
  10. #define STATUSREG   BASEPORT+1
  11. #define CONTROLREG  BASEPORT+2
  12. /* ***************************************************************************** */
  13. /*                       Commandes de bas niveau                                 */
  14. /* ***************************************************************************** */
  15. // Envoi de commandes SPP -> LCD
  16. void send_cmd(unsigned char cmd) { // Cas RS=0, (Emission et) RW=0
  17.  outb(cmd, DATAREG);        // Set command in DATA
  18.  usleep(10);              // Strobe duration: 500 ns  
  19.  outb(0x0A,    CONTROLREG); // Signal LCD with a strobe [0x0A 0: Emission, A: E active]
  20.  usleep(10);                 // Strobe duration: 500 ns    
  21.  outb(0x0B,    CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  22.  usleep(50);                 // Wait before next strobe: 500 ns
  23. }
  24. // Envoi d'un caractere SPP -> LCD
  25. void send_char(char c) {    // Cas RS=1, (Ecriture et) RW = 0
  26.  outb(c,    DATAREG);    // Set command in DATA
  27.  usleep(10);              // Strobe duration: 500 ns  
  28.  outb(0x02, CONTROLREG); // Signal LCD with a strobe [0x02 0: Emission, 2: RS E active]
  29.  usleep(10);              // Strobe duration: 500 ns  
  30.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  31.  usleep(50);              // Wait before next strobe: 500 ns
  32. }
  33. // Lecture addresse courante RAM LCD -> SPP
  34. unsigned char address_read (void) { // Cas RS=0, (Reception et) RW = 1
  35.  unsigned char address = 0x7F; // Mask for D6..D0
  36.  
  37.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  38.  outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Reception, 8: RW E active]
  39.  usleep(10);              // Strobe duration: 500 ns
  40.  address &= inb(DATAREG);
  41.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  42.  usleep(20);              // Wait before next strobe: 500 ns
  43.  return address;
  44. }
  45. // Test du flag busy du LCD.  
  46. int is_busy() {             // Cas RS=0, (Reception et) RW = 1
  47.  unsigned char busy = 0x80; // Mask for D7
  48.  
  49.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  50.  outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Read, 8: RW E active]
  51.  usleep(5);              // Strobe duration: 500 ns
  52.  busy &= inb(DATAREG);
  53.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  54.  usleep(50);              // Wait before next strobe: 500 ns
  55.  return (busy?1:0);
  56. }
  57.  
  58. // Lecture valeur a l'addresse courante RAM LCD -> SPP
  59. unsigned char data_read (void){   // Cas RS=1, (Reception et) RW = 1
  60.  unsigned char data;
  61.  
  62.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  63.  outb(0x20, CONTROLREG); // Signal LCD with a strobe [0x20 2: Read, 0: RS RW E active]
  64.  usleep(10);              // Strobe duration: 500 ns  
  65.  data = inb(DATAREG);
  66.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  67.  usleep(20);              // Wait before next strobe: 500 ns
  68.  return data;
  69. }
  70.  
  71. void port_clear (void) {
  72.  outb(0x0B, CONTROLREG);
  73.  usleep(20);
  74. }
  75.  
  76. void LCD_Position(int pos) {
  77.  outb(0x08, CONTROLREG);
  78.  usleep(20);
  79.  outb(128+pos, DATAREG);
  80.  usleep(20);
  81.  outb(0x0A,    CONTROLREG); // Signal LCD with a strobe [0x0A 0: Emission, A: E active]
  82.  usleep(10);                 // Strobe duration: 500 ns    
  83.  outb(0x0B,    CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  84.  usleep(50);                 // Wait before next strobe: 500 ns
  85. }
  86.  
  87. /* ***************************************************************************** */
  88. /*                       Commandes du LCD                                        */
  89. /* ***************************************************************************** */
  90. // cas 00000001
  91. void LCD_Clear() {
  92.  unsigned char command = 0x01;  // Clear command
  93.  send_cmd(command);
  94.  while (is_busy())
  95.    usleep(10);
  96.    //{ printf("Clear\n" ); }
  97.    
  98.  /* wait */
  99. }
  100. // cas 0000001x
  101. void LCD_Home() {
  102.  unsigned char command = 0x02;  // Home command
  103.  printf("Home\n" );
  104.  send_cmd(command);
  105.  //while (is_busy()) ;
  106.  
  107.  //usleep(10);
  108.  /* wait */
  109. }
  110. // cas 000001xx
  111. void LCD_EntryMode(int lr, int shift) {
  112.  unsigned char command = 0x04;  // Entry Mode command
  113.  if (lr)      command |= 0x02; // Left -> Right [else Right Left] default
  114.  if (shift)   command |= 0x01; // Shift visible  
  115.  send_cmd(command);
  116.  while (is_busy())    
  117.    //  { printf("EntryMode\n" ); }
  118.  usleep(10);
  119.  /* wait */
  120. }
  121. // cas 00001xxx
  122. void LCD_Display(int on, int cursor, int blink) {
  123.  unsigned char command = 0x08;  // DISPLAY command
  124.  if (on)      command |= 0x04; // Display on/off bit
  125.  if (cursor)  command |= 0x02; // Cursor on/off bit
  126.  if (blink)   command |= 0x01; // Cursor blink on/off bit
  127.  send_cmd(command);
  128.  //  { printf("Display\n" ); }
  129.  while (is_busy())            
  130.    usleep(10);
  131.  /* wait */
  132.      
  133. }
  134. // cas 0001xxxx -> LCD CursorMove (et Display Move)
  135. // cas 001xxxxx
  136. void LCD_Mode(int size8, int line2, int bigfont) {
  137.  unsigned char command = 0x20;  // Mode command
  138.  if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  139.  if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  140.  if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  141.  printf("Mode !\n" );
  142.  send_cmd(command);
  143.  while (is_busy())    
  144.    usleep(10);
  145.  /* wait */;
  146. }
  147.  
  148.  
  149.  
  150. // cas 01xxxxxx -> LCD Set CGRAM
  151. // cas 1xxxxxxx -> LCD Set DDRAM
  152. /* ***************************************************************************** */
  153. /*                       Fonctions de "haut niveau"                              */
  154. /* ***************************************************************************** */
  155. // Ecriture d'un caractère
  156. void LCD_WriteChar(char c) {
  157.  printf("WriteChar !\n" );
  158.  send_char(c);
  159.  while (is_busy())
  160.    usleep(10);
  161.  
  162.  /* wait */
  163. }
  164. // Ecriture d'une chaine
  165. void LCD_WriteString(char *s) {
  166.  printf("WriteString !\n" );
  167.  while (*s) {
  168.    send_char(*s++);
  169.    usleep(50);
  170.    while (is_busy())
  171.      usleep(10);
  172.    
  173.    //usleep(10);
  174.    /* wait */
  175.  }  
  176. }
  177. // Reset du LCD et Initialisation
  178. // Note le hard reset de mise sous tension equivaut a LCD_SoftReset(1,0,0)
  179. void LCD_SoftReset(int size8, int line2, int bigfont) {
  180.  unsigned char command = 0x20;  // Mode command
  181.  if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  182.  if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  183.  if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  184.  // Sequence de reinitialisation
  185.  // D'abord, 3 commandes Mode avec la valeur voulue pour bit8
  186.  port_clear();
  187.  send_cmd(command); //
  188.  usleep(500);      // more than 4.1 ms
  189.  send_cmd(command);
  190.  usleep(500);      // more than 100 µs
  191.  send_cmd(command); // Maintenant is_busy va fonctionner
  192.  usleep(1300);      //  Peut être un peu de délai en rab avant de tester busy
  193.  while (is_busy()) /* wait */;   // peut être le remplacer contre un délai long (usleep(5000); par exemple)
  194.  // Sequence de parametrage
  195.  
  196.  usleep(500);
  197.  LCD_Mode(size8, line2, bigfont); // les valeurs passees seront inchangeables dorenavant
  198.  usleep(500);  
  199.  LCD_Display(0, 0, 0);            // Display Off
  200.  usleep(500);  
  201.  LCD_Clear();                     // Display Clear  // Peut être mettre ceci avant LCD_Mode(size8, line2, bigfont); car dans le reset hard, c'est en premier
  202.  usleep(500);
  203.  LCD_EntryMode(1, 0);             // Left-Right, no shift
  204.  usleep(500);
  205. }
  206.  
  207. void finalize (void) {
  208.  port_clear();
  209. }
  210.  
  211.  
  212. void open_port (void) {
  213.  if (ioperm(BASEPORT, 3, 1)) {
  214.    perror("can't set IO permissions!" );    
  215.  }  
  216. }
  217.  
  218. void close_port (void) {
  219.  if (ioperm(BASEPORT, 3, 0)) {
  220.    perror("can't reset IO permissions!" );
  221.  }  
  222. }


 
Et que je fais outb(0xFF, CONTROLREG)
 
Je peux exécuter ton code dans lequel j'ai intervertie Set_E et SetData et ça m'affiche le texte avec des espaces entre les caractères.

n°2110017
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 14:21:55  profilanswer
 

Euh, toucher à RS pourquoi pas, mais toucher à E ca risque d'envoyer un strobe mal compris par le LCD.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110018
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 14:23:41  profilanswer
 

Bon ben je vais partir de la alors.
Je vais jeter un oeil a cette louche histoire d'espace entre les caractères.
 
A+,


Message édité par gilou le 06-11-2011 à 14:31:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110020
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 14:30:25  profilanswer
 

>> Et que je fais outb(0xFF, CONTROLREG)  
A quel endroit?
 
>> Je peux exécuter ton code dans lequel j'ai intervertie Set_E et SetData et ça m'affiche le texte avec des espaces entre les caractères.
Dans quelles fonctions? toutes celles ou je fais un SetData?
A+,

Message cité 1 fois
Message édité par gilou le 06-11-2011 à 14:31:11

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

gilou a écrit :

>> Et que je fais outb(0xFF, CONTROLREG)  
A quel endroit?


A 0x378+2, dans un programme qui fait que ça.

gilou a écrit :


>> Je peux exécuter ton code dans lequel j'ai intervertie Set_E et SetData et ça m'affiche le texte avec des espaces entre les caractères.
Dans quelles fonctions? toutes celles ou je fais un SetData?
+A+,


 
J'ai modifier init_LCD, LCD_ClearDisplay et LCD_WriteChar.

n°2110027
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 14:58:34  profilanswer
 

>> A 0x378+2, dans un programme qui fait que ça. Dans un programme qui fait que ça...
Si tu fais outb(0xFF, CONTROLREG)  ça va mettre les pins de controle a 0, mais le mode du port Data en lecture.
outb(0x0F, CONTROLREG) serait mieux je pense.
A+,
 
 
>> J'ai modifier init_LCD, LCD_ClearDisplay et LCD_WriteChar.
 
Tous les codes qui marchaient et que j'ai vu sur le web ne font pas ça, mais mettent le data avant d'envoyer le strobe.
Il manque peut être quelque chose a faire avant, mais cette inversion marche probablement pour une mauvaise raison, et doit avoir des effets de bord.
Ça pourrait expliquer tes caractères blancs en trop: un strobe en trop, compris comme un envoi de caractère, avec un caractère 'pas affichable' (à 0?) comme donnée.
A+,

Message cité 1 fois
Message édité par gilou le 06-11-2011 à 15:01:19

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

gilou a écrit :

>> A 0x378+2, dans un programme qui fait que ça. Dans un programme qui fait que ça...
Si tu fais outb(0xFF, CONTROLREG)  ça va mettre les pins de controle a 0, mais le mode du port Data en lecture.
outb(0x0F, CONTROLREG) serait mieux je pense.
A+,


Je vais tester.

gilou a écrit :


>> J'ai modifier init_LCD, LCD_ClearDisplay et LCD_WriteChar.
 
Tous les codes qui marchaient et que j'ai vu sur le web ne font pas ça, mais mettent le data avant d'envoyer le strobe.
Il manque peut être quelque chose a faire avant, mais cette inversion marche probablement pour une mauvaise raison, et doit avoir des effets de bord.
Ça pourrait expliquer tes caractères blancs en trop: un strobe en trop, compris comme un envoi de caractère, avec un caractère 'pas affichable' (à 0?) comme donnée.
A+,


 
Ben, je lis le diagramme du datasheet, c'est tout.
On a bien mise à zero de RS et RW pour l'envoie, puis la mise à 1 de E , le positionnement des données, puis enfin, la mise à zero de E, enfin, c'est ce que je comprend du datasheet.

n°2110031
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 15:15:09  profilanswer
 

>> Ben, je lis le diagramme du datasheet, c'est tout.  
C'est la que tu fais pas la bonne interprétation:
Le datasheet t'indique a quel moment le LCD change l'état de son registre interne (=/= l'état sur les pins) en allant lire sur les pins la valeur courante mise par le Port Parallele.
Mais les pins sont déjà positionnés avec la bonne valeur avant, justement pour qu'au moment du strobe, tout soit OK pour la lecture sur les pins.
A+,


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


 
Je viens d'exécuter ce code, ça a marché, mais deux choses.
Il était précédé de l'exécution d'un programme avec l'ancienne bibliothèque puis d'un envois de 0x0F sur le port de contrôle.
Les caractère sont quand même séparé par des espaces.
 
Après rebout à froid, ce programme ne fonctionne pas.


Message édité par Profil supprimé le 06-11-2011 à 15:25:20
n°2110033
Profil sup​primé
Posté le 06-11-2011 à 15:33:50  answer
 

:pt1cable:  
 
 
 
Après l'exécution du code ou j'ai interverti Set_E et SetData, je peux exécuter l'original.
Les caractères sont toujours séparé par un espace.

n°2110035
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 15:39:35  profilanswer
 

C'est probablement pas un espace, mais un caractère pas affichable.
A+,


Message édité par gilou le 06-11-2011 à 15:39:50

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

J'ai modifié le code.
Dans wait_LCD ;
Dans les macro de DataIn et DataOut, j'ai mis z en place de control
Et j'ai ajouté DataOut avant de faire SetData.
J'ai toujours des caractère invisible ( :whistle: ) entre les miens mais au moins, le comportement est identique à chaque itération.
 
Parce que ça faisait un peu n'importe quoi, comme si les donnée était incrémentée, avant.
Si non, ben, c'est dans wait_LCD, cette histoire de caractère indésirable.


Message édité par Profil supprimé le 06-11-2011 à 17:04:34
n°2110064
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 21:01:21  profilanswer
 

Citation :

#define DataIn(z)    outb(control |= 0x20, CONTROLREG)
#define DataOut(z)   outb(control &= 0xD0, CONTROLREG)

:lol:  [:louloup2]  
Oui, c'est sur que ça devait pas être bon avec ça. Quoique si en fait, mais vraiment par chance.
 
>> Si non, ben, c'est dans wait_LCD, cette histoire de caractère indésirable.
 while (data && maxtries) {
    Clear_E(control);          
Vires ce Clear_E(control); et le usleep qui suit, s'il y en a un, et touches a rien d'autre.
Je voyais pas l'utilité de ce truc, puisque plus loin on fait encore un Clear_E(control); mais comme ça venait d'un code censé marcher, j'ai pas voulu y toucher, me disant qu'il devait y avoir une raison pour que ce soit la.
 
>> J'ai toujours des caractère invisible (  ) entre les miens mais au moins, le comportement est identique à chaque itération.  
Et c'est quoi le comportement identique?
Affichage systématique, mais avec les espaces?
 
A+,

Message cité 3 fois
Message édité par gilou le 06-11-2011 à 21:08:19

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

gilou a écrit :

 
Et c'est quoi le comportement identique?
Affichage systématique, mais avec les espaces?
 
A+,


 
Affichage systématique avec espace entre chaque caractère, oui.

n°2110083
Profil sup​primé
Posté le 07-11-2011 à 09:19:52  answer
 

gilou a écrit :

[
Vires ce Clear_E(control); et le usleep qui suit
A+,


 
Non, c'est pas ça, ou il n'y a pas que ça.

n°2110093
Profil sup​primé
Posté le 07-11-2011 à 10:46:51  answer
 

gilou a écrit :

       
Vires ce Clear_E(control); et le usleep qui suit, s'il y en a un, et touches a rien d'autre.
Je voyais pas l'utilité de ce truc, puisque plus loin on fait encore un Clear_E(control); mais comme ça venait d'un code censé marcher, j'ai pas voulu y toucher, me disant qu'il devait y avoir une raison pour que ce soit la.


 
Le Clear_E suivant est en dehors de la boucle.  
 

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


Message édité par gilou le 07-11-2011 à 10:57:53
n°2110098
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 10:58:09  profilanswer
 

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

Et la, il n'est plus dans cette boucle au début, mais à la fin.
 
 
éventuellement, tu peux tester cette variante:
 

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


 
A+,

Message cité 1 fois
Message édité par gilou le 07-11-2011 à 10:59:36

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

J'ai fait ce qui suit, mais du coup, ça incrémente plus à l'écriture de chaque caractère, c'est à dire que pour l'écriture de "bonjour" j'ai que le 'r' en position 1 sur la première ligne.
 

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


 
Ce code reflète plus ou moins celui du dernier tuto suivi, j'en sais trop rien.
Pourquoi la dif entre le mien et le tien ?

n°2110102
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 11:01:16  profilanswer
 

[:jpm1:2]  
C'est déja un bon progrès, reste plus qu'a virer ces caractères inutiles.
Je vais écrire du code pour lire leur valeur.
A+,


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

gilou a écrit :

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

Et la, il n'est plus dans cette boucle au début, mais à la fin.


Rien de changé.

gilou a écrit :


éventuellement, tu peux tester cette variante:
 

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


 
A+,


Marche encore moins.
 
Courage.  :D

n°2110104
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 11:07:09  profilanswer
 


La seule diff importante c'est que je fais fais un Set_RW après la Clear_RS, pout être sur que le bit RW est à 1. Sinon, à priori, tu na vas jamais lire dans le LCD, et cette boucle ne stoppe que parce que tu fais 255 tours de boucle.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2110109
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 11:15:22  profilanswer
 

>> Rien de changé.  
>> Marche encore moins
Damned, les deux devraient faire la même chose! Puisqu'on ne touche ni a RS ni a RW dans la boucle.
A croire que la lecture de DATAREG va aussi modifier CONTROLREG  (dont les pins ne devraient être monodirectionnels qu'en écriture).
En tout cas, ça indique qu'il se passe quelque chose ici qui est pas prévu.
 
au fait, juste pour savoir, si tu fais:
 

Code :
  1. void wait_LCD() {
  2.   int maxtries = 255;
  3. while(maxtries) {
  4.    usleep(3);
  5.    --maxtries;
  6.   }
  7. }


Il se passe quoi?
Qu'on sache si les caractères en trop sont bien générés par la routine plus complète.
 
A+,


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

gilou a écrit :


 
au fait, juste pour savoir, si tu fais:
 

Code :
  1. void wait_LCD() {
  2.   int maxtries = 255;
  3. while(maxtries) {
  4.    usleep(3);
  5.    --maxtries;
  6.   }
  7. }


Il se passe quoi?
Qu'on sache si les caractères en trop sont bien générés par la routine plus complète.
 
A+,


 
Pour l'écriture de "bonjour" ça affiche "bonjour". [:spamafote]
 
(Manque juste à faire outb(0x0F, CONTROLREG) mais c'est l'afficheur qu'est mort.)

n°2110115
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 11:31:33  profilanswer
 

>> Pour l'écriture de "bonjour" ça affiche "bonjour".
 
Sans les caractères en trop?
 
Bon ben faudra donc débugger wait_LCD(), mais en attendant, tu peux peut être mettre au point le reste de ton utilisation du LCD avec cette routine imparfaite.
 
A+,
 


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

gilou a écrit :

>> Pour l'écriture de "bonjour" ça affiche "bonjour".
 
Sans les caractères en trop?


Oui oui, sans espace.

gilou a écrit :


Bon ben faudra donc débugger wait_LCD(), mais en attendant, tu peux peut être mettre au point le reste de ton utilisation du LCD avec cette routine imparfaite.
 
A+,
 


 
Tu peux m'écrire la fonction de positionnement ?
S'il te plaît ?
(Je suis un poil paumé là)

n°2110125
gilou
Modérateur
Modzilla
Posté le 07-11-2011 à 12:00:42  profilanswer
 

Je suis justement en train d'écrire d'abord la fonction pour lire la position courante.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8

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