Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Ecran tactile ILI9341
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#1 Message par JMarc » mar. 24 oct. 2017 21:13

Bonjour a tous

Voici mon avancement sur l’écran que ma proposé Satinas et vous trouverez le lien ici https://www.banggood.com/fr/2_4-Inch-TFT-LCD-Shield-240320-Touch-Board-Display-Module-With-Touch-Pen-For-Arduino-UNO-p-1171082.html?rmmds=search

Datasheet du ILI9341 : ILI9341


Programme simple, juste l'initialisation puis affichage d'un petit rectangle

voir la présentation par notre ami Temps-x ecran TFT

la macro pour l'envoi des commandes et des données

Code : Tout sélectionner


Envoi_cmd
    bcf     LCD_RS
    clrf    LATD
    bcf     LCD_WR
    nop
    bsf     LCD_WR
    movwf   LATD
    bcf     LCD_WR
    nop
    bsf     LCD_WR
    return

Envoi_data_8
    bsf     LCD_RS
    movwf   LATD
    bcf     LCD_WR
    nop    
    bsf     LCD_WR
    clrf    LATD
    return

Envoi_data_16
    bsf     LCD_RS
    clrf    LATD
    bcf     LCD_WR
    nop
    bsf     LCD_WR  
    movwf   LATD
    bcf     LCD_WR
    nop    
    bsf     LCD_WR
    clrf    LATD
    return


l'initialisation

Code : Tout sélectionner

;****************************************************************
;
                    Debut initialisation
;*****************************************************************
    Tempo_10ms .100
    bcf     LCD_CS
    bsf     LCD_WR
    bsf     LCD_RD
    bsf     LCD_RST
    Tempo_10ms .20
    bcf     LCD_RST
    Tempo_10ms .10
    bsf     LCD_RST

    Tempo_10ms .20

    movlw   0x01        
; reset
    rcall   Envoi_cmd 

    Tempo_10ms .10

    movlw   0x3A        
; colmod
    rcall   Envoi_cmd
    movlw   0x55        
; 16 bits/pixel   65K couleurs  rgb 565 '1010101'
    rcall   Envoi_data_16

    movlw   0x11        
; sleep out
    rcall   Envoi_cmd

    movlw   0x29        
; ecran on
    rcall   Envoi_cmd

 
;************************Fin de l'initialisation********   


et le petit programme qui affiche une fenetre et fait une inversion d'affichage

Code : Tout sélectionner


    movlw   D
'216'
    movwf   c1      ; quelques variables pour les boucles
    movlw   D
'255'
    movwf   c2
    movlw   .20
    movwf   c3

    movlw   D
'255'
    movwf   c01
 
;***************************************************** rectangle 1 
    movlw   0x2A        
; set colonne adress
    rcall   Envoi_cmd
    movlw   0x1F
    rcall   Envoi_data_16
    movlw   .100
    rcall   Envoi_data_16
    movlw   0x1F
    rcall   Envoi_data_16
    movlw   .100
    rcall   Envoi_data_16      

    movlw   0x2B        
; set page
    rcall   Envoi_cmd
    movlw   0x1F
    rcall   Envoi_data_16
    movlw   .100
    rcall   Envoi_data_16
    movlw   0x1F
    rcall   Envoi_data_16
    movlw   .100
    rcall   Envoi_data_16

    movlw   0x2C        
; memory write 
    rcall   Envoi_cmd
 boucle2  
    movlw   0xF0        
; 1 pixel rouge
    rcall   Envoi_data_8
    movlw   0x00
    rcall   Envoi_data_8
    movlw   0x00        
; 1 pixel rouge
    rcall   Envoi_data_8
    movlw   0x08
    rcall   Envoi_data_8
    decfsz  c01
,f
    bra     boucle2
    decfsz  c02
,f
    bra     boucle2

    Tempo_10ms .100

altern

    movlw   0x21         
; display inversion on
    rcall   Envoi_cmd
    movlw   0x00
    Tempo_10ms .300

    movlw   0x20        
; display inversion off
    rcall   Envoi_cmd
    movlw   0x00
    rcall   Envoi_cmd

    Tempo_10ms .300
    bra     altern




si essai d'eteindre l'ecran pour tester les commandes et qu'il n'y a rien d'afficher, l'ecran reste allumé et on a l'impression que la commande ne fonctionne pas.
si un dessin est affiché, alors nous voyons bien que la commande agis :sifflotte:

Ecran tactile ILI9341
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#2 Message par satinas » mar. 24 oct. 2017 21:56

Bonsoir JMarc

Le 0x55 de sélection des couleurs 16 bits, il faut l'envoyer avec Envoi_data_8.
Si tu l'envoies avec Envoi_data_16, il va envoyer 0x00 puis 0x55, le 0x00 est en trop

Ecran tactile ILI9341
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#3 Message par JMarc » mar. 24 oct. 2017 23:28

Bonsoir Satinas

Ok j'essai demain en Envoi_data_8
Je ne comprend pas la datasett, Pour les commandes aussi j'envoie en 2 fois sinon cela ne fonctionne pas mais je ré vérifie demain soir

Pour la largeur et hauteur de colum adress et page adress, la première donnés me done la marge du rectangle et la seconde donnée la largeur (hauteur pour page) mais les deux autres données ?

Comment faire pour afficher plusieurs rectangles ? Car ils se superposes pour l'instant

Ecran tactile ILI9341
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#4 Message par satinas » mer. 25 oct. 2017 07:19

Bonjour JMarc,

Le contrôleur ILI9341 attend des commandes 8 bits. Ces commandes permettent de remplir des registres qui définissent son comportement. Selon les commandes les données envoyées sont de taille différente :
- 0 octet (display ou sleep off/on)
- 1 octet pour les réglages divers
- 2 octets pour les couleurs ou coordonnées 16 bits (octet poids fort, ensuite octet poids faible)
- 15 octets pous les corrections gamma
- ...

