FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  [PIC][ASM]control d'un LCD

 




Il y a 38 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PIC][ASM]control d'un LCD

n°4892
gashineshv​a
Posté le 28-01-2005 à 23:02:09  profilanswer
 

alors je m'éxplique:
 
j'ai besoin de controler un LCD (2*16 controleur HD44780) pour mon theme de bac (STI éléctronique), alors j'ai un début de programme mais l'initialisation du LCD ne se fait pas enfin il ne m'affiche rien sur la ligne 1 mais des carrés plein sur la seconde...
 
pour l'instant le programme ne doit permettre que l'initialisation et l'affichage d'un caractere sur la premiere ligne, premier caractere.
 
voila mon code:

Code :
  1. ;===========================================================
  2. ; programme de test de LCD 2*16 Caractères en mode 8 Bits
  3. ; par LONGUET Gilles
  4. ; pour le thème de BAC STI Génie éléctronique session 2005
  5. ;===========================================================
  6.   List p=16f84     ; directive du choix du composant
  7.   #include "p16f84.inc"   ; déclaration du fichier des symboles
  8.   __config 0x3ff2    ; configuration PIC16F84
  9.        ; (type d’oscillateur entre autre)
  10. ;===========================================================
  11. ; definition des différents bits
  12.   #define  LCD_RS PORTA,0
  13.   #define  LCD_EN PORTA,1
  14. ;===========================================================
  15. ; définition vaariable
  16. tempo1  EQU  0x0C
  17. tempo2  EQU  0x0D
  18. ;===========================================================
  19. ;===========================================================
  20. ; Programme principal
  21. ;===========================================================
  22.   call inipic
  23.   call iniLCD
  24.   call test
  25. ;===========================================================
  26. ; fin du programme principal
  27. ;===========================================================
  28. ;===========================================================
  29. ;===========================================================
  30. ; Sous fonctions
  31. ;===========================================================
  32. ; initialisation du pic
  33. inipic
  34.   bsf  STATUS,RP0      ; sélectionner banque 1 en mettant a 1
  35.            ; le bit RP0 du registre STATUS
  36.   movlw  0x00       ; mettre 00 (0000 0000) dans le registre w
  37.   movwf  TRISB       ; transfert de w dans TRISB pour mettre
  38.            ; tt les bits du port B en sortie
  39.   movlw  0x00       ; mettre 00 (0000 0000) dans le registre w
  40.   movwf  TRISA       ; transfert de w dans TRISA pour mettre
  41.            ; tt les bits du port A en sortie
  42.   movlw  0x00       ; mettre 00 dans w
  43.   movwf  OPTION_REG      ; initialiser registre option
  44.   bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  45.            ; le bit RP0 du registre STATUS
  46.   ;initialisation des variables du timer
  47.   movlw 0x00
  48.   movwf tempo1
  49.   movlw 0x00
  50.   movwf tempo2
  51.   return
  52. ;===========================================================
  53. ;initialisation du LCD
  54. iniLCD  bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  55.   movlw .200      ;charge le temps d'attente dans w
  56.   call delay_100us     ;on attent 20ms
  57.   movlw 0x30      ;commande set LCD en mode 8 bits
  58.   movwf PORTB      ;on place les données sur le PORTB
  59.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  60.   call valid_EN     ;on valide le LCD
  61.   movlw .50       ;on charge le temps d'attente dans w
  62.   call delay_100us     ;on attent 5ms
  63.   movlw 0x30      ;commande set LCD en mode 8 bits
  64.   movwf PORTB      ;on place les données sur le PORTB
  65.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  66.   call valid_EN     ;on valide le LCD
  67.   movlw .1       ;on charge le temps d'attente dans w
  68.   call delay_100us     ;on attent 100µs
  69.   movlw 0x3C      ;commande set LCD en mode 8 bits,2 lignes et gros caracteres
  70.   movwf PORTB      ;on place les données sur le PORTB
  71.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  72.   call valid_EN     ;on valide le LCD
  73.   movlw .1       ;on charge le temps d'attente dans w
  74.   call delay_100us     ;on attent 100µs
  75.   movlw 0x08      ;commande Display off, éteint le LCD
  76.   movwf PORTB      ;on place les données sur le PORTB
  77.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  78.   call valid_EN     ;on valide le LCD
  79.   movlw .1       ;on charge le temps d'attente dans w
  80.   call delay_100us     ;on attent 100µs
  81.   movlw 0x01      ;commande Display clear, éfface le LCD
  82.   movwf PORTB      ;on place les données sur le PORTB
  83.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  84.   call valid_EN     ;on valide le LCD
  85.   movlw .1       ;on charge le temps d'attente dans w
  86.   call delay_100us     ;on attent 100µs
  87.           return
  88. ;===========================================================
  89. ; temporisation d'environ tempo1*100us
  90. delay_100us bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  91.   movwf tempo1
  92. tim   movlw .31
  93.   movwf tempo2
  94. tim1  decfsz tempo2
  95.   goto tim1
  96.   decfsz tempo1
  97.   goto tim
  98.   return
  99. ;===========================================================
  100. ;validation du LCD
  101. valid_EN bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  102.   bcf  LCD_EN      ;on force à 0 le EN mais normalement il doit y etre
  103.   nop
  104.   bsf  LCD_EN      ;impusion niveau haut
  105.   movlw .2
  106.   call delay_100us
  107.   bcf  LCD_EN      ;op le front descendant pour la validation du LCD
  108.   movlw .1
  109.   call delay_100us
  110.   RETURN
  111. ;envoi un caractere
  112. test  movlw 0x33
  113.   movwf PORTB
  114.   bsf  LCD_RS
  115.   call valid_EN
  116. bouc   goto bouc
  117.   END


 
