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

 


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

[ Divers / C ] Ecrire pour un afficheur LCD

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

Reprise du message précédent :

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 30-10-2011 à 11:54:49  profilanswer
 

n°2108756
Profil sup​primé
Posté le 30-10-2011 à 12:07:13  answer
 


 
 Après reboot j'ai un résultat différent, avec la correction du LP_PIN16  :heink:   :cry:  
 

setting output mode on data pins
read 11100111 from register 2
writing 11001100 to register 2
setting control-reg output mode
read 11000111 from register 2
writing 11001100 to register 2
read 00000000 from register 0
writing 00000000 to register 0
read 00000000 from register 0
writing 00110000 to register 0
Turn input LCD_DATA
setting input mode on data pins
read 11000111 from register 2
writing 11101100 to register 2
 
Data Pin Status: read 10000111 from register 0
1read 10000111 from register 0
0read 10000111 from register 0
0read 10000111 from register 0
0read 10000111 from register 0
0read 10000111 from register 0
1read 10000111 from register 0
1read 10000111 from register 0
1
Expected: 00110000
setting output mode on data pins
read 11100111 from register 2
writing 11001100 to register 2
read 11000111 from register 2
writing 11001111 to register 2
read 00110000 from register 0
writing 00110000 to register 0
read 11000100 from register 2
writing 11001110 to register 2
read 11000101 from register 2
writing 11001111 to register 2


 
Bon espèrent ne pas t'embrouiller.
 
 
-----------------
--   EDIT ----
------------------
 
 
 
 
Et donc, j'ai refais le test après avoir rebranché l'afficheur, c'est pas pareil.  
 

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 00001111 from register 0
Pin 2: HIGH
read 00001111 from register 0
Pin 3: HIGH
read 00001111 from register 0
Pin 4: HIGH
read 00001111 from register 0
Pin 5: HIGH
read 00001111 from register 0
Pin 6: LOW
read 00001111 from register 0
Pin 7: LOW
read 00001111 from register 0
Pin 8: LOW
read 00001111 from register 0
Pin 9: LOW
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



Message édité par Profil supprimé le 30-10-2011 à 12:13:25
n°2108758
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 12:27:57  profilanswer
 

Setting Pins LP_PIN02 LP_PIN04 LP_PIN05 LP_PIN07
read 00000000 from register 0 Il lit le contenu du registre avant d'écrire dedans
writing 00101101 to register 0 il écrit le dans le registre
setting input mode on data pins la c'est la séquence ou on se met en mode lecture
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  et la tout est a 1
WTF!
Déja si l'écriture dans les pins de DATA est pas bonne on est mal barré.
 
Je dois aller manger, a tout a l'heure.
 
A+,


Message édité par gilou le 30-10-2011 à 12:29:20

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

Bon appétit Gilou.
A tout'

n°2108763
Profil sup​primé
Posté le 30-10-2011 à 13:09:19  answer
 

Il y a plus louche encore si je ne m'abuse.
 
Ce code :

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_SWITCHABLE_PINS);                                                                    
  13.  pin_output_mode(LP_DATA_PINS);
  14.  clear_pin(LP_DATA_PINS);
  15.  //clear_pin(LP_SWITCHABLE_PINS);                                                                          
  16.  printf("Setting Pins LP_PIN02 LP_PIN04 LP_PIN05 LP_PIN07" );
  17.  //set_pin(LP_PIN02);                                                                                      
  18.  //pin_input_mode(LP_SWITCHABLE_PINS);                                                                      
  19.  pin_input_mode(LP_DATA_PINS);
  20.  printf("\nstarting\n" );
  21.  for (i = 2; i <= 9; i++)
  22.    printf("Pin %d: %s\n", i, pin_is_set(LP_PIN[i]) ? "HIGH":"LOW" );
  23.  printf("\n\n" );
  24.  
  25.  return 0;
  26. }


 
Donne ceci :
 

setting output mode on data pins
read 11100111 from register 2
writing 11001100 to register 2
read 00000000 from register 0
writing 00000000 to register 0
Setting Pins LP_PIN02 LP_PIN04 LP_PIN05 LP_PIN07setting input mode on data pins
read 11000111 from register 2
writing 11101100 to register 2
 
starting
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


 
C'est normal les read et write dans le registre 2 ?


Message édité par Profil supprimé le 30-10-2011 à 13:09:41
n°2108765
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 13:25:35  profilanswer
 

Oui, c'est ce qui change le fait que le port est en mode lecture ou écriture.
La franchement, je n'y pige plus rien!
Je vais réécrire la même chose mais en plus direct, a coups de inb et outb, comme cela, il n'y aura pas une couche intermédiaire entre l'interface et le code.
 
