FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  Encore une fois la programmation uc pour lcd

 




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

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Encore une fois la programmation uc pour lcd

n°7035
benosoft
Posté le 23-09-2006 à 12:16:25  profilanswer
 

Salut,  
 
J'essay de commander un LCD 16*2 controlleur HD44780 avec une pic du serie 16f (16f627 pour le moment).
J'ai deja reperé le probleme avec l'initialisation dans un autre Sujet (trois fois le 0x03 avec differents temps d'attente),
si je comprend bien le datasheet du HD44780, si possible il fait l'initialisation lui-meme, alors j'ai qu'a attendre qu'il ai fini.
 
Voila ce que j'ai pour le moment, l' LCD ne display rien avec cette code:  
 
ORG        00h
MOVLW   b'00000111'
MOVWF   CMCON
BSF        STATUS,5
CLRF       0Bh
MOVLW   B'11010111'
MOVWF   81h
MOVLW   b'00000000'           ; - - - - - E RS  R/W
MOVWF   85h
MOVLW   b'00000000'           ; DB1 DB2 DB3 DB4 DB5 DB6 DB7 DB8
MOVWF   86h
BCF     STATUS,5
 
Goto Main
 
Delay_10ms  MOVLW   13h       ; actual delay of 10042 us
            MOVWF   20h
    del_a   MOVLW   00FFh
            MOVWF   21h
    del_b   DECFSZ  21h
              goto del_b
            DECFSZ  20h
              goto del_a
                return
 
rtoption  MOVLW b'00000000' ; clear RS
             MOVWF PORTA
            return      
 
write   MOVLW b'00000010'   ; make RS high
          MOVWF PORTA
          return
             
put     BSF PORTA,2         ;make E high for 10ms
        CALL Delay_10ms
        BCF PORTA,2
          return
 
             
Main  CALL Delay_10ms
      CALL Delay_10ms
      CALL Delay_10ms
      CALL Delay_10ms
      CALL rtoption
      MOVLW b'00110000'     ; single line 8-bit
      MOVWF PORTB
      CALL put
      MOVLW b'00001110'     ; turn on display and cursor
      MOVWF PORTB
      CALL put
      MOVLW b'00000110'     ; entry mode: increment address and shift cursor right on write
      MOVWF PORTB
      CALL put
print CALL write            ; Start writing
      MOVLW b'01000110'     ; F
      MOVWF PORTB
      CALL put
      MOVLW b'01101001'
      MOVWF PORTB
      CALL put
      MOVLW b'01101110'
      MOVWF PORTB
      CALL put        
      MOVLW b'01100101'
      MOVWF PORTB
      CALL put
      MOVLW b'01110100'     ; 't'
      MOVWF PORTB
      CALL put
      MOVLW b'01110101'
      MOVWF PORTB
      CALL put
      MOVLW b'01101110'
      MOVWF PORTB
      CALL put      
      MOVLW b'01100101'
      MOVWF PORTB
      CALL put
      MOVLW b'01100100'
      MOVWF PORTB
      CALL put
      CALL rtoption
      MOVLW b'00000000'
      MOVWF PORTB
      CALL Delay_10ms          ;ceci est pas vraiment efficace, mais en fait pour le moment je veux juste voir si l'LCD fait quelque-chose
      goto print    
END
 
Je vois pas vraiment ce que je fais mal, meme si je ne suis pas du tout sur des temps de delay...
 
C'est plus ou moins mon premier project PIC, alors peut-etre bien que j'ai fait des fautes ridicules,
mais j'accepte toute votre aide et criticisme ;-)
 
Merci!


---------------
Je suis Franco-Hollandais, alors pardonnez-moi pour ma facon de m'exprimer ;-)
mood
Google
Posté le 23-09-2006 à 12:16:25  profilanswer
 

n°7036
benosoft
Posté le 23-09-2006 à 13:44:44  profilanswer
 

Bon, c'est drole, j'ai juste rallumé mon circuit je-ne-sais-pas-pourqoi, est ca marche! :)  
Alors j'ai changer mon texte, j'ai reprogramme est ca remarchai du premier coup!
 
Je crois alors que pour le moment, je m'en sort. Quand j'aurai une autre question,
j'espere pouvoir vous deranger a nouveau... ;)  
 
Merci et pardon! ;)


---------------
Je suis Franco-Hollandais, alors pardonnez-moi pour ma facon de m'exprimer ;-)
n°7039
Deadog
Dain Bramaged
Posté le 24-09-2006 à 01:07:08  profilanswer
 

j'ai constaté avec les lcd qu'il faut souvant taquiner du reset au début ;)


Message édité par Deadog le 24-09-2006 à 01:07:22
n°7064
koss
Posté le 25-10-2006 à 05:21:43  profilanswer
 