le pourquoi du assembleur et que le pic servira dans mon theme qui est une commande DMX 512, pour afficher 3 valeurs de cannaux, enfin la synchro pédale a fréquence assez élevée donc j'ai besoin de précision. pour l'instant je fait mes test sur un pic16f84 en 4MHz mais dans mon theme j'utiliserais un pic16f628. dans cette version du programme je commande mon LCD en 8 bits mais j'irais vers une évolution 4 bits pour économiser les entrées sorties.
 
si quelqu'un peu m'aidé juste pour l'initialisation ça m'aiderais énormément.
 
je me suis servi du site de genesis pour étudier le fonctionnement du LCD. merci a lui au passage.
 
ùmerci d'avance.

mood
Google
Posté le 28-01-2005 à 23:02:09  profilanswer
 

n°4893
Deadog
Dain Bramaged
Posté le 28-01-2005 à 23:18:21  profilanswer
 

tu l'initialise mal ;)
 
http://www.kirikoo.net/images/7Lexa2-20050128-231636.png
 
on voit qu'il faut passer 3 fois 0x30, dont la première fois avec un temps de 4.1ms de validation ;)
 
ensuite, si tu fais un display off, oublie pas de refaire un display on après ;)


Message édité par Deadog le 28-01-2005 à 23:19:29
n°4894
gashineshv​a
Posté le 28-01-2005 à 23:19:39  profilanswer
 

a oui il me manque le "entry mode set" c bien ça que tu veu dire?

n°4895
Deadog
Dain Bramaged
Posté le 28-01-2005 à 23:20:14  profilanswer
 

gashineshva a écrit :

a oui il me manque le "entry mode set" c bien ça que tu veu dire?


 
 
non, regarde mon edit ;)
 
 
edit  oups pardon, en fait tu le fais bien
 :D
 
mais le display on tient tjrs ;)


Message édité par Deadog le 28-01-2005 à 23:21:08
n°4896
Deadog
Dain Bramaged
Posté le 28-01-2005 à 23:21:53  profilanswer
 

finalement nan, tu le fais pas bien, il manque la 3ème fois ;)

n°4897
gashineshv​a
Posté le 28-01-2005 à 23:22:15  profilanswer
 

et puis aussi c sur la ligne 1 que g des carré et rein sur la 2, j'avais mis mon lcd danas le mauvais sens...

n°4898
gashineshv​a
Posté le 28-01-2005 à 23:30:21  profilanswer
 

tu peu me dire clairement stp??? lol

n°4899
Deadog
Dain Bramaged
Posté le 28-01-2005 à 23:36:14  profilanswer
 

bah en somme, rajoute un 3ème 0x30 avant ton 0x3C et met direct en display on ;)

n°4900
gashineshv​a
Posté le 28-01-2005 à 23:43:39  profilanswer
 

ok merci, je vais tester, mais si je le fais je devrais avoir mon caractere??

n°4901
Deadog
Dain Bramaged
Posté le 28-01-2005 à 23:48:20  profilanswer
 

c'est pas dit [:spamafote]
 
si tu as possibilité, vérifie aussi que tes temporisations sont bonnes avec un oscilo ;)


Message édité par Deadog le 28-01-2005 à 23:48:35
n°4902
gashineshv​a
Posté le 28-01-2005 à 23:52:51  profilanswer
 

bas par contre j'ai pas d'oscillo, mon prof m'en a pas prété, lol, il est déja simpas il m'as prété de quoi programmer!

n°4903
gashineshv​a
Posté le 29-01-2005 à 11:46:56  profilanswer
 

bon j'ai testé j'ai maintenant un écran blanc, je vais donc voir pour y écrire. merci bien!

n°4904
Deadog
Dain Bramaged
Posté le 29-01-2005 à 12:03:52  profilanswer
 

pense à faire un return home aussi avant d'écrire ;)

n°4914
gashineshv​a
Posté le 30-01-2005 à 01:59:37  profilanswer
 