A+,


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

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. #define BASEPORT 0x378
  6. #define DATAREG     BASEPORT+0
  7. #define STATUSREG   BASEPORT+1
  8. #define CONTROLREG  BASEPORT+2
  9. /* delai d'attente en ms
  10.    arrondi au multiple de 50ms supérieur
  11.    afin de prendre en compte la granularité de usleep */
  12. void msdelay(int delay) {
  13.     int rdelay = delay/50;
  14.     if (!rdelay)
  15. rdelay = 1;
  16.     usleep(rdelay * 50000);
  17. }
  18. #define STROBE     0x01;
  19. // Si on a connecté le pin LCD 5 au 14 du PP, sinon si c'est sur le 16, mettre ici 0x40
  20. #define DIRECTION  0x20;
  21. #define nBUSY      0x80;
  22. void data_write(unsigned char data) {
  23.     // unsigned char status, i, maxtries = 100;
  24.     unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  25.     unsigned char ctl = oldctl & ~DIRECTION; /* on met le flag direction à 0: on est en écriture */
  26.     outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  27.     outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  28.     // for (i = 0; i < maxtries; i++) {  
  29.     // status = inb(STATUSREG); /* au cas ou l'ordi irait plus vite que le péripherique */
  30.     // if((status & nBUSY) == 0)  
  31.     //     break;
  32.     //    }
  33.     outb_p((ctl | STROBE), CONTROLREG); /* Envoi d'un strone haut bas */
  34.     outb_p((ctl &= ~STROBE), CONTROLREG);
  35.     outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  36. }
  37. unsigned char data_read (void) {
  38.     unsigned char data;
  39.     unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  40.     unsigned char ctl = oldctl | DIRECTION; /* on met le flag direction à 1: on est lecture */
  41.     outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  42.     data = inb(BASEREG); /* on récupère l'octet dans le port */
  43.     outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  44.     return data;
  45. }
  46. char *bin_to_char(unsigned char num)
  47. {
  48.   int i;
  49.   static char buf[9];
  50.   buf[8] = '\0';
  51.   for (i = 0; i < 8; i++) {
  52.     if (num & (1 << i))
  53.       buf[7-i] = '1';
  54.     else
  55.       buf[7-i] = '0';
  56.   }
  57.   return buf;   
  58. }
  59. int main (int argc, char * argv[]) {
  60.     int i;
  61.     if (ioperm(BASEPORT, 3, 1)) {
  62. perror("can't set IO permissions!" );
  63. return -1;
  64.     }
  65.  
  66.     // change l'état de l'afficheur de 0FF a ON toutes les 5s
  67.     for (i=0;i<6;i++) {
  68. data_write(0x0F);
  69. sleep(5);
  70. data_write(0x0B);
  71. sleep(5);
  72.     }
  73.    
  74.      // déja si la ca marche on peut aussi tester avec  
  75.     // printf("Donnée lue: %s\n", bin_to_char(data_read()));
  76.     if (ioperm(BASEPORT, 3, 0)) {
  77. perror("can't reset IO permissions!" );
  78. return -1;
  79.     }
  80.     return 0;
  81. }


 
A mes erreurs près, c'est la même chose en mode plus direct.
Ça devrait faire passer l'afficheur en mode OFF a ON etc avec curseur visible et clignotant.
Je suis parti d'un source qui vérifiait dans data_write si le périph était busy au moyen du pin busy du port // (le pin 11 de ce port), mais comme chez toi il est pas soudé, j'ai mis cette partie en commentaire.
 
Gaffe au  
// Si on a connecté le pin LCD 5 (RW) au 14 du PP, sinon si c'est sur le 16, mettre ici 0x40
#define DIRECTION  0x20;  
Apparement, la pratique courante est de mettre l'indication R/W sur le 14 au vu de docs
A+,


Message édité par gilou le 30-10-2011 à 15:11:16

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


void:/home/root/paralcd-0.0.0beta# gcc -o paralcd_beta paralcd_beta.c -O2
paralcd_beta.c: In function ‘data_write’:
paralcd_beta.c:32: error: expected ‘)’ before ‘;’ token
paralcd_beta.c:33: error: expected ‘)’ before ‘;’ token
paralcd_beta.c: In function ‘data_read’:
paralcd_beta.c:41: error: ‘BASEREG’ undeclared (first use in this function)
paralcd_beta.c:41: error: (Each undeclared identifier is reported only once
paralcd_beta.c:41: error: for each function it appears in.)


 
Pour la ligne 41 j'ai corrigé, mais pour les 32 et 33, je sais pas quoi faire, il semble que les opération | et &= ne soit pas fonctionnelles.
 
Enfait c'est ligne 37 et 38 dans ton code.


Message édité par Profil supprimé le 30-10-2011 à 15:15:20
n°2108779
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 15:28:57  profilanswer
 

Si onvire les trucs inutiles on devrait avoir ceci:
 

Code :
  1. void data_write(unsigned char data) {
  2.     unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  3.     unsigned char ctl = oldctl & ~DIRECTION; /* on met le flag direction à 0: on est en écriture */
  4.     outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  5.     outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  6.     outb_p((ctl | STROBE), CONTROLREG); /* Envoi d'un strone haut bas */
  7.     outb_p((ctl & ~STROBE), CONTROLREG);
  8.     outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  9. }


 
Si les lignes  
   outb_p((ctl | STROBE), CONTROLREG); /* Envoi d'un strone haut bas */
   outb_p((ctl & ~STROBE), CONTROLREG); /* NOTE: il y avait un = en trop dans cette dernière */
sont celles posant pb, alors tenter ceci:

Code :
  1. void data_write(unsigned char data) {
  2.     unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  3.     unsigned char flag = DIRECTION;
  4.     unsigned char ctl = oldctl & ~flag; /* on met le flag direction à 0: on est en écriture */
  5.     outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  6.     outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  7.     flag = STROBE;
  8.     outb_p((ctl | flag), CONTROLREG); /* Envoi d'un strone haut bas */
  9.     outb_p((ctl & ~flag), CONTROLREG);
  10.     outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  11. }


la on n'a plus des macros, ça devrait coller.
 
A+,


Message édité par gilou le 30-10-2011 à 15:32:14

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