La commande 0x3a doit être suivie d'un octet pour déclarer qu'on travaille avec des couleurs 16 bits (0x55).

La commande 0x36 idem, elle définit entre-autres l'orientation. L'octet comporte 4 bits de réglage :
- flag inversion des x et y (mode portrait ou paysage)
- flag rotation à 180° sur les x
- flag rotation à 180° sur les y
- flag inversion du rouge et du bleu (à voir, dépend du lcd)

La commande 0x2a envoie les coordonnées en x des 2 points qui délimitent le rectangle à remplir (confusion, pas de marge ni largeur)
Les coordonnées sont sur 16 bits car 319 est supérieur à 255, et elles ont pour origine le haut/gauche de l'écran. Donc derrière cette commande on envoie 2 valeurs 16 bits. Idem avec 0x2b pour les y.
La commande 0x2c envoie aussi des valeurs 16 bits, les couleurs de tous les points du rectangle plein.

Ton sous-programme Send_Data_16 est un bon début pour envoyer une valeur 16 bits, mais comme il envoie toujours 0x00 comme octet de poids fort, on ne peut envoyer que des valeurs 16 bits de 0 à 255.
Il est suffisant pour les premiers essais avec des coordonnées de faible valeur. Il vaut mieux de toute façon ne pas dépasser 239 tant que l'on ne maîtrise pas encore l'orientation du lcd.
Tu peux aussi l'utiliser pour envoyer les couleurs 16 bits, en te limitant à des valeurs inférieures à 256.
Le format des couleurs 16 bits étant rgb565 -> B'rrrrrggggggbbbbb'
Exemple du noir 0x0000, ou du bleu 0x001f B'0000000000011111'

Ensuite il faudra revoir Send_Data_16 pour qu'il envoie du vrai 16 bits 0x0000 à 0xFFFF. J'avais utilisé une macro pour faire ça sans me replonger dans l'assembleur, mais toi, c'est différent, faut rentrer dans le moteur :)
Il faut shifter les 8 bits de poids fort, les envoyer avec Send_Data_8, puis envoyer les 8 bits de poids faible.

Dans ton code fais un Send_Data_8 derrière les commandes 0x3A et 0x36, et 2 Send_Data_16 derrière 0x2A ou 0x2B (toi, tu en fais 4)

J'espère que c'est compréhensible, je veux pas t'embrouiller ...

Bonne journée

Ecran tactile ILI9341
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#5 Message par JMarc » mer. 25 oct. 2017 08:31

Bonjour Satinas

je ne tenais plus ce matin, j'ai changé Envoi_data_16 en Envoi_data_8 et miracle la couleur est là Merci !

Tes explications sont tres claires, merci, la preuve, j'y arrive :bravo:

Code : Tout sélectionner

    movlw   0x36        ; memory access control
    rcall   Envoi_cmd
    movlw   b
'11111100'
    rcall   Envoi_data_8


Code : Tout sélectionner

    movlw   0x2A        ; set colonne adress
    rcall   Envoi_cmd
    movlw   0x00
    rcall   Envoi_data_8
    movlw   0x0F        
    rcall   Envoi_data_8
    movlw   .0
    rcall   Envoi_data_8  
    movlw   .100        
    rcall   Envoi_data_8


bien sur je vais faire tout cela avec des macros pour que le source soit plus clair

Du coup en changeant les octets de couleurs, j'arrive à écrire dans la fenêtre.

Je suppose qu'il faut faire une fenêtre par lettre

Ecran tactile ILI9341
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#6 Message par JMarc » mer. 25 oct. 2017 21:29

Et voilà :-D :-D :-D

Image




Image!


Merci !
Modifié en dernier par JMarc le mer. 25 oct. 2017 22:02, modifié 1 fois.

Ecran tactile ILI9341
Jérémy
Administrateur du site
Administrateur du site
Messages : 2065
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » mer. 25 oct. 2017 21:36

:bravo: :bravo: :bravo: :bravo: :bravo: :bravo: :bravo:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran tactile ILI9341
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#8 Message par satinas » mer. 25 oct. 2017 22:55

Ca avance, bravo.
Ton sous-programme Envoi_Cmd doit n'envoyer qu'un seul octet, tu as peut être déjà rectifié entre-temps.

Pour bien comprendre la différence entre macro et sous-programme, revoir le cours Bigonoff.
Les macros sont un truc en plus ajouté à l'assembleur, qui devient un MACRO-assembleur. Elles sont traitées avant la phase d'assemblage car ce n'est que du traitement de texte.

bye

Ecran tactile ILI9341
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#9 Message par JMarc » jeu. 26 oct. 2017 22:29

Bonsoir Satinas, temps-x,jérémY et à tous

Non je n'ai pas encore corrigé cmd mais cela fonctionne car c'est un cmd 0x00 donc nul mais je vais supprimer

Pour bigonoff, c'est sur la table de chevet :-D

Ecran tactile ILI9341
Temps-x
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 807
Enregistré en : juillet 2016
Localisation : Terre

#10 Message par Temps-x » ven. 27 oct. 2017 00:21

Bonsoir JMarc, satinas, jérémY, et tous le forum,


:+1: JMarc pour ta ténacité, et :+1: satinas pour tes conseils, ne vous inquiété pas je vous suis de loin, enfin de très loin. :sifflotte:

Actuellement j'ai mis temporairement la programmation de l'écran de coté, car je fais un PCB pour y mettre l'écran, pour divers PIC,
Je la mettrais à disposition sur le forum, une fois terminer.

Je vous souhaite une bonne continuation. ( 8-) I will come back )

A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 2 invités