le clear display de le fait pas dedans??

n°4917
Deadog
Dain Bramaged
Posté le 30-01-2005 à 13:12:42  profilanswer
 

gashineshva a écrit :

le clear display de le fait pas dedans??


 
 
j'me souviens plus, moi j'fais les 2 :D

n°4918
gashineshv​a
Posté le 30-01-2005 à 13:55:52  profilanswer
 

ok je testetout ça!

n°4919
gashineshv​a
Posté le 30-01-2005 à 14:37:53  profilanswer
 

bon voila mon LCD maintenant s'éteint mais rien a l'écran,il n'affiche rien, meme pas le cirseur ni le caractere que je demande dans la fonction test...
 
si vous pouviez m'aider!!
 
 
 

Code :
  1. ;===========================================================
  2. ; programme de test de LCD 2*16 Caractères en mode 8 Bits
  3. ; par LONGUET Gilles
  4. ; pour le thème de BAC STI Génie éléctronique session 2005
  5. ;===========================================================
  6.   List p=16f84     ; directive du choix du composant
  7.   #include "p16f84.inc"  ; déclaration du fichier des symboles
  8.   __config 0x3ff2    ; configuration PIC16F84
  9.          ; (type d’oscillateur entre autre)
  10. ;===========================================================
  11. ; definition des différents bits
  12.   #define  LCD_RS PORTA,0
  13.   #define  LCD_EN PORTA,1
  14. ;===========================================================
  15. ; définition vaariable
  16. tempo1  EQU  0x0C
  17. tempo2  EQU  0x0D
  18. ;===========================================================
  19. ;===========================================================
  20. ; Programme principal
  21. ;===========================================================
  22.   call inipic
  23.   call iniLCD
  24.   call test
  25. ;===========================================================
  26. ; fin du programme principal
  27. ;===========================================================
  28. ;===========================================================
  29. ;===========================================================
  30. ; Sous fonctions
  31. ;===========================================================
  32. ; initialisation du pic
  33. inipic
  34.   bsf  STATUS,RP0      ; sélectionner banque 1 en mettant a 1
  35.            ; le bit RP0 du registre STATUS
  36.   movlw  0x00       ; mettre 00 (0000 0000) dans le registre w
  37.   movwf  TRISB       ; transfert de w dans TRISB pour mettre
  38.            ; tt les bits du port B en sortie
  39.   movlw  0x00       ; mettre 00 (0000 0000) dans le registre w
  40.   movwf  TRISA       ; transfert de w dans TRISA pour mettre
  41.            ; tt les bits du port A en sortie
  42.   movlw  0x00       ; mettre 00 dans w
  43.   movwf  OPTION_REG      ; initialiser registre option
  44.   bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  45.            ; le bit RP0 du registre STATUS
  46.   ;initialisation des variables du timer
  47.   movlw 0x00
  48.   movwf tempo1
  49.   movlw 0x00
  50.   movwf tempo2
  51.   return
  52. ;===========================================================
  53. ;initialisation du LCD
  54. iniLCD  bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  55.   movlw .200      ;charge le temps d'attente dans w
  56.   call delay_100us     ;on attent 20ms
  57.   movlw 0x30      ;commande set LCD en mode 8 bits
  58.   movwf PORTB      ;on place les données sur le PORTB
  59.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  60.   call valid_EN     ;on valide le LCD
  61.   movlw .41       ;on charge le temps d'attente dans w
  62.   call delay_100us     ;on attent 5ms
  63.   movlw 0x30      ;commande set LCD en mode 8 bits
  64.   movwf PORTB      ;on place les données sur le PORTB
  65.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  66.   call valid_EN     ;on valide le LCD
  67.   movlw .1       ;on charge le temps d'attente dans w
  68.   call delay_100us     ;on attent 100µs
  69. ;   movlw 0x30      ;commande set LCD en mode 8 bits
  70. ;   movwf PORTB      ;on place les données sur le PORTB
  71. ;   bcf  LCD_RS      ; commande donc LCD_RS = 0
  72. ;   call valid_EN     ;on valide le LCD
  73.   movlw 0x3C      ;commande set LCD en mode 8 bits,2 lignes et gros caracteres
  74.   movwf PORTB      ;on place les données sur le PORTB
  75.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  76.   call valid_EN     ;on valide le LCD
  77.   movlw .1       ;on charge le temps d'attente dans w
  78.   call delay_100us     ;on attent 100µs
  79.   movlw 0x0B      ;commande Display on, allume le LCD
  80.   movwf PORTB      ;on place les données sur le PORTB
  81.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  82.   call valid_EN     ;on valide le LCD
  83.   movlw 0x01      ;commande Display clear, éfface le LCD
  84.   movwf PORTB      ;on place les données sur le PORTB
  85.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  86.   call valid_EN     ;on valide le LCD
  87.   movlw .17       ;on charge le temps d'attente dans w car Display clear demande 1.64 ms pour s'éxécuter!
  88.   call delay_100us     ;on attent 100µs
  89.   movlw 0x02      ;commande Return home
  90.   movwf PORTB      ;on place les données sur le PORTB
  91.   bcf  LCD_RS      ; commande donc LCD_RS = 0
  92.   call valid_EN     ;on valide le LCD
  93.   movlw .17       ;on charge le temps d'attente dans w car Return Home demande 1.64 ms pour s'éxécuter!
  94.   call delay_100us     ;on attent 100µs
  95.           return
  96. ;===========================================================
  97. ; temporisation d'environ tempo1*100us
  98. delay_100us bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  99.   movwf tempo1
  100. tim   movlw .31
  101.   movwf tempo2
  102. tim1  decfsz tempo2
  103.   goto tim1
  104.   decfsz tempo1
  105.   goto tim
  106.   return
  107. ;===========================================================
  108. ;validation du LCD
  109. valid_EN bcf  STATUS,RP0      ; sélectionner banque 0 en mettant a 0
  110.   bcf  LCD_EN      ;on force à 0 le EN mais normalement il doit y etre
  111.   nop
  112.   bsf  LCD_EN      ;impusion niveau haut
  113.   movlw .2
  114.   call delay_100us
  115.   bcf  LCD_EN      ;op le front descendant pour la validation du LCD
  116.   movlw .1
  117.   call delay_100us
  118.   RETURN
  119. ;envoi un caractere
  120. test  movlw 0x33
  121.   movwf PORTB
  122.   bsf  LCD_RS
  123.   call valid_EN
  124. bouc   goto bouc
  125.   END


 
