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

 


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

[ Divers / C ] Ecrire pour un afficheur LCD

n°2108619
gilou
Modérateur
Modzilla
Posté le 28-10-2011 à 19:43:34  profilanswer
 

Reprise du message précédent :
De toute façon, je fatigue, la, car c'était idiot cette modif du test.
 

Code :
  1. void LCD_Init() {
  2.     // usleep(2000);  // Pour l'embarque ou on attend après la mise sous tension plus de 1.5 ms (2 ms)
  3.     clear_pin(LCD_CNTL);
  4.     clear_pin(LCD_DATA);
  5.     set_lcd_data(0x30);
  6.     set_pin(LCD_E);
  7.     clear_pin(LCD_E);
  8.     usleep(200000);
  9.     { //Test
  10. pin_input_mode(LCD_DATA);
  11. printf("\nData Pin Status: " );
  12. printf("%s", pin_is_set(LCD_D7)?"1":"0" );
  13. printf("%s", pin_is_set(LCD_D6)?"1":"0" );
  14. printf("%s", pin_is_set(LCD_D5)?"1":"0" );
  15. printf("%s", pin_is_set(LCD_D4)?"1":"0" );
  16. printf("%s", pin_is_set(LCD_D3)?"1":"0" );
  17. printf("%s", pin_is_set(LCD_D2)?"1":"0" );
  18. printf("%s", pin_is_set(LCD_D1)?"1":"0" );
  19. printf("%s", pin_is_set(LCD_D0)?"1":"0" );
  20. printf("\n" );
  21. printf("Expected: 00110000\n" );
  22. pin_output_mode(LCD_DATA);
  23. exit 1;
  24.     }
  25. }


Ca devrait être le bon code. J'ai rajouté un clear_pin(LCD_DATA); à tout hasard.
et  
set_pin(LCD_E);
clear_pin(LCD_E);
car il faut un strobe envoyé au LCD, sinon, ca risque pas d'être lu.
 
A tout hasard, si tu remplaces le
clear_pin(LCD_CNTL);
par
set_pin(LCD_CNTL);
ça donne quoi?
 
Parce que la, je vois pas quoi trop tenter d'autre:
j'envoie une valeur au LCD, et je voudrais juste vérifier qu'il l'a reçue(je suppose qu'il garde ses pins en l'état après réception), et la, on dirait pas...
A+,


Message édité par gilou le 28-10-2011 à 19:53:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 28-10-2011 à 19:43:34  profilanswer
 

n°2108630
Profil sup​primé
Posté le 28-10-2011 à 20:04:52  answer
 

C'est toujours le même résultat de test de LCD_Init.
Avec set_pin(LCD_CNTL) aussi.
 
Merci Gilou en tout cas.

n°2108649
gilou
Modérateur
Modzilla
Posté le 28-10-2011 à 22:57:44  profilanswer
 

Si tu progresses, tiens moi au courant.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108651
gilou
Modérateur
Modzilla
Posté le 28-10-2011 à 23:46:51  profilanswer
 

J'ai trouvé quelque chose qui pourrait marcher: LCDProc
 

Citation :

LCDproc is a client/server suite including drivers for all kinds of nifty LCD displays.
 
The server LCDd makes it possible to display text and other data on an LCD display. As well LCDd can handle certain input devices.
 
Support for devices is added by drivers. We distinguish between output and input drivers. LCDd currently supports only one single output driver, which may at the same time handle input. Nevertheless several input (only) drivers are supported.
 