J'ai une erreur de segmentation avant même d'avoir atteint le premier ioperm dans main.

mood
Publicité
Posté le 30-10-2011 à 15:44:45  profilanswer
 

n°2108783
Profil sup​primé
Posté le 30-10-2011 à 15:55:48  answer
 

Maintenant, il plante sur "outb_p(ctl, CONTROLREG);" dans data_write ; Erreur de Segmentation.
 
Avec data_write :
 

Code :
  1. void data_write(unsigned char data) {
  2.  unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  3.  unsigned char flag = DIRECTION;
  4.  unsigned char ctl = oldctl & ~flag; /* on met le flag direction à 0: on est en écriture */
  5.  printf("outb_p : ctl \n" );
  6.  outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  7.  printf("outb_p : data \n" );
  8.  outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  9.  flag = STROBE;
  10.  outb_p((ctl | flag), CONTROLREG); /* Envoi d'un strone haut bas */
  11.  outb_p((ctl & ~flag), CONTROLREG);
  12.  outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  13. }

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

??
J'ai fait que adapter ce qui est ici: http://as6edriver.sourceforge.net/ [...] wmode.html
( qui était un poil buggé )
La franchement, je vois pas pourquoi ça plante, surtout à distance.
 
parce que la, on écrit a une adresse tout à fait valable (sinon, ioperm(BASEPORT, 3, 1) serait retourné avec -1)
bon, en simplifiant à l'extreme, on a:

Code :
  1. void data_write(unsigned char data) {
  2.   unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  3.   unsigned char ctl = oldctl & 0xDF; /* on met le flag direction à 0: on est en écriture */
  4.   printf("outb_p : ctl \n" );
  5.   outb_p(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  6.   printf("outb_p : data \n" );
  7.   outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  8.   ctl |= 0x01:
  9.   outb_p(ctl, CONTROLREG); /* Envoi d'un strone haut bas */
  10.   ctl &= 0xFE;
  11.   outb_p(ctl, CONTROLREG);
  12.   outb_p(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  13. }


Si ça ça plante, je sais pas quoi dire, vu que c'est complètement standard et valable.
Comme outb_p est une macro, a tout hasard, j'ai tous mis sous la forme la plus simple possible.
A+,


Message édité par gilou le 30-10-2011 à 16:47:57

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

Si j'utilise outb et non outb_p et que ça tourne c'est pas plus mal ?
 
Par contre toujours pas de curseur clignotant sur l'afficheur.
 
Je reboote, ça clignote toujours po.  
 
 
La sortie console.

Check i/o perm  
Data write 0x0F  
outb : ctl  
outb : data  
outb :0x01 on ctl  
outb :0xFe on ctl  
outb :oldctl on ctl  
Data write 0x0B  
outb : ctl  
outb : data  
outb :0x01 on ctl  
outb :0xFe on ctl  
outb :oldctl on ctl  
Data write 0x0F  
outb : ctl  
outb : data  
outb :0x01 on ctl  
outb :0xFe on ctl  
outb :oldctl on ctl  
Data write 0x0B  
outb : ctl  
outb : data  
outb :0x01 on ctl  
outb :0xFe on ctl  
outb :oldctl on ctl

n°2108789
Profil sup​primé
Posté le 30-10-2011 à 17:31:43  answer
 

Faudrait commencer par effacer le registre de contrôle.
 
Après, j'ai le pin 14 qui clignote. Mais pas le 1. sur le port //

 
Et c'est ce code que je fait tourner.
 

Code :
  1. void data_write(unsigned char data) {
  2.  
  3.  unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  4.  
  5.  unsigned char flag = DIRECTION;
  6.  
  7.  unsigned char ctl = oldctl & ~flag; /* on met le flag direction à 0: on est en écriture */
  8.  
  9.  printf("outb : ctl \n" );
  10.  
  11.  outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur avec pause jusqu'a achévement */
  12.  
  13.  printf("outb : data \n" );
  14.  usleep(200000);
  15.  outb(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  16.  usleep(300000);
  17.  flag = STROBE;
  18.  printf("validation \n" );
  19.  outb((ctl | flag), CONTROLREG); /* Envoi d'un strone haut bas */
  20.  outb((ctl & ~flag), CONTROLREG);
  21.  outb(oldctl, CONTROLREG); /*restauration à la valeur d'entrée */
  22. }


 
En fait le 1 clignote bien, j'avais pas mis de temporisation.


Message édité par Profil supprimé le 30-10-2011 à 17:38:12
n°2108793
Profil sup​primé
Posté le 30-10-2011 à 18:04:46  answer
 

J'ai pas d'ohm mêtre pour vérifier formellement le montage qu'est soudé.
Mardi l'électronicien ouvre à dix heure. à midi je serait fixé.
 
sodo gravier si c'est mon montage qui marchais pas ?  [:xeen]  


Message édité par Profil supprimé le 30-10-2011 à 18:11:56
n°2108810
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 20:00:50  profilanswer
 

A priori non si tu met un peu de temporisation après chaque appel à outb.
A+,


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

En ajoutant du délais, je m'aperçois que E et R/W sont envoyé en même temps

n°2108816
Profil sup​primé
Posté le 30-10-2011 à 20:19:06  answer
 

Fausse alerte, c'était un court jus !
 [:dawa_neowen]


Message édité par Profil supprimé le 30-10-2011 à 20:19:46
n°2108818
Profil sup​primé
Posté le 30-10-2011 à 20:22:33  answer
 

N'emp$eche c'est bien RW qui est écrit et non RS. avec E

n°2108828
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 21:11:01  profilanswer
 

Ben oui, quand tu m'as dit que le pin 14 clignotait, ça m'a surpris:
Normalement, data_write
1) écrit la valeur direction, qui est interne au port // et n'est pas envoyée à l'extérieur
2) écrit sur les pins de donnée
3) écrit le strobe (pin 1 du port // et E sur le LCD)
 
J'ai pas touché à RS et RW, les supposant par défaut à 0
 
Alors c'est louche que l'on ait des choses arrivant sur RW (ou RE)
 
A+,


Message édité par gilou le 30-10-2011 à 21:12:22

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

Ca allume que la broche 1 là.
Je confondait la 1 avec E.
 
Les deux afficheur ont un comportement différent, c'est pas normal.
 
Tout a l'heure, ça m'afficher deux trait verticaux, qu'était comme incrémenté à chaque itération du code.

n°2108832
gilou
Modérateur
Modzilla
Posté le 30-10-2011 à 21:49:03  profilanswer
 

Bon, je viens de vois qu'avec cette foutue histoire de logique inversée, pour certains pins, quand on fait
ctl &= 0xFE; en fait en sortie le pin associe a 0x01 est en sortie à haut
et que quand on fait  
ctl |= 0x01; le pin associe a 0x01 est en sortie à haut :pt1cable:  
Donc on faisait l'inverse de ce qu'il fallait faire.
[Normal, un strobe dans un protocole imprimante était haut/bas/haut haut étant la position par défaut, mais dans le protocole pour le lcd c'est bas/haut/bas, avec bas la position par défaut]
J'approfondis un peu plus cela, et je poste un truc plus convenable.
 
Logique inversée a la con d'ailleurs: si on veut avoir 0 en sortie sur tous les pins de controle, il faut mettre dans le registre de controle 0xXXXX1011 (seuls les 4 valeurs du bas correspondent a des pins du port) parce 3 sur 4 seulement sont inversés :pt1cable:  
Bon, maintenant que j'ai pigé ceci, ça devrait aller.
 
A+,


Message édité par gilou le 30-10-2011 à 22:20:20

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

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. #define BASEPORT 0x378
  6. #define DATAREG     BASEPORT+0
  7. #define STATUSREG   BASEPORT+1
  8. #define CONTROLREG  BASEPORT+2
  9. void data_write(unsigned char data) {
  10.     unsigned char oldctl = inb(CONTROLREG); /* On sauve la valeur courante */
  11.     unsigned char ctl = oldctl;
  12.     ctl &= 0xF0;  // On touche pas au valeurs hautes, on vire les basses
  13.     ctl |= 0x0B; // On force le bas à 1011 ce qui va mettre tout à 0 en sortie
  14.     ctl &= 0xDF; // 0n met le flag direction à 0: on est en écriture
  15.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  16.     // usleep?
  17.     outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  18.     // si outb_p ne plante pas
  19.     ctl &= 0xFE; // registre strobe mis a 0 => signal strobe haut en sortie
  20.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  21.     // usleep?
  22.     ctl |= 0x01; // registre strobe mis a 1 => signal strobe bas en sortie
  23.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  24.     //usleep?
  25.     outb(oldctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  26. }
  27. int main (int argc, char * argv[]) {
  28.     int i;
  29.     if (ioperm(BASEPORT, 3, 1)) {
  30. perror("can't set IO permissions!" );
  31. return -1;
  32.     }
  33.  
  34.     // change l'état de l'afficheur de 0FF a ON toutes les 5s
  35.     for (i=0;i<6;i++) {
  36. data_write(0x0F);
  37. sleep(5);
  38. data_write(0x0B);
  39. sleep(5);
  40.     }
  41.     if (ioperm(BASEPORT, 3, 0)) {
  42. perror("can't reset IO permissions!" );
  43. return -1;
  44.     }
  45.     return 0;
  46. }


J'ai mis des outb mais des outb_p ça serait mieux si ça plante pas, sinon, faut sans doute 100 ms (taillé large) entre chaque outb.
La ligne
ctl &= 0xDF; // 0n met le flag direction à 0: on est en écriture  
est peut être pas utile (par défaut, on devrait être en écriture), la supprimer éventuellement.
 
A+,


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

J'ai mis du contraste.
Au démarrage de la machine à froid, j'ai les  6 ou 8 denier caractère des deux denière ligne en caractère plein.
Suite à la mise à zero en envoyant 255 sur le registre de controle, j'ai la première et la troisième ligne pleine de caractère plein.
 
Et enfin, j'ai un curseur qui clignote.


Message édité par Profil supprimé le 30-10-2011 à 23:50:41
n°2108836
Profil sup​primé
Posté le 30-10-2011 à 23:49:07  answer
 

il semble allumé, mais il s'éteint pas alors.

n°2108837
Profil sup​primé
Posté le 31-10-2011 à 00:22:31  answer
 

L'autre afficheur, parce que l'autre est mort ou presque on dirait, et mort aussi. [ [:cend]  
J'ai pas les 8 premier caractère des deux première ligne donc je vois pas le curseur.
Pär contre le reste est plein.
Faudrait écrire quelque chose ou avancer de 8 ou sauter deux lignes.
 
Voila je commanderait d'autre afficheur, et j'affinerais mes soudure la semaine prochaine.
 

n°2108935
gilou
Modérateur
Modzilla
Posté le 31-10-2011 à 17:17:36  profilanswer
 

En tout cas, si la logique de commande des pins suit ce qu'on a dit hier, ceci aurait quelques chances de marcher, à mes fautes typo près:
 

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. // delai d'attente en ms  
  11. void delay(int mstime) {
  12.     usleep(mstime * 1000);
  13. }
  14. // Initialisation des registres, sauvegarde du registre de controle
  15. unsigned char init_port() {
  16.     unsigned char oldctl, ctl;
  17.     // 1) mise à 0 des datas. Ainsi, même si le 2 déclenche un strobe, il n'aura pas d'effet
  18.     outb_p(0x00, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  19.     // si outb_p ne plante pas
  20.     // 2) Mise a jour du registre des valeurs des pins de controle si necessaire
  21.     oldctl = ctl = inb(CONTROLREG);
  22.     ctl &= 0xD0;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0
  23.     ctl |= 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle
  24.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  25. outb(ctl, CONTROLREG);
  26. delay(2);
  27.     }
  28.     return oldctl;
  29. }
  30. // Restauration du registre de controle
  31. void restore_port(unsigned char oldctl) {
  32.     unsigned char ctl;
  33.     // 1) mise à 0 des datas. Ainsi, même si le 2 déclenche un strobe, il n'aura pas d'effet
  34.     outb_p(0x00, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  35.     // si outb_p ne plante pas
  36.     // 2) Mise a jour du registre des valeurs des pins de controle si necessaire
  37.     ctl = inb(CONTROLREG);
  38.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  39. outb(oldctl, CONTROLREG);
  40. delay(2);
  41.     }
  42. }
  43. // Envoi de commandes et données SPP -> LCD
  44. void data_write(unsigned char data) {
  45.     unsigned char oldctl, ctl;
  46.     // 1) Mise a jour du registre des valeurs des pins de controle si necessaire
  47.     oldctl = ctl = inb(CONTROLREG);
  48.     ctl &= 0xD0;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0
  49.     ctl |= 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle
  50.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  51. outb(ctl, CONTROLREG);
  52. delay(2);
  53.     }
  54.  
  55.     // 2) Mise de la valeur dans le registre data
  56.     outb_p(data, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  57.     // si outb_p ne plante pas
  58.     // 3) envoi d'un strobe pour signaler au LCD une commande
  59.     ctl &= 0xFE; // registre strobe mis a 0 => signal strobe haut en sortie
  60.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  61.     delay(2);
  62.     ctl |= 0x01; // registre strobe mis a 1 => signal strobe bas en sortie
  63.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  64.     delay(2);
  65. }
  66. // Lecture de donnée LCD -> SPP
  67. // ram positionné: on lit la valeur de la donnée en ram du LCD a l'adresse courante. associé à RS a 1 en sortie
  68. // ram non positionné: on lit la valeur de l'adresse courante du LCD et le flag busy en poids fort. associé à RS a 0 en sortie
  69. unsigned char data_read(int ramdata) {
  70.     unsigned char data;
  71.     // 1) mise à 0 des datas. C'est peut être inutile
  72.     outb_p(0x00, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  73.     // si outb_p ne plante pas
  74.     // 2) Mise a jour du registre des valeurs des pins de controle si necessaire
  75.     oldctl = ctl = inb(CONTROLREG);
  76.     ctl &= 0xF0;  // Bits du bas à 0
  77.     ctl |= 0x20;  // Bits du haut: direction mise à 1 (écriture)   
  78.     if (ramdata) {
  79. ctl |= 0x03;  // On force le bas à 0001 ce qui va mettre RW et RS a 1 en sortie et le reste à 0   
  80.     } else {
  81. ctl |= 0x09;  // On force le bas à 1001 ce qui va mettre RW a 1 en sortie et le reste à 0   
  82.     }
  83.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  84. outb(ctl, CONTROLREG);
  85. delay(2);
  86.     }
  87.     // 3) envoi d'un strobe pour signaler au LCD une commande
  88.     ctl &= 0xFE; // registre strobe mis a 0 => signal strobe haut en sortie
  89.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  90.     delay(2);
  91.     ctl |= 0x01; // registre strobe mis a 1 => signal strobe bas en sortie
  92.     outb(ctl, CONTROLREG); /* écriture du registre de controle avec cette valeur */
  93.     delay(2);
  94.     // 4) lecture des données
  95.     if (ramdata) { // temps de lecture en RAM du LCD   
  96. delay(1);
  97.     }
  98.     data = inb(BASEREG);
  99.     return data;
  100. }
  101. // Commandes admissibles par le LCD
  102. // Le bit non nul le plus haut détermine la commande
  103. // A priori, 00000000 -> Rien
  104. // 00000001 -> LCD Clear
  105. void LCD_Clear() {
  106.     unsigned char command = 0x01;  // Clear command
  107.     data_write(command);
  108.     delay(2);
  109. }
  110. // 0000001x -> LCD Home
  111. void LCD_Home() {
  112.     unsigned char command = 0x02;  // Home command
  113.     data_write(command);
  114.     delay(2);
  115. }
  116. // 000001xx -> LCD EntryMode
  117. void LCD_EntryMode(int lr, int shiftt) {
  118.     unsigned char command = 0x04;  // Entry Mode command
  119.     if (lr)      command |= 0x02; // Left -> Right [else Right Left] default
  120.     if (shift)   command |= 0x01; // Shift visible   
  121.     data_write(command);
  122.     delay(2);
  123. }
  124. // 00001xxx -> LCD Display
  125. void LCD_Display(int on, int cursor, int blink) {
  126.     unsigned char command = 0x08;  // DISPLAY command
  127.     if (on)      command |= 0x04; // Display on/off bit
  128.     if (cursor)  command |= 0x02; // Cursor on/off bit
  129.     if (blink)   command |= 0x01; // Cursor blink on/off bit
  130.     data_write(command);
  131.     delay(2);
  132. }
  133. // 0001xxxx -> LCD CursorMove (et Display Move)
  134. // 001xxxxx -> LCD Mode
  135. void LCD_Mode(int size8, int line2, int bigfont) {
  136.     unsigned char command = 0x20;  // Mode command
  137.     if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  138.     if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  139.     if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  140.     data_write(command);
  141.     delay(2);
  142. }
  143. // 01xxxxxx -> LCD Set CGRAM
  144. // 1xxxxxxx -> LCD Set DDRAM
  145. // Routines d'un peu plus haut niveau
  146. // On écrit un caractère
  147. void LCD_WriteChar(char c) {
  148.     data_write(c);
  149. }
  150. // On écrit une chaine
  151. void LCD_WriteString(char *s) {
  152.     unsigned char oldctl, ctl;
  153.     // 1) Mise a jour du registre des valeurs des pins de controle si necessaire
  154.     oldctl = ctl = inb(CONTROLREG);
  155.     ctl &= 0xD0;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0
  156.     ctl |= 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle
  157.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  158. outb(ctl, CONTROLREG);
  159. delay(2);
  160.     }
  161.     while (*s) {
  162. // Mise du caractère dans le registre data
  163. outb_p(*s, DATAREG);
  164. // si outb_p ne plante pas
  165. // 3) envoi d'un strobe pour signaler au LCD une commande
  166. ctl &= 0xFE;
  167. outb(ctl, CONTROLREG);
  168. delay(2);
  169. ctl |= 0x01;
  170. outb(ctl, CONTROLREG);
  171. delay(2);
  172. s++;
  173.     }
  174. }
  175. // Configuration initiale
  176. void LCD_SoftReset() {
  177.     // D'abord, 3 LCD_Mode avec la valeur correcte pour bit8
  178.     LCD_Mode(1,1,0); // Mode 8 bits data, 2 lines, 5x8 font
  179.     delay(5);
  180.     LCD_Mode(1,1,0); // Mode 8 bits data, 2 lines, 5x8 font
  181.     delay(2);
  182.     LCD_Mode(1,1,0); // Mode 8 bits data, 2 lines, 5x8 font
  183.     delay(2);
  184.     // Maintenant les parametres seront pris en compte
  185.     LCD_Mode(1,1,0); // Mode 8 bits data, 2 lines, 5x8 font
  186.     // les valeurs qui viennent d'être passé seront inchangeables dorénavant
  187.     LCD_Display(0, 0, 0); // Display Off
  188.     LCD_Clear(); // Display Clear
  189.     LCD_EntryMode(1, 0); // Left-Right, no shift
  190.     // Fin de la séquence de reset soft
  191. }
  192. int main (int argc, char * argv[]) {
  193.     unsigned char ctl;
  194.     if (ioperm(BASEPORT, 3, 1)) {
  195. perror("can't set IO permissions!" );
  196. return -1;
  197.     }
  198.     ctl = init_port();
  199.    
  200.     // Par défaut le hard reset de mise sous tension fait comme si on avait fait un SoftReset  
  201.     // avec les parametres suivants en fin de séquence:
  202.     // LCD_Mode(1,1,0);
  203.     // LCD_Display(0, 0, 0);  
  204.     // LCD_EntryMode(1, 0);
  205.     // Décommenter la ligne suivante si tu veux être en mode 2 lignes
  206.     //* LCD_SoftReset(); */
  207.     // A ce stade, on est prêt a utiliser le LCD
  208.     LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink
  209.     // On peut afficher du texte
  210.     LCD_WriteString("Jovalise" );
  211.     restore_port(ctl);
  212.     if (ioperm(BASEPORT, 3, 0)) {
  213. perror("can't reset IO permissions!" );
  214. return -1;
  215.     }
  216.     return 0;
  217. }


 
Bon, le seul truc a vérifier, c'est que ces routines mettent bien les pins de contrôle aux valeurs supposés.  
EDIT: Modifié, après que j'aie compris comment marche la réinitialisation soft
 
 
Bon,voici un petit programme de test de la mise à 1 des pins de controle du port //
Pas besoin de brancher un LCD pour ce test, des leds ou un voltmetre devrait suffire
Si ce test marche (leds allumées ou éteintes comme ce que le test affiche en console, et les leds a 0 a la première question du test, avant qu'on y réponde)
alors le programme précédent, au vu de la doc constructeur, doit marcher aussi
(et si c'est pas la cas, mes soupçons porteront sur le montage et les soudures  :D )

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. // delai d'attente en ms  
  11. void delay(int mstime) {
  12.     usleep(mstime * 1000);
  13. }
  14. // Initialisation des registres, sauvegarde du registre de controle
  15. unsigned char init_port() {
  16.     unsigned char oldctl, ctl;
  17.     // 1) mise à 0 des datas. Ainsi, même si le 2 déclenche un strobe, il n'aura pas d'effet
  18.     outb_p(0x00, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  19.     // si outb_p ne plante pas
  20.     // 2) Mise a jour du registre des valeurs des pins de controle si necessaire
  21.     oldctl = ctl = inb(CONTROLREG);
  22.     ctl &= 0xD0;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0
  23.     ctl |= 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle
  24.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  25. outb(ctl, CONTROLREG);
  26. delay(2);
  27.     }
  28.     return oldctl;
  29. }
  30. // Restauration du registre de controle
  31. void restore_port(unsigned char oldctl) {
  32.     unsigned char ctl;
  33.     // 1) mise à 0 des datas. Ainsi, même si le 2 déclenche un strobe, il n'aura pas d'effet
  34.     outb_p(0x00, DATAREG); /* ecriture de l'octet avec pause jusqu'a achévement*/
  35.     // si outb_p ne plante pas
  36.     // 2) Mise a jour du registre des valeurs des pins de controle si necessaire
  37.     ctl = inb(CONTROLREG);
  38.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  39. outb(oldctl, CONTROLREG);
  40. delay(2);
  41.     }
  42. }
  43. // Envoi de commandes et données SPP -> LCD
  44. void control_write(int rs, int rw, int e) {
  45.     unsigned char oldctl, ctl;
  46.     // 1) Mise a jour du registre des valeurs des pins de controle si necessaire
  47.     oldctl = ctl = inb(CONTROLREG);
  48.     ctl &= 0xD0;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0
  49.     ctl |= 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle
  50.     if (rs) ctl &= 0xF7;
  51.     if (rw) ctl &= 0xFD;
  52.     if (e)  ctl &= 0xFE;
  53.     if (oldctl != ctl) { // on met pas a jour si c'est déjà bon
  54. outb(ctl, CONTROLREG);
  55. delay(2);
  56.     }
  57. }
  58. int main (int argc, char * argv[]) {
  59.     unsigned char ctl;
  60.     char buffer[1024];
  61.     int rs, rw, e;
  62.     int i;
  63.     if (ioperm(BASEPORT, 3, 1)) {
  64. perror("can't set IO permissions!" );
  65. return -1;
  66.     }
  67.     ctl = init_port();
  68.     // boucle de test
  69.     printf("Debut du test\n" );
  70.     while(1) {
  71. rs = rw = e = 0;
  72. for (i=0; i<3; i++) {
  73.     buffer[i] = 0;
  74. }
  75. printf("Choisissez les pins a a la valeur 1\n" );
  76. printf("S pour RS, W pour RW et E pour E\n" );
  77. printf("On peut combiner les 3 lettres: SEW etc.\n" );
  78. printf("Ou tapez Q pour quitter\n" );
  79. gets(buffer);
  80. buffer[3] = 0;
  81. if ( buffer[0] == 'Q' || buffer[0] == 'q'
  82.      ||  buffer[1] == 'Q' || buffer[1] == 'q'
  83.      ||  buffer[2] == 'Q' || buffer[2] == 'q')
  84.     break// sortie de la boucle
  85. if ( buffer[0] == 'S' || buffer[0] == 's'
  86.      ||  buffer[1] == 'S' || buffer[1] == 's'
  87.      ||  buffer[2] == 'S' || buffer[2] == 's')
  88.     rs = 1;
  89. if ( buffer[0] == 'W' || buffer[0] == 'w'
  90.      ||  buffer[1] == 'W' || buffer[1] == 'w'
  91.      ||  buffer[2] == 'W' || buffer[2] == 'w')
  92.     rw = 1;
  93. if ( buffer[0] == 'E' || buffer[0] == 'e'
  94.      ||  buffer[1] == 'E' || buffer[1] == 'e'
  95.      ||  buffer[2] == 'E' || buffer[2] == 'e')
  96.     e = 1;
  97. printf("\nMise a jours de RS RW E\n" );
  98. printf("               [%d  %d  %d]\n\n", rs, rw, e);
  99. control_write(rs, rw, e);
  100. printf("Tapez Q pour quitter et retour chariot pour recommencer\n" );
  101. gets(buffer);
  102. buffer[1] = 0;
  103. if ( buffer[0] == 'Q' || buffer[0] == 'q' )
  104.     break// sortie de la boucle
  105. printf("\n\n\n" );
  106.     }
  107.     printf("Fin du test\n" );
  108.     restore_port(ctl);
  109.     if (ioperm(BASEPORT, 3, 0)) {
  110. perror("can't reset IO permissions!" );
  111. return -1;
  112.     }
  113.     return 0;
  114. }


 
 
A+,


Message édité par gilou le 31-10-2011 à 23:06:28

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

Bonjour Gilou.
 
Le teste ne fonctionne pas.
 
Si je fait E, pin 1 allumé
Si je fait W, pin 14 éteint
 
Faux envoyer 255 sur le registre de contrôle pour tout éteindre entre deux commande. (si non, le comportement n'est pas le même)
 
Après si je fait W le pin 14 s'allume.
 
EW fonctionne, mais pas SWE, le pin 17 ne s'allume pas. D'ailleurs S ne fonctionne pas seul non plus.


Message édité par Profil supprimé le 01-11-2011 à 09:02:45
n°2109001
Profil sup​primé
Posté le 01-11-2011 à 09:20:38  answer
 

Si j'envoie 0 à 10 en décimal précédé de l'envoie de 255 à chaque itération.  
0 = EW
1 = W
2 = E
3 = off  
4 = EWS
5 = WS
6 = ES
7 = S
8 = EW
9 = W
10 = E
 
Même si j'envoie pas 255 ça marche pareil.

Message cité 1 fois
Message édité par Profil supprimé le 01-11-2011 à 09:37:44
n°2109009
Profil sup​primé
Posté le 01-11-2011 à 10:00:02  answer
 

Et je confirme que dans le programme de pilotage du LCD, au dessus de ton test, RS n'est jamais écrit.

n°2109024
Profil sup​primé
Posté le 01-11-2011 à 11:02:15  answer
 

Correction de mon code fait, 0xDB envoie 219, et tout est éteint.
 

Code :
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/io.h>
  6.  
  7. #define PORTADDRESS 0x378+2
  8.  
  9. int main (int argc, char * argv[])
  10. {
  11.  char * endptr = NULL;
  12.  long i;
  13.  if(ioperm(PORTADDRESS, 3, 1)) {
  14.    perror("ioperm" );
  15.    return 1;
  16.  }
  17.  i = strtol(argv[1], &endptr , 16);
  18.   outb(255, PORTADDRESS);
  19.  usleep(20000);
  20.  outb(i, PORTADDRESS);
  21.  printf("%d \n" , i);
  22.  return 0;
  23. }


Message édité par Profil supprimé le 01-11-2011 à 11:03:43
n°2109029
gilou
Modérateur
Modzilla
Posté le 01-11-2011 à 11:56:00  profilanswer
 

On testerait pas la bonne patte?
Tu testes quelle patte du LCD pour RS? la 17?
 
A+,


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

Avec Control_Write comme suit, le test fonctionne.  :o  
 

Code :
  1. void control_write(int rs, int rw, int e) {
  2.  unsigned char oldctl, ctl;
  3.  // 1) Mise a jour du registre des valeurs des pins de controle si necessaire                                                              
  4.  oldctl  = inb(CONTROLREG);
  5.  ctl = 0xFF;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0                                                            
  6.  //ctl = 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle                                  
  7.  if (rs) ctl = 0x07;
  8.  if (rw) ctl = ctl & 0xFD;
  9.  if (e)  ctl = ctl & 0xFE;
  10.  if (oldctl != ctl) { // on met pas a jour si c'est déjà bon                                                                                
  11.    outb(ctl, CONTROLREG);
  12.    delay(2);
  13.  }
  14. }

n°2109031
Profil sup​primé
Posté le 01-11-2011 à 11:57:14  answer
 

gilou a écrit :

On testerait pas la bonne patte?
Tu testes quelle patte du LCD pour RS? la 17?
 
A+,


 
La 17 sur le port parallèle, y a que 16 pin sur le LCD  :o

n°2109032
gilou
Modérateur
Modzilla
Posté le 01-11-2011 à 11:58:45  profilanswer
 

Bon ben je vais traduire ca en binaire et essayer de comprendre, sachant que normalement le bit 4 est RS, le bit 3 on s'en fout, le bit 2 est RW est le bit 1, E, et que RS, RW et E sont en mode inversé.
 
A+,


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

Oui, pour l'instant, seul ce qui sort du port // m'intéresse.
Si ce qu'on sort est OK, la commande correcte du LCD devrait rouler.
 
Normalement on doit tester RS: 17 du // RW: 14 du // et E: 1 du //
 
A+,


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


 
 
avec les afecteur logique sur RW et E aussi ça fonctionne remarque.
Comme ça quoi :
 

Code :
  1. void control_write(int rs, int rw, int e) {
  2.  unsigned char oldctl, ctl;
  3.  // 1) Mise a jour du registre des valeurs des pins de controle si necessaire                                                              
  4.  oldctl  = inb(CONTROLREG);
  5.  ctl = 0xFF;  // Bits du haut: direction mise à 0 (écriture) et bits du bas à 0                                                            
  6.  //ctl = 0x0B;  // On force le bas à 1011 ce qui va mettre tout à 0 en sortie pour les valeurs de controle                                  
  7.  if (rs) ctl = 0x07;
  8.  if (rw) ctl &= 0xFD;
  9.  if (e)  ctl &= 0xFE;
  10.  if (oldctl != ctl) { // on met pas a jour si c'est déjà bon                                                                                
  11.    outb(ctl, CONTROLREG);
  12.    delay(2);
  13.  }
  14. }

n°2109035
Profil sup​primé
Posté le 01-11-2011 à 12:04:04  answer
 

gilou a écrit :


 
Normalement on doit tester RS: 17 du // RW: 14 du // et E: 1 du //
 


 
Ouais, ça c'est 0k.

n°2109036
gilou
Modérateur
Modzilla
Posté le 01-11-2011 à 12:14:43  profilanswer
 

Bon, en déchiffrant le binaire, je constate que tout se passe (a 2e vue, je suis moins certain) comme si RS était soudé sur la patte 16 du // (qui n'est pas en logique inverse) tandis que RW et E sont OK.
Donc, je me répète, est tu bien sur que RS est soudé sur la patte 17.
Si oui, bon tant pis, je modifierais mon code pour faire comme si c'était sur la patte 16, et ça devrait rouler.
Je vais bouffer et serais dispo à nouveau dans 30-40 mn.
Je pense qu'on touche au but.
A+,


Message édité par gilou le 01-11-2011 à 12:25:42

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

Euh, tout le test marche si tu vire cette ligne?
A+,


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

Mon led pour RS était soudé sur 17... ET 16 [:spamafate]
Du coup, le test original fonctionne en fait
Par contre dans le code du pilote, RS ne s'allume toujours pas.
A moins que t'ai pas mis de délay après une mise à 1 de RS.

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