et deadog si tu as un petit exemple de code tout simple pour la commande ça m'aiderais beaucoup!
 
en tout cas un grand merci déja de m'aidé!!
 
gash

n°4920
Deadog
Dain Bramaged
Posté le 30-01-2005 à 14:58:09  profilanswer
 

bah tu peux tjrs essayé de faire un EntryModeSet et un CursorOrDisplayShift [:spamafote]
 
sinon, moi j'ai des timing de stabilisation en plus
à chaque modification d'état des pin E, RS ou R/W pour tout dire
regarde dans les datasheet, sur les timing caracteristics, y'a les temps de stabilisation Tah et Tas ;)

n°4921
gashineshv​a
Posté le 30-01-2005 à 15:54:56  profilanswer
 

euh j'ai un bug ic-prog veut plus marcher... enfin il me fait des erreurs aléatoires, a la relecture des données...
 
et j'ai meme changé de pic et j'en ai mis un neuf..
 
si vous pourriez me dire sivous aviez déja eu ça ou si vous pourriez me conseiller un petit log
merci bien!!


Message édité par gashineshva le 30-01-2005 à 15:55:32
n°4922
Deadog
Dain Bramaged
Posté le 30-01-2005 à 16:10:21  profilanswer
 

bah ça faudrait aller demander en section electronique ;)


Message édité par Deadog le 30-01-2005 à 16:12:12
n°4928
gashineshv​a
Posté le 04-02-2005 à 22:03:01  profilanswer
 

bon j'ai réussi a écrire sur mon LCD!!! je posterai plus tard dans la soirée la source, c'est une premiere version je bosse déja sur une nouvelle bien plus optoimisé, la g la base c'st un bon début!

n°4930
Deadog
Dain Bramaged
Posté le 04-02-2005 à 23:55:24  profilanswer
 

t'es obligé de faire de l'asm ? nan pke bon, voila koi, en C ça serais mieux :D

n°4932
gashineshv​a
Posté le 06-02-2005 à 14:56:28  profilanswer
 

bas disons que je doit me synchroniser avec sur un signal qui a une période de 44 µs, et le C bas c'est pas du tout précis par rapport au temps d'éxécution a cette vitesse, on a fait des test avec mon prof et donc je doit le fire en asm...

n°4933
gashineshv​a
Posté le 06-02-2005 à 14:59:09  profilanswer
 

bon voila mon début de code :
 