Currently there are drivers for several serial devices: Matrix Orbital, Crystal Fontz, Bayrad, LB216, LCDM001 (kernelconcepts.de), Wirz-SLI and PIC-an-LCD; and some devices connected to the LPT port: HD44780, STV5730, T6963, SED1520 and SED1330. There are input (only) drivers for LIRC and joysticks.


 
Le driver The HD44780 Driver supporte le KS0066 (c'est un KS0066U dans le tien d'après le datasheet) en mode 8bit Wiring ("lcdtime" ) [par contre, il semble que le cablage des pins de commande soit légèrement différent: RS le pin 4 du LCD est connecté au pin 1 du port // (il est sur le 17 actuellement), RW le pin 5 du LCD est connecté au pin 14 du port // (ce qui devrait être bon maintenant), et E, le pin 6 du LCD est connecté au pin 16 du port // (il est sur le 1 actuellement)]
 
Il y a même une section pour verifier les pbs liés au port // http://lcdproc.sourceforge.net/doc [...] ppttrouble
 
 
A la base c'est un démon qui tourne et sert de serveur pour écrire sur le lcd, et il y a tout un tas de clients qui peuvent s'y connecter pour y écrire.
 
A+,


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

Bonjour Gilou,
 
Tu connaissait pas LCDd ?
J'avais testé avec le câblage que j'ai donné plus haut.
Ce que tu donne comme câblage, c'est encore différent.
Et ça marche toujours pas.
Je change de carte mère et je reteste tout.

n°2108667
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 11:48:45  profilanswer
 

LCDd, J'avais vaguement vu ça il y a un certain temps (qques années), mais vu que je ne travaille pas sous linux depuis un bon bout de temps, ça ne m'était pas resté en mémoire.
A+,


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

J'aurais pu t'en parler avant...
 
J'ai changé de carte mère, mais pas de changement.
 
J'ai testé le port parallèle avec un petit connecteur sur lequel j'ai brancher des leds.
J'envoie i sur sur le port pour i alant de 0 à 255, les leds clignote.
Par contre après avoir exécuté paralcd, ça clignote plus.
 
Y a un truc qui cloche. Je pense que je doit rebooter là.
 
 

n°2108681
Profil sup​primé
Posté le 29-10-2011 à 14:39:44  answer
 

Après un boot, donc tout frais de power off, le dernier test que tu as écris donne 01111111 et non plus 11111111

n°2108691
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 16:28:51  profilanswer
 

On va déja vérifier le fonctionnement de la librairie:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <parapin.h>
  5. #include <sys/io.h>
  6. #define BASEPORT 0x378
  7. void set_lcd_data(unsigned char data) {
  8.     // char et non int afin d'être sur de n'écrire qu'un octet
  9.     // On utilise le fait que LCD_DATA est aussi visible comme un octet
  10.     // pour set-pin
  11.     set_pin(data);
  12. }
  13. int main (int argc, char * argv[]) {
  14.   int parapin_init_success = 0;
  15.   if (argc == 1)  {
  16.       printf("Usage: paralcd prend au moins un argument. \n" );
  17.       return 1;
  18.   }
  19.   if (ioperm(BASEPORT, 3, 1))  {
  20.       perror("paralcd::ioperm" );
  21.       return 1;
  22.   }
  23.   parapin_init_success = pin_init_user(BASEPORT);
  24.   if (parapin_init_success != 0) {
  25.      printf("Echec de l'initialisation de parapin. \n" );
  26.   }
  27.   pin_output_mode(LP_DATA_PINS|LP_CONTROL_PINS);
  28.   clear_pin(LP_DATA_PINS|LP_CONTROL_PINS);
  29.   set_lcd_data(0x30);
  30.   sleep(30);  // 30 secondes pour voir l'afficahge des diodes
  31.   clear_pin(LP_DATA_PINS|LP_CONTROL_PINS);  // vu dans les exemples de parapin
  32.   return 0;
  33. }


Ça t'affiche 00110000 pendant 30s?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108693
Profil sup​primé
Posté le 29-10-2011 à 17:31:01  answer
 

J'ai que trois leds, mais je l'ai fait a la main.
 
Broche  value
 
2 false
3 false
4 false
5 True
6 True
7 false
8 false
9 false

mood
Publicité
Posté le 29-10-2011 à 17:31:01  profilanswer
 

n°2108701
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 19:00:20  profilanswer
 

Donc il y a un problème
Va falloir tester les pins un par un pour comprendre:
remplacer
set_lcd_data(0x30);
par  
set_pin(LP_PIN02);
etc un par un
jusqu'à  
set_pin(LP_PIN09);
pour voir si ça allume la led sur le pin correspondant de la broche.
A+,


Message édité par gilou le 29-10-2011 à 19:02:02

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

Ca à pour éffet d'allumer une par une les 8 broches.
J'entends que ça éteint la précédente à chaque incrémentation.

n°2108704
Profil sup​primé
Posté le 29-10-2011 à 19:40:53  answer
 

Faudrait pas envoyer RS et RW en même temps ?
 
Ah oui mais non, j'ai pas fait gaffe, y a un clear plus bas.


Message édité par Profil supprimé le 29-10-2011 à 19:45:41
n°2108706
Profil sup​primé
Posté le 29-10-2011 à 20:16:00  answer
 


 
0x30 = 48, le pin 5, et le 6 sont allumé, c'est bon !  :??:  
Tu cherche quoi Gilou ?
Que je cherche aussi ?
Je sais pas quoi faire moi.

n°2108707
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 21:08:51  profilanswer
 

Citation :

2 false  
3 false  
4 false  
5 True  
6 True  
7 false  
8 false  
9 false

Ben ça devrait être les pins 6 et 7, et pas les 5 et 6, ou alors, il y a une incompréhension sur les numéros de pins.
0x30 c'est 00110000 et la ce que tu as d'affiché c'est 00011000 ie 0x18
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108708
Profil sup​primé
Posté le 29-10-2011 à 21:20:09  answer
 

00110000 c'est à l'envers ?
 
Parce qu'en fait, c'est bien comme tu le dis en clair, ce sont les pin 6 et 7 qui sont on.
 
 :heink: Tu m'en veux ?  [:rhetorie du cupra]

n°2108709
Profil sup​primé
Posté le 29-10-2011 à 21:44:36  answer
 

j'exécute ce code :

Code :
  1. void LCD_BusyCheck() {
  2.  usleep(2000);                              
  3.  pin_input_mode(LCD_DATA); // Port de données en lecture                                                                                                      
  4.  clear_pin(LCD_RS); // LCD en mode instruction                                                                                                                
  5.  set_pin(LCD_RW);   // LCD en mode écriture                                                                                                                    
  6.  do {
  7.    set_pin(LCD_E);
  8.    printf("pin E is set... \n" );
  9.    clear_pin(LCD_E); // créneau pour lancer l'opération                                                                                                        
  10.    printf("pin E is unset... \n" );
  11.    usleep(1000);
  12.  } while (pin_is_set(LCD_D7)); // teste le signal busy                                                                                                        
  13.  clear_pin(LCD_RW); // LCD en mode lecture (pour éviter les conflits de bus)                                                                                  
  14.  pin_output_mode(LCD_DATA); // Port de données en écriture                                                                                                    
  15. }


 
La oucle tourne bien, et le pin 1 du // clignote bien très vite, mais si je rajoute un zéro, il s'allume, s'éteint un fois, mais la boucle tourne quand même.

Message cité 1 fois
Message édité par Profil supprimé le 29-10-2011 à 21:45:20
n°2108710
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 22:00:32  profilanswer
 

Non, non, c'est rassurant, parapin envoie bien ce qu'il faut.
 
Pour la boucle que tu testes, il y a aussi l'afficheur dans le circuit?
parce que sinon, il y a peu de chances qu'on lise qque chose de valable sur le pin LCD_D7 pour sortir de la boucle
 
J'essaierais bien de faire:
usleep(2000);    
clear_pin(LCD_DATA);    // ajouté                        
pin_input_mode(LCD_DATA);  
 
Histoire de mettre les pins a 0 sur le port // avant de faire une lecture de l'état sur le LCD
 
A+,

Message cité 1 fois
Message édité par gilou le 29-10-2011 à 22:01:04

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108712
Profil sup​primé
Posté le 29-10-2011 à 22:37:01  answer
 

gilou a écrit :


 
Pour la boucle que tu testes, il y a aussi l'afficheur dans le circuit?


Non. Mais c'était pas ce qui m'intéressait, sortir; je voulais juste voir si ça clignotait bien dans cette boucle.
 

gilou a écrit :


 
J'essaierais bien de faire:
usleep(2000);    
clear_pin(LCD_DATA);    // ajouté                        
pin_input_mode(LCD_DATA);  
 
Histoire de mettre les pins a 0 sur le port // avant de faire une lecture de l'état sur le LCD
 
A+,


Ou ajoute tu ce code ?

n°2108714
gilou
Modérateur
Modzilla
Posté le 29-10-2011 à 23:10:05  profilanswer
 

void LCD_BusyCheck() {
  usleep(2000);  
  clear_pin(LCD_DATA);    // ajouté                                      
  pin_input_mode(LCD_DATA); // Port de données en lecture                                                                                                        
  clear_pin(LCD_RS); // LCD en mode instruction                                                                                                                  
  set_pin(LCD_RW);   // LCD en mode écriture                                                                                                                    
  do {
    set_pin(LCD_E);
    printf("pin E is set... \n" );
    clear_pin(LCD_E); // créneau pour lancer l'opération                                                                                                        
    printf("pin E is unset... \n" );
    usleep(1000);
  } while (pin_is_set(LCD_D7)); // teste le signal busy                                                                                                          
  clear_pin(LCD_RW); // LCD en mode lecture (pour éviter les conflits de bus)                                                                                    
  pin_output_mode(LCD_DATA); // Port de données en écriture                                                                                                      
}
 
Mais bon, ça sera utile que quand tu iras lire les datas du LCD.
 
A+,


Message édité par gilou le 29-10-2011 à 23:11:58

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

C'est ou, cet ajout?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2108716
Profil sup​primé
Posté le 29-10-2011 à 23:13:42  answer
 

Ok ! Ca change rien.
 
J'ai tester un à un les pin_is_set après un clear(LCD_DATA après un set_(LCD_DATA) comme ça :
 

Code :
  1. void LCD_Init() {
  2.  // usleep(2000);  // Pour l'embarque ou on attend après la mise sous tension plus de 1.5 ms (2 ms)
  3.  //LCD_BusyCheck();
  4.  
  5.  clear_pin(LCD_CNTL);
  6.  set_pin(LCD_DATA);    
  7.  //set_lcd_data(0x30);
  8.  
  9.  { //Test
  10.    pin_input_mode(LCD_DATA);
  11.    printf("\nData Pin Status: " );
  12.    if (pin_is_set(LCD_D7))
  13.      printf("1" );
  14.    else
  15.      printf("0" );
  16.    
  17.    if (pin_is_set(LCD_D6))
  18.      printf("1" );
  19.    else
  20.      printf("0" );
  21.    
  22.    if (pin_is_set(LCD_D5))
  23.      printf("1" );
  24.    else
  25.      printf("0" );
  26.    
  27.    if (pin_is_set(LCD_D4))
  28.      printf("1" );
  29.    else
  30.      printf("0" );
  31.    
  32.    if (pin_is_set(LCD_D3))
  33.      printf("1" );
  34.    else
  35.      printf("0" );
  36.    
  37.    if (pin_is_set(LCD_D2))
  38.      printf("1" );
  39.    else
  40.      printf("0" );
  41.    
  42.    if (pin_is_set(LCD_D1))
  43.      printf("1" );
  44.    else
  45.      printf("0" );
  46.  
  47.    if (pin_is_set(LCD_D0))
  48.      printf("1" );
  49.    else
  50.      printf("0" );
  51.    
  52.    
  53.    printf("\n" );
  54.    printf("Expected: 00110000\n" );


 
J'ai toujours 11111111
 
Je crois que pin_is_set marche po.

n°2108717
Profil sup​primé
Posté le 29-10-2011 à 23:16:19  answer
 

gilou a écrit :

C'est ou, cet ajout?
A+,


 
à la valeur de usleep.

n°2108718
Profil sup​primé
Posté le 30-10-2011 à 00:06:03  answer
 


 
 
Pourtant j'ai bien les l'effet escompté sur le connecteur. C'est mon code qu'est pas bon, ou c'est pin_is_set qui va pas ?

n°2108720
Profil sup​primé
Posté le 30-10-2011 à 00:38:56  answer
 

Lutain, c'est louche.
 
J'ai testé une nouvelle fois avec le code C de la doc de parapin
 

Code :
  1. void LCD_Init() {
  2.  // usleep(2000);  // Pour l'embarque ou on attend après la mise sous tension plus de 1.5 ms (2 ms)              
  3.  //LCD_BusyCheck();                                                                                              
  4.  pin_output_mode(LP_DATA_PINS);
  5.  clear_pin(LP_DATA_PINS);
  6.  //set_lcd_data(0x30);                                                                                          
  7.  
  8.  { //Test                                                                                                        
  9.    pin_input_mode(LP_DATA_PINS);
  10.    printf("\nData Pin Status: " );
  11.  
  12.    int result = pin_is_set(LP_PIN02 | LP_PIN03 | LP_PIN04 | LP_PIN05 | LP_PIN06| LP_PIN07|LP_PIN08|LP_PIN09);
  13.  
  14.    if (!result)
  15.      printf("Pins are all off\n" );
  16.    else {
  17.      if (result & LP_PIN02)
  18.        printf("Pin 1 is high!\n" );
  19.      if (result & LP_PIN03)
  20.        printf("Pin 2 is high!\n" );
  21.      if (result & LP_PIN04)
  22.        printf("Pin 3 is high!\n" );
  23.      if (result & LP_PIN05)
  24.        printf("Pin 4 is high!\n" );
  25.      if (result & LP_PIN06)
  26.        printf("Pin 5 is high!\n" );
  27.      if (result & LP_PIN07)
  28.        printf("Pin 6 is high!\n" );
  29.      if (result & LP_PIN08)
  30.        printf("Pin 7 is high!\n" );
  31.      if (result & LP_PIN09)
  32.        printf("Pin 8 is high!\n" );
  33.    }
  34.  
  35.  
  36.    printf("\n" );
  37.    printf("Expected: 00110000\n" );
  38.    pin_output_mode(LCD_DATA);
  39.  }
  40. }


 
Ca allume et ça éteint bien, mais pin_is_set si n'importe quoi. après un clear, ça reste à high, pourtant c'est bien éteint.

n°2108724
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 01:44:13  profilanswer
 

Recompiles la librairie en mode DEBUG et recompiles ton programme avec.
pin_is_set ca appelle une fonction read_register qui elle même récupère la valeur en faisant outb à l'adresse 0x378 de ton port parallele (puis ca positionne éventuellement des masques, mais pas pour les pins LP_PIN02 .. LP_PIN09)
En mode débug, ca devrait écrire sur la console ce qui a été lu dans le registre avec outb.
A+,


Message édité par gilou le 30-10-2011 à 01:46:03

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

Je fais comment pour recompiler en mode debug ?

n°2108726
Profil sup​primé
Posté le 30-10-2011 à 02:51:57  answer
 

Je travail sur un code sans parapin.
 
Mais j'ai pas tout compris encore dans le protocole.
 
Ca fonctionne pas en tout cas.
 

Code :
  1. /* ************************** */
  2. /* **      paradis.c       ** */
  3. /* ************************** */
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/io.h>
  9.  
  10. #define PORTADDRESS 0x378
  11. #define DATA PORTADDRESS+0
  12. #define STATUS PORTADDRESS+1
  13. #define CONTROL PORTADDRESS+2 // pour adresser les pins de controle
  14.  
  15. char init[10];
  16. int count;
  17. int len;
  18.  
  19. void initlcd(void) {
  20.  init[0] = 0x0F;
  21.  init[1] = 0x01;
  22.  init[2] = 0x38;
  23.  
  24.  outb(11, CONTROL);
  25.  
  26.  outb(3, CONTROL);
  27.  
  28.  for (count = 0; count <= 2; count++) {
  29.    
  30.    outb(44, CONTROL);
  31.    usleep(10000);
  32.    outb(init[count], DATA);
  33.    usleep(20000);
  34.    outb(33, CONTROL);
  35.    usleep(20000);
  36.  }
  37.  outb(11, CONTROL);
  38. }
  39.  
  40. void sendlcd(char text[10]) {
  41.  len = strlen(text);
  42.  for (count = 0; count < len; count++)
  43.    {      
  44.      outb(42, CONTROL);
  45.      usleep(10000);
  46.      outb(text[count], DATA);
  47.      usleep(20000);
  48.      outb(33, CONTROL);
  49.      usleep(10000);
  50.    }
  51. }
  52.  
  53. void poslcd(int pos) {
  54.  outb(inb(CONTROL) | 0x08, CONTROL);
  55.  outb(128+pos, DATA);
  56.  outb(inb(CONTROL) | 0x01, CONTROL);
  57.  usleep(20000);
  58.  outb(inb(CONTROL) & 0xFE, CONTROL);
  59.  usleep(20000);
  60.  outb(inb(CONTROL) & 0xF7, CONTROL);
  61. }
  62.  
  63. void main (void)
  64. {
  65.  if(ioperm(PORTADDRESS, 3, 1)) {
  66.    perror("ioperm" );
  67.    exit(1);
  68.  }
  69.  
  70.  initlcd();
  71.  sendlcd("Bonjour" );
  72.  //poslcd(0x40);
  73.  //sendlcd("le monde !" );
  74. }

n°2108729
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 02:51:35  profilanswer
 

Remplacer  
CFLAGS += -O2 -g -Wall $(CONFIG_H)
par
CFLAGS += -O2 -g -Wall $(CONFIG_H) -DDEBUG
dans le Makefile
 
A+,


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


 
Ca clignote en fait, j'ai déplacé un délais, et fallait le copier.  :cry:

n°2108731
Profil sup​primé
Posté le 30-10-2011 à 04:18:48  answer
 

gilou a écrit :

Remplacer  
CFLAGS += -O2 -g -Wall $(CONFIG_H)
par
CFLAGS += -O2 -g -Wall $(CONFIG_H) -DDEBUG
dans le Makefile
 
A+,


 
Ça affiche rien de mieux  :fou:  :sweat:

n°2108732
Profil sup​primé
Posté le 30-10-2011 à 04:23:55  answer
 

A si, ça y est !
 


writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
 


 
La boucle de busy.
 
 
Le début de la boucle.
 

setting output mode on data pins
read 11110111 from register 2
writing 11011100 to register 2
setting control-reg output mode
read 11010111 from register 2
writing 11011100 to register 2
read 11010111 from register 2
writing 11011111 to register 2
read 00111111 from register 0
writing 00111111 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
read 00111111 from register 0
writing 00111111 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
read 00111111 from register 0
writing 00111111 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
setting input mode on data pins
read 11010100 from register 2
writing 11111111 to register 2
read 11110100 from register 2
writing 11111111 to register 2
read 11110100 from register 2
writing 11111101 to register 2
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2


Message édité par Profil supprimé le 30-10-2011 à 04:30:54
n°2108733
Profil sup​primé
Posté le 30-10-2011 à 04:39:43  answer
 

Les deux première lignes avec l'ajour du clear_pin(LCD_DATA) avant le set_input_mode(LCD_DATA) dans LCD_BusyCheck.

setting output mode on data pins
read 11110110 from register 2


 
La colonne complète.
 

setting output mode on data pins
read 11110111 from register 2
writing 11011100 to register 2
setting control-reg output mode
read 11010111 from register 2
writing 11011100 to register 2
read 11010111 from register 2
writing 11011111 to register 2
read 00000000 from register 0
writing 00110000 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
read 00110000 from register 0
writing 00110000 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
read 00110000 from register 0
writing 00110000 to register 0
read 11010100 from register 2
writing 11011110 to register 2
read 11010101 from register 2
writing 11011111 to register 2
read 00110000 from register 0
writing 00000000 to register 0
setting input mode on data pins
read 11010100 from register 2
writing 11111111 to register 2
read 11110100 from register 2
writing 11111111 to register 2
read 11110100 from register 2
writing 11111101 to register 2
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0
read 11110110 from register 2
writing 11111100 to register 2
read 11110111 from register 2
writing 11111101 to register 2
read 11111111 from register 0


 
Le diff de full et full2 (full2 c'est sans l'ajour du clear data)
 

void:/home/root/paralcd_handler# diff full full2
27,28d26
< read 00110000 from register 0
< writing 00000000 to register 0
32c30,32
< read 11110100 from register 2
\ Pas de fin de ligne à la fin du fichier.
---
> read 11110100 from register 2
> writing 11111111 to register 2
> read 11110100 from register 2


Message édité par Profil supprimé le 30-10-2011 à 04:45:25
n°2108734
Profil sup​primé
Posté le 30-10-2011 à 05:20:23  answer
 

Je vois que dans LCD_BuzyCheck, lorsque que on fait set_pin(LCD_E) les LCD_DATA sont False, et losqu'on passe le clear_pin(LCD_E) les LCD_DATA passe à True.


Message édité par Profil supprimé le 30-10-2011 à 05:21:15
n°2108736
Profil sup​primé
Posté le 30-10-2011 à 06:35:28  answer
 

Bon je bidouille. Mais je sais plus trop ou j'en suis.
 
En tout cas, voici un code qui sort de la boucle de LCD_BusyCheck().
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <parapin.h>
  5. #include <sys/io.h>
  6. #define BASEPORT 0x378
  7. // correspondances LCD PARA pin à  pin
  8. #define LCD_E  LP_PIN01
  9. #define LCD_D0 LP_PIN02
  10. #define LCD_D1 LP_PIN03
  11. #define LCD_D2 LP_PIN04
  12. #define LCD_D3 LP_PIN05
  13. #define LCD_D4 LP_PIN06
  14. #define LCD_D5 LP_PIN07
  15. #define LCD_D6 LP_PIN08
  16. #define LCD_D7 LP_PIN09
  17. // Si on a connecté le pin LCD 5 au pin 16 du PP et non pas au 14
  18. #define LCD_RW LP_PIN14
  19. #define LCD_RS LP_PIN17
  20. // Peut etre que faire #define LP_CONTROL_PINS LP_SWITCHABLE_PINS suffit
  21. #define LP_CONTROL_PINS (LP_PIN01 | LP_PIN14 | LP_PIN17)
  22. //  
  23. #define LCD_CNTL LP_CONTROL_PINS
  24. // LCD_DATA peut aussi être vu comme un octet
  25. #define LCD_DATA LP_DATA_PINS
  26. // instructions du LCD
  27. #define LCD_iClearDisplay  0x01
  28. #define LCD_iReturnHome    0x02
  29. #define LCD_iEntryModeSet  0x04
  30. #define LCD_iDisplayOnOff  0x08
  31. #define LCD_iShift         0x10
  32. #define LCD_iFunctionSet   0x20
  33. #define LCD_iSetCGRAMAddr  0x40
  34. #define LCD_iSetDDRAMAddr  0x80
  35. static char LCD_DDRAM_ADDR; // adresse actuelle dans la mémoire DDRAM du LCD
  36. static char LCD_LINE; // ligne actuelle sur le LCD
  37. void set_lcd_data(unsigned char data) {
  38.  // char et non int afin d'être sur de n'écrire qu'un octet
  39.  // On utilise le fait que LCD_DATA est aussi visible comme un octet
  40.  // pour set-pin
  41.  set_pin(data);
  42. }
  43. void LCD_BusyCheck() {
  44.    usleep(2000);    
  45.  pin_output_mode(LCD_DATA);
  46.  clear_pin(LCD_DATA);    // ajouté                         */
  47.  pin_input_mode(LCD_DATA);
  48.  clear_pin(LCD_RS); // LCD en mode instruction
  49.  set_pin(LCD_RW);   // LCD en mode écriture
  50.  do {
  51.    set_pin(LCD_E);
  52.    usleep(500);
  53.        printf("\nData Pin Status: " );
  54.    if (pin_is_set(LCD_D7))
  55.      printf("1" );
  56.    else
  57.      printf("0" );
  58.    
  59.    if (pin_is_set(LCD_D6))
  60.      printf("1" );
  61.    else
  62.      printf("0" );
  63.    
  64.    if (pin_is_set(LCD_D5))
  65.      printf("1" );
  66.    else
  67.      printf("0" );
  68.    
  69.    if (pin_is_set(LCD_D4))
  70.      printf("1" );
  71.    else
  72.      printf("0" );
  73.    
  74.    if (pin_is_set(LCD_D3))
  75.      printf("1" );
  76.    else
  77.      printf("0" );
  78.    
  79.    if (pin_is_set(LCD_D2))
  80.      printf("1" );
  81.    else
  82.      printf("0" );
  83.    
  84.    if (pin_is_set(LCD_D1))
  85.      printf("1" );
  86.    else
  87.      printf("0" );
  88.  
  89.    if (pin_is_set(LCD_D0))
  90.      printf("1" );
  91.    else
  92.      printf("0" );
  93.    
  94.    
  95.    printf("\n" );
  96.    clear_pin(LCD_E); // créneau pour lancer l'opération
  97.  } while (pin_is_set(LCD_D7)); // teste le signal busy
  98.  clear_pin(LCD_RW); // LCD en mode lecture (pour éviter les conflits de bus)
  99.  pin_output_mode(LCD_DATA); // Port de données en écriture   */
  100. }
  101. void LCD_SendCommand(unsigned char command, unsigned char data) {
  102.  LCD_BusyCheck();
  103.  clear_pin(LCD_RW|LCD_RS); // LCD en mode lecture + instruction
  104.  set_lcd_data(command|data); // On place la donnée dans le bus
  105.  set_pin(LCD_E);
  106.  clear_pin(LCD_E); // créneau pour lancer l'opération
  107. }
  108. void LCD_Init() {
  109.  
  110.  clear_pin(LCD_CNTL);
  111.  
  112.  set_pin(LCD_E);
  113.  usleep(2000);
  114.  set_lcd_data(0x30);
  115.    usleep(3000);
  116.  clear_pin(LCD_E); // On envoie 0011xxxx
  117.  usleep(5000);     // attente de plus de 4.1 ms (5 ms)
  118.  
  119.  
  120.  set_pin(LCD_E);
  121.  usleep(2000);
  122.  set_lcd_data(0x30);
  123.  usleep(3000);
  124.  clear_pin(LCD_E); // On envoie 0011xxxx
  125.  usleep(128000);     // attente de plus de 100 ms (128 ms)
  126.  
  127.  
  128.  set_pin(LCD_E);
  129.  usleep(2000);
  130.  set_lcd_data(0x30);
  131.  usleep(3000);
  132.  clear_pin(LCD_E); // On envoie 0011xxxx
  133.  // a partir de maintenant on pourra tester le signal BUSY pour l'attente
  134.  LCD_SendCommand(LCD_iFunctionSet,
  135.           0x18);  // Interface 8 bits, 2 lignes, caracteres 5*8 pixels
  136.  LCD_SendCommand(LCD_iDisplayOnOff,
  137.           0x04); // Allumer l'écran
  138.  LCD_SendCommand(LCD_iEntryModeSet,
  139.           0x06); // sens g. à  d., décalage=0
  140.  LCD_SendCommand(LCD_iClearDisplay,
  141.           0x00); // effacer l'écran
  142.  LCD_DDRAM_ADDR = 0;
  143.  LCD_LINE = 1;
  144.  
  145.  
  146. }
  147. void LCD_SendChar(unsigned char c) {
  148.  LCD_BusyCheck();
  149.  clear_pin(LCD_RW); // LCD en mode lecture
  150.  set_pin(LCD_RS);   // LCD en mode données
  151.  set_lcd_data(c);   // place la donnée sur le bus
  152.  set_pin(LCD_E);
  153.  clear_pin(LCD_E); // créneau pour lancer l'opération
  154.  LCD_DDRAM_ADDR++;
  155. }
  156. void LCD_SendString(unsigned char *string)
  157. {
  158.  while(*string) {             //till string ends
  159.    LCD_SendChar(*string++);  //send characters one by one
  160.  }
  161. }
  162. int main (int argc, char * argv[]) {
  163.  int parapin_init_success = 0;
  164.  if (argc == 1)  {
  165.    printf("Usage: paralcd prend au moins un argument. \n" );
  166.    return 1;
  167.  }
  168.  if (ioperm(BASEPORT, 3, 1))  {
  169.    perror("paralcd::ioperm" );
  170.    return 1;
  171.  }
  172.  parapin_init_success = pin_init_user(BASEPORT);
  173.  if (parapin_init_success != 0) {
  174.    printf("Echec de l'initialisation de parapin. \n" );
  175.  }
  176.  pin_output_mode(LP_DATA_PINS|LP_CONTROL_PINS);
  177.  LCD_Init();
  178.  LCD_SendString("Jovalise" );
  179.  clear_pin(LP_DATA_PINS|LP_CONTROL_PINS);  // vu dans les exemples de parapin
  180.  return 0;
  181. }


 
Et voici la sortie console ::= http://www5.zippyshare.com/v/79943225/file.html


Message édité par Profil supprimé le 30-10-2011 à 06:36:51
n°2108737
Profil sup​primé
Posté le 30-10-2011 à 06:57:05  answer
 

Zut, ça fonctionne plus.
J'ai essayé l'autre afficheur, ça à pas fonctionné, et je rebranche le premier et ça fonctionne plus, même après un reboot à froid.
 

n°2108749
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 10:25:34  profilanswer
 

Avec tout ça, je sais plus quel code tu utilises.
Tu peux me le coller dans pastebin avec la sortie console?
A+,


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

Ben, normalement, c'est l'original, celui que tu as donné en première page, sauf qu'il faut changer LP_PIN16 en LP_PIN14.
Y a rien de changé. dans les résultat des tests que j'ai fait. Sauf la section de test elle même.
 
Si non, le dernier code que j'ai testé c'est celui que je viens de coller.
 
Alors, je sais pas quoi te coller.

n°2108753
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 11:46:14  profilanswer
 

OK! C'était pour comprendre exactement quel code tu utilisais.
Mais bon, avant de se lancer dans des trucs compliqués, je pense qu'il va falloir écrire des trucs de test simples, juste pour vérifier le mode lecture.
Normalement, c'est très simple pour la lecture depuis le LCD:
Il faut RW a 1, et il n'y a que 2 choix possibles dans ce cas de figure:
RS à 0: après un strobe, on a l'adresse des données en DDRAM/CGRAM (sur 7 bits) plus le flag busy (sur le 8e bit)
RS a 1: après un strobe, on a la valeur (sur 8 bit) a l'adresse courante en DDRAM/CGRAM
 
Mais avant ça, le mieux serait déjà de tester le bon fonctionnement de pin_is_set.
 
Est ce que ce programme de test marche correctement?
A priori, pas besoin d'avoir quoi que ce soit de branché sur LPT1 pour tester le port
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include "parapin.h"
  5. int main(int argc, char *argv[])
  6. {
  7.   int i;
  8.   if (pin_init_user(LPT1) < 0) {
  9.       perror("paralcd::ioperm" );
  10.       exit(0);
  11.   }
  12.   pin_output_mode(LP_DATA_PINS | LP_SWITCHABLE_PINS);
  13.   clear_pin(LP_DATA_PINS | LP_SWITCHABLE_PINS);
  14.   printf("Setting Pins LP_PIN02 LP_PIN04 LP_PIN05 LP_PIN07" );
  15.   set_pin(LP_PIN02|LP_PIN04|LP_PIN05|LP_PIN07);
  16.   pin_input_mode(LP_DATA_PINS|LP_SWITCHABLE_PINS);
  17.   printf("\nstarting\n" );
  18.   for (i = 1; i <= 17; i++)
  19.     printf("Pin %d: %s\n", i, pin_is_set(LP_PIN[i]) ? "HIGH":"LOW" );
  20.   printf("\n\n" );
  21.  
  22.   return 0;
  23. }


 
A+,
 


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

J'ai du nouveau tout de même.
Le code : paralcd-0.0.0alpha
La sortie : paralcd-output
 
 

n°2108755
Profil sup​primé
Posté le 30-10-2011 à 11:54:49  answer
 

gilou a écrit :

OK! C'était pour comprendre exactement quel code tu utilisais.
Mais bon, avant de se lancer dans des trucs compliqués, je pense qu'il va falloir écrire des trucs de test simples, juste pour vérifier le mode lecture.
Normalement, c'est très simple pour la lecture depuis le LCD:
Il faut RW a 1, et il n'y a que 2 choix possibles dans ce cas de figure:
RS à 0: après un strobe, on a l'adresse des données en DDRAM/CGRAM (sur 7 bits) plus le flag busy (sur le 8e bit)
RS a 1: après un strobe, on a la valeur (sur 8 bit) a l'adresse courante en DDRAM/CGRAM
 
Mais avant ça, le mieux serait déjà de tester le bon fonctionnement de pin_is_set.
 
Est ce que ce programme de test marche correctement?
A priori, pas besoin d'avoir quoi que ce soit de branché sur LPT1 pour tester le port
 
 
.../...


 
 
 

setting output mode on data pins
read 11101111 from register 2
writing 11000100 to register 2
setting control-reg output mode
read 11001111 from register 2
writing 11000100 to register 2
read 00101101 from register 0
writing 00000000 to register 0
read 11001111 from register 2
writing 11001011 to register 2
Setting Pins LP_PIN02 LP_PIN04 LP_PIN05 LP_PIN07read 00000000 from register 0
writing 00101101 to register 0
setting input mode on data pins
read 11000000 from register 2
writing 11101011 to register 2
setting control-reg input mode
read 11100000 from register 2
writing 11100100 to register 2
 
starting
read 11101111 from register 2
Pin 1: HIGH
read 11111111 from register 0
Pin 2: HIGH
read 11111111 from register 0
Pin 3: HIGH
read 11111111 from register 0
Pin 4: HIGH
read 11111111 from register 0
Pin 5: HIGH
read 11111111 from register 0
Pin 6: HIGH
read 11111111 from register 0
Pin 7: HIGH
read 11111111 from register 0
Pin 8: HIGH
read 11111111 from register 0
Pin 9: HIGH
read 11111111 from register 1
Pin 10: HIGH
read 11111111 from register 1
Pin 11: HIGH
read 11111111 from register 1
Pin 12: HIGH
read 11111111 from register 1
Pin 13: HIGH
read 11101111 from register 2
Pin 14: HIGH
read 11111111 from register 1
Pin 15: HIGH
read 11101111 from register 2
Pin 16: HIGH
read 11101111 from register 2
Pin 17: HIGH
 

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