J'ai peut-être trouvé une source d'erreur sur ton truc.  Regarde le datasheet ici (question qu'on se comprenne):
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf
À la page 45 tu as une longue initialisation constituée de 4 function set suivi du reste des instructions d'initialisation.
 
Un système robuste doit effectuer cette initialisation en respectant bien les délais entre chacune des instructions (ils peuvent être plus long mais pas plus courts).  À partir d'un certain moment tu peux vérifier le busy flag donc le délais n'a plus d'importance.  Ce que ca apporte de faire cette longue initialisation c'est que l'on est plus dépendant de la source d'alimentation du circuit.
 
Une alimentation de moins bonne qualité que ce que l'on retrouve en laboratoire peut faire en sorte que le reset ne fonctionne pas très bien (ou bien c'est assez aléatoire).  C'est donc une bonne pratique de faire la longue initialisation quite à prendre quelques lignes de codes de plus.  De cette manière, on garantie généralement que le lcd s'initialisera bien peu importe sa source d'alimentation.


Message édité par koss le 25-10-2006 à 05:23:39
n°7065
benosoft
Posté le 25-10-2006 à 07:58:35  profilanswer
 

Ah, merci beaucoup pour ta remarque! L'initialisation automatique marche 'presque' toujours, mais je me demandai deja pourqoi ca marchai pas toujours.
Cette inialisation 'manuelle', je la fait simplement avant les autres initialisations est l'LCD saura ce que je fait?

n°7069
koss
Posté le 26-10-2006 à 05:28:17  profilanswer
 

En gros tu fais les 3 function set en respectant les délais, ensuite le "vrai" function set qui te met en 8 bits (si c'est bien ce que tu veux), ensuite le display on, le display clear et le entry mode set.  Tu peux ensuite envoyer tes données comme tu le ferais normalement.
 
Si tu veux j'ai un exemple mais pour une interface en 4 bits au lieu de 8 bits donc plus complexe un peu.  Mais en gros un ordinogramme pourrait être un truc du genre:

Code :
  1. Initilisation des ports du PIC
  2. Délais de 15ms
  3. Mettre 0011xxxx sur le port
  4. Délais de 4.5 ms
  5. Mettre 0011xxxx sur le port
  6. Délais 100 us
  7. Mettre 0011xxxx sur le port
  8. (à partir d'ici on peut vérifier le busy flag pour s'assurer que le lcd n'est plus occupé)
  9. Mettre 0011NFxx sur le port (function set)
  10. Vérifier si le lcd est occupé ou attendre un certain délais
  11. Mettre 00001100 sur le port (display on)
  12. Vérifier si le lcd est occupé ou attendre un certain délais
  13. Mettre 00000001 sur le port (display clear)
  14. Vérifier si le lcd est occupé ou attendre un certain délais
  15. Mettre 00000110 sur le port (entry mode set)
  16. MAIN
  17. écrire ton texte
  18. goto MAIN


(Attention j'ai peut-être fait des erreur dans les données à envoyer, bien vérifier avec la datasheet :p)
Il faut bien veiller à mettre les bonnes valeurs pour RS, RW et puis faire changer ton EN entre chaque envoi mais ca il semble que tu l'ais très bien compris.  Si tu veux je peux te trouver un exemple de code dans mes trucs.
 
Autre petite remarque, je te conseille de mettre tes sous-routines après ta boucle principale, si jamais tu gères les interruptions tu verras que le seul vecteur d'interruption du pic est à l'adresse 0x0004.  Ca n'empêchera pas le tout de fonctionner mais c'est une meilleure pratique car le début du programme ressemblera généralement à un truc du genre

Code :
  1. org 0x0000
  2. goto MAIN
  3. org  0x0004
  4. goto INTERRUPTION
  5. org 0x0005
  6. MAIN


Bref rien de très grave, juste une bonne pratique à prendre (c'est un peu le cas en C/C++ par exemple, on met les prototypes de fonctions au début mais les fonctions après le main). :)


Message édité par koss le 26-10-2006 à 05:52:46
n°7070
benosoft
Posté le 26-10-2006 à 13:49:50  profilanswer
 

Merci koss, j'utilise le mode 4 bit depuis quelque temps maintenant, sa marche tres bien, je vai essayer d'implementer la sequence d'initialisation.
Et, c'est vrai que je ne savais ou metre mes routines, mais je suis sur qu'il viendra un jour ou je voudra utiliser les interruptions, alors merci aussi pour ton conseil la-dessus!

n°7071
koss
Posté le 28-10-2006 à 05:57:25  profilanswer
 

Il n'y a pas de quoi, bonne continuation:)

mood
Google
Posté le 28-10-2006 à 05:57:25  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  Encore une fois la programmation uc pour lcd

 

Hit Parade