Code :
  1. ;===========================================================
  2. ; programme de test de LCD 2*16 Caractères en mode 8 Bits
  3. ; par LONGUET Gilles
  4. ; pour le thème de BAC STI Génie éléctronique session 2005
  5. ;===========================================================
  6.   List p=16f84     ; directive du choix du composant
  7.   #include "p16f84.inc"  ; déclaration du fichier des symboles
  8.   __config 0x3ff2    ; configuration PIC16F84
  9.          ; (type d’oscillateur entre autre)
  10. ;===========================================================
  11. ; definition des différents bits
  12.   #define  LCD_RS PORTA,0
  13.   #define  LCD_EN PORTA,1
  14. ;===========================================================
  15. ; définition vaariable
  16. tempo1  EQU  0x0C
  17. tempo2  EQU  0x0D
  18. ;===========================================================
  19. ;===========================================================
  20. ; Programme principal
  21. ;===========================================================
  22.   call inipic  ;intialisation du Pic
  23.   call iniLCD  ;intialisation du LCD
  24.   movlw 0x2D
  25.   call LCD_Char
  26.   movlw 0x4C
  27.   call LCD_Char
  28.   movlw 0x4F
  29.   call LCD_Char
  30.   movlw 0x4E
  31.   call LCD_Char
  32.   movlw 0x47
  33.   call LCD_Char
  34.   movlw 0x55
  35.   call LCD_Char
  36.   movlw 0x45
  37.   call LCD_Char
  38.   movlw 0x54
  39.   call LCD_Char
  40.   movlw 0x20
  41.   call LCD_Char
  42.   movlw 0x47
  43.   call LCD_Char
  44.   movlw 0x69
  45.   call LCD_Char
  46.   movlw 0x6C
  47.   call LCD_Char
  48.   movlw 0x6C
  49.   call LCD_Char
  50.   movlw 0x65
  51.   call LCD_Char
  52.   movlw 0x73
  53.   call LCD_Char
  54.   movlw 0x2D
  55.   call LCD_Char
  56. ;===========================================================
  57. ; fin du programme principal
  58. ;===========================================================
  59. ;===========================================================
  60. ;===========================================================
  61. ; Sous fonctions
  62. ;===========================================================
  63. ; initialisation du pic
  64. inipic
  65.   bsf  STATUS,RP0     ; sélectionner banque 1 en mettant a 1
  66.           ; le bit RP0 du registre STATUS
  67.   movlw  0x00      ; mettre 00 (0000 0000) dans le registre w
  68.   movwf  TRISB      ; transfert de w dans TRISB pour mettre
  69.           ; tt les bits du port B en sortie
  70.   movlw  0x00      ; mettre 00 (0000 0000) dans le registre w
  71.   movwf  TRISA      ; transfert de w dans TRISA pour mettre
  72.           ; tt les bits du port A en sortie
  73.   movlw  0x00      ; mettre 00 dans w
  74.   movwf  OPTION_REG     ; initialiser registre option
  75.   bcf  STATUS,RP0     ; sélectionner banque 0 en mettant a 0
  76.           ; le bit RP0 du registre STATUS
  77.   ;initialisation des variables du timer
  78.   movlw 0x00
  79.   movwf tempo1
  80.   movlw 0x00
  81.   movwf tempo2
  82.   return
  83. ;===========================================================
  84. ;initialisation du LCD
  85. iniLCD  bcf  STATUS,RP0     ; sélectionner banque 0 en mettant a 0
  86.   movlw .15      ;charge le temps d'attente dans w
  87.   call delay_100us    ;on attent 20ms
  88.   movlw 0x30     ;commande set LCD en mode 8 bits
  89.   call LCD_CMD
  90.   movlw .41      ;on charge le temps d'attente dans w
  91.   call delay_100us    ;on attent 5ms
  92.   movlw 0x30     ;commande set LCD en mode 8 bits
  93.   call LCD_CMD
  94.   movlw .1      ;on charge le temps d'attente dans w
  95.   call delay_100us    ;on attent 100µs
  96.   movlw 0x30     ;commande set LCD en mode 8 bits
  97.   call LCD_CMD
  98.   movlw 0x38     ;commande set LCD en mode 8 bits,
  99.           ;2 lignes et gros caracteres
  100.   movwf PORTB     ;on place les données sur le PORTB
  101.   call LCD_CMD
  102.   movlw .1      ;on charge le temps d'attente dans w
  103.   call delay_100us    ;on attent 100µs
  104.   movlw 0x08     ;commande Display on, allume le LCD
  105.   call LCD_CMD
  106.   movlw 0x01     ;commande Display clear, éfface le LCD
  107.   call LCD_CMD
  108.   movlw .17      ;on charge le temps d'attente dans w
  109.           ;car Display clear demande 1.64 ms pour s'éxécuter!
  110.   call delay_100us    ;on attent 100µs
  111.   movlw 0x02     ;commande Return home
  112.   call LCD_CMD
  113.   movlw .17      ;on charge le temps d'attente dans w
  114.           ;car Return Home demande 1.64 ms pour s'éxécuter!
  115.   call delay_100us    ;on attent 100µs
  116.   movlw 0x06     ;commande Display on, allume le LCD
  117.   call LCD_CMD
  118.   movlw 0x0C     ;commande Display on, allume le LCD
  119.   call LCD_CMD
  120.           return
  121. ;===========================================================
  122. ; temporisation d'environ tempo1*100us
  123. delay_100us bcf  STATUS,RP0     ; sélectionner banque 0 en mettant a 0
  124.   movwf tempo1
  125. tim   movlw .31
  126.   movwf tempo2
  127. tim1  decfsz tempo2
  128.   goto tim1
  129.   decfsz tempo1
  130.   goto tim
  131.   return
  132. ;===========================================================
  133. ;validation du LCD
  134. valid_EN movlw .1
  135.   call delay_100us    ;on fait une tite tempo après la modif de RS
  136.           ;(avant d'avoir appelé la fonction VALID_EN
  137.   bcf  LCD_EN     ;on force à 0 le EN mais normalement il doit y etre
  138.   nop
  139.   bsf  LCD_EN     ;impusion niveau haut
  140.   movlw .1
  141.   call delay_100us
  142.   bcf  LCD_EN     ;op le front descendant pour la validation du LCD
  143.   movlw .1
  144.   call delay_100us
  145.   RETURN
  146. ;envoi d'une instuction
  147. LCD_CMD  movwf PORTB
  148.   bcf  LCD_RS
  149.   call valid_EN
  150.   return
  151. ;envoi d'un caractere
  152. LCD_Char movwf PORTB
  153.   bsf  LCD_RS
  154.   call valid_EN
  155.   return
  156.   END


 
comme je l'est dit ce n'est qu'un début mais ça suffit pour écrire sur un LCD.

n°4939
Dr Lous
I see old password
Posté le 08-02-2005 à 07:17:08  profilanswer
 

gashineshva a écrit :

euh j'ai un bug ic-prog veut plus marcher... enfin il me fait des erreurs aléatoires, a la relecture des données...
 
et j'ai meme changé de pic et j'en ai mis un neuf..
 
si vous pourriez me dire sivous aviez déja eu ça ou si vous pourriez me conseiller un petit log
merci bien!!


surement tes tension en prog ki sont pas folichonne :)

n°5033
gashineshv​a
Posté le 23-02-2005 à 11:53:21  profilanswer
 

Dr Lous a écrit :

surement tes tension en prog ki sont pas folichonne :)


 
bas je sais pas tro c'est mon prof d'éléctronique qui a réalisé ce programateur et je n'ai fait que l'emprunter! et en plus bas sur mon 2eme pc ça marche pmais on a remarquer que quand il y a une charge sur les sortie(c'est un systeme in situ) bas c'est souvent la que ça merde. alors je retire le LCD pour programmer... et aussi ça dépend de l'ordinatur(vas savoir pourquoi) car sur mon p3 500 ça a du mal, sur mon xp1700+ ça marche au lycée ce sont des xp2400+ et suivant le post ça marche ou pas...c'est assez aléatoire...
 
bon je me remet a mon ode après quelque temps d'absence
 
je voudrais demander aussi, vu que je travail a une vitesse assez élevée (250 khz) est ce que si je prend un pic fonctionnant sous 20 MHz, alors la je pourrais coder en C sans que les période de sortie soit aléatoire??
 
merci d'avance.

n°5229
Ekinoks
Posté le 17-03-2005 à 21:28:50  profilanswer
 

Salut !
A quoi sa sere d'utilisé 3 foi la meme instruction avec des temps d'intervale different a chaque foi ? je fait alusion au 0x30 ?
Merci

n°5231
Deadog
Dain Bramaged
Posté le 18-03-2005 à 16:01:43  profilanswer
 

Ekinoks a écrit :

Salut !
A quoi sa sere d'utilisé 3 foi la meme instruction avec des temps d'intervale different a chaque foi ? je fait alusion au 0x30 ?
Merci


 
 
c'est l'initialisatoin du LCD qui se fait comme ça, on n'y peut rien [:spamafote]


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°5238
Ekinoks
Posté le 18-03-2005 à 19:32:45  profilanswer
 

erf, ok... saloperie de LCD :^p
Merci pour l'info ;)

n°5316
Ekinoks
Posté le 29-03-2005 à 20:14:07  profilanswer
 

Salut !
He... encore une petite question...
Pour l'initialisation, il faut commancer par métre 3 fois la meme valeur dans rs rw db7 db6 db5 et db4 avec des tempo entre de 4.1ms puis 100µs.
Es qu'il est possible de métre une seul foi la bonne valeur sur rs rw db7 db6 db5 db4 puis attendre 4.2ms ? ou faut il a chaque foi les remétre a 0 ?
 
Merci

n°5317
Deadog
Dain Bramaged
Posté le 29-03-2005 à 20:39:02  profilanswer
 

tu peux laisser les données sur le port, mais n'espère pas quand les laissant plus longtemps ça seras le même effet :D
tu devras faire des coup de E_SET/E_RAZ avec les timing donnée ;)


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°5322
Cyric
Posté le 31-03-2005 à 15:12:55  profilanswer
 

Salut,
G un afficheur 'Theale Components' TH20203
Les docs qu'ils fournissent sont archi-fausses donc du coup j'ai cherché la doc du controller LCD : le KS0066U
En ce qui concerne l'init, le constructeur Theale preconisait d'effectuait 3fois la meme valeur sur RS/RW/DB7 etc alors que la doc du controller ne le fait qu'une seule mais avec une tempo de 30ms (valeur min)
J'ai essayé, ca marche ss prob dans mon cas.
 
Par contre je suis etonné de voir que vos programme ne verifient pas le Busy Flag pour attendre la disponibilité de la prochaine instruction... meme si apparement une tempo suffit dans vos programmes.
 
Perso G une pitite kestion :
je n'arrive pas à ecrire un caractére à un endroit voulu sur mon LCD. Jessaye d'adresser la DDRAM et le ADRESS COUNTER mais pas moyen :(
il ny a que si je fais un ClearDisplay, qu'il va me coller les caractére en ho à goche
 
Donc si quelqun à quelques lignes de codes à me proposer pour ecrire à un endroit voulu sur le LCD, merci :)
 
 
 

n°5326
Deadog
Dain Bramaged
Posté le 31-03-2005 à 20:25:00  profilanswer
 

bah euh, c'est pas faux ça sur le busy flag :D
je vais étudiait si dans mon cas ça réduit pas les perfs quand même ;)
 
pour l'init, pê ke le KS0066U ne fonctionne pas comme le HD44780U sur ce point la [:spamafote]
 

Code :
  1. THD_bool
  2. AN_HD44780_SetPos (
  3.   str_AN_HD44780_com2 *com2,
  4.   thd_pos_t pos)
  5. {
  6.   if(com2 == NULL || !pos.y || pos.y > com2->size.y || !pos.x || pos.x > com2->size.x) {
  7.     #ifdef SHOW_ERROR
  8.     THD_SetError ("AN_HD44780_SetPos : wrong parameter\n" );
  9.     #endif // SHOW_ERROR
  10.     return THD_FALSE;
  11.   }
  12.  
  13.   AN_HD44780_SetCursorPos (com2, THD_pos (pos.x - 1, pos.y - 1));
  14.  
  15.   #ifdef SHOW_VERBOSE
  16.   if(VERBOSE_FILE != NULL) {
  17.     fprintf(VERBOSE_FILE, VERBOSE_ID"AN_HD44780_SetPos : (%d, %d)\n", pos.x, pos.y);
  18.     fflush(VERBOSE_FILE);
  19.   }
  20.   #endif // SHOW_VERBOSE
  21.   return THD_TRUE;
  22. }
  23. /* char_map initialise comme ça :
  24. // Création du mappage
  25.   if(SIZE.y == 1) for(i=0 ; i < 80 ; com2->lcd_map1[i]=i, i++);
  26.   else if(SIZE.y == 2) for(i=0 ; i < 40 ; com2->lcd_map2[0][i]=i, com2->lcd_map2[1][i]=(i + 64), i++);
  27.   else if(SIZE.y == 4) for(i=0 ; i < 20 ; com2->lcd_map4[0][i]=i, com2->lcd_map4[1][i]=(i + 64), com2->lcd_map4[2][i]=(i + 20), com2->lcd_map4[3][i]=(i + 84), i++);
  28. */
  29. Uint8
  30. AN_HD44780_SetCursorPos (
  31.   str_AN_HD44780_com2 *com2,
  32.   thd_pos_t pos)
  33. {
  34.   Uint8 addr=0;
  35.  
  36.   if(com2 == NULL || !INIT || pos.y >= SIZE.y || pos.x >= SIZE.x) {
  37.     #ifdef SHOW_ERROR
  38.     THD_SetError ("AN_HD44780_SetCursorPos : wrong parameter or com2 not initialized\n" );
  39.     #endif // SHOW_ERROR
  40.     ERRORCODE;
  41.   }
  42.  
  43.   switch (SIZE.y) {
  44.    case 1:
  45.     addr = com2->lcd_map1[pos.x];
  46.    break;
  47.    case 2:
  48.     addr = com2->lcd_map2[pos.y][pos.x];
  49.    break;
  50.    case 4:
  51.     addr = com2->lcd_map4[pos.y][pos.x];
  52.    break;
  53.   }
  54.  
  55.   com2->last_pos.x = pos.x + 1;
  56.   com2->last_pos.y = pos.y + 1;
  57.  
  58.   #ifdef SHOW_VERBOSE
  59.   if(VERBOSE_FILE != NULL) {
  60.     fprintf(VERBOSE_FILE, VERBOSE_ID"AN_HD44780_SetCursorPos : (%d, %d)\n", pos.x, pos.y);
  61.     fflush(VERBOSE_FILE);
  62.   }
  63.   #endif // SHOW_VERBOSE
  64.  
  65.   AN_HD44780_SetDdramAddr (com2, addr);
  66.  
  67.   return addr;
  68. }
  69. Uint16
  70. AN_HD44780_SetDdramAddr (
  71.   str_AN_HD44780_com2 *com2,
  72.   Uint8 add)
  73. {
  74.   Uint8 base=0x80;
  75.  
  76.   if(com2 == NULL || !INIT) {
  77.     #ifdef SHOW_ERROR
  78.     THD_SetError ("AN_HD44780_SetDdramAddr : com2 not initialized\n" );
  79.     #endif // SHOW_ERROR
  80.     ERRORCODE;
  81.   }
  82.  
  83.   add &= 0x7F; // On masque le dernier bit
  84.   base += add;
  85.  
  86.   #ifdef SHOW_VERBOSE
  87.   if(VERBOSE_FILE != NULL) {
  88.     fprintf(VERBOSE_FILE, VERBOSE_ID"AN_HD44780_SetDdramAddr : add=%d\n", add);
  89.     fflush(VERBOSE_FILE);
  90.   }
  91.   #endif // SHOW_VERBOSE
  92.  
  93.   return check_mode_cmd (com2, base, TEMPO_CMD);
  94. }
  95. static Uint16
  96. check_mode_cmd (
  97.   str_AN_HD44780_com2 *com2,
  98.   Uint8 cmd,
  99.   Uint32 wait)
  100. {
  101.   Uint8 up, down;
  102.  
  103.   if(com2 == NULL || !INIT || !wait) {
  104.     #ifdef SHOW_ERROR
  105.     THD_SetError ("AN_HD44780 -> check_mode_cmd (static) : wrong parameter or com2 not initialized\n" );
  106.     #endif // SHOW_ERROR
  107.     ERRORCODE;
  108.   }
  109.  
  110.   switch (MODE) {
  111.    case 4:
  112.     up = replace_bit (cmd, MASK, FILL);
  113.     down = replace_bit ((cmd << 4), MASK, FILL);
  114.     up = AN_HD44780_SendCmd (COM1, up, wait); // 1er salve
  115.     down = AN_HD44780_SendCmd (COM1, down, wait); // 2ème salve
  116.     return ((up << 8) + down);
  117.    break;
  118.    case 8:
  119.     return AN_HD44780_SendCmd (COM1, cmd, wait);
  120.    break;
  121.   }
  122.  
  123.   return 0;
  124. }
  125. Uint8
  126. AN_HD44780_SendCmd (
  127.   str_AN_HD44780_com1 *com1,
  128.   Uint8 command,
  129.   Uint32 wait)
  130. {
  131.   int sum;
  132.  
  133.   if(com1 == NULL || !INIT || &command == NULL || !wait) {
  134.     #ifdef SHOW_ERROR
  135.     THD_SetError ("AN_HD44780_SendCmd : wrong parameter or com1 not initialized\n" );
  136.     #endif // SHOW_ERROR
  137.     ERRORCODE;
  138.   }
  139.  
  140.   sum = com1->ta * 2;
  141.   if(sum >= wait) {
  142.     #ifdef SHOW_ERROR
  143.     THD_SetError ("AN_HD44780_SendCmd : wrong parameter\n" );
  144.     #endif // SHOW_ERROR
  145.     ERRORCODE;
  146.   }
  147.  
  148.   wait -= sum; // Temporisation uniquement pour le Enable
  149.   outb(command, DATA); // On place la commande sur le port
  150.   set_control (com1, PIN_STATE_FIX, PIN_STATE_L, PIN_STATE_FIX);
  151.   //RS_RAZ // On envoie une commande -> RS=0
  152.   THD_Timing (com1->ta); // Stabilisation Tas
  153.   //E_SET // On dit au controlleur de venir chercher les données
  154.   set_control (com1, PIN_STATE_H, PIN_STATE_FIX, PIN_STATE_FIX);
  155.   THD_Timing (wait); // Stabilisation Tp
  156.   //E_RAZ // On retire le jeton
  157.   set_control (com1, PIN_STATE_L, PIN_STATE_FIX, PIN_STATE_FIX);
  158.   THD_Timing (com1->ta); // Stabilisation Tah
  159.  
  160.   #ifdef SHOW_VERBOSE
  161.   if(VERBOSE_FILE != NULL) {
  162.     fprintf(VERBOSE_FILE, VERBOSE_ID"AN_HD44780_SendCmd : %d\n", command);
  163.     fflush(VERBOSE_FILE);
  164.   }
  165.   #endif // SHOW_VERBOSE
  166.  
  167.   return command;
  168. }


 
;)


Message édité par Deadog le 01-04-2005 à 04:05:35

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°5334
Deadog
Dain Bramaged
Posté le 01-04-2005 à 04:05:07  profilanswer
 

et pour le busy flag, peu de personne le check pke cela demande d'accéder à RW, or la pin RW est rarement cablé sur les lcd ;)


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

mood
Google
Posté le 01-04-2005 à 04:05:07  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  [PIC][ASM]control d'un LCD

 

Hit Parade