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

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#191 Message par satinas » sam. 10 mars 2018 18:02

Le contrôleur XPT2046 est relié aux 2 plaques tactiles X et Y, il mesure avec son ADC 12 bits les coordonnées et la pression d'appui. Il communique avec la cpu en spi jusqu'à 2 MHz en mode 0 (CKP=0 CKE=1 SMP=0). L'échange de bits se fait sur le front montant de l'horloge.
La cpu envoie une commande 8 bits de polarisation des plaques, le contrôleur retourne 2 octets contenant la valeur mesurée par l'ADC 12 bits.
octet 1 -> 0 d11 d10 d9 d8 d7 d6 d5
octet 2 -> d4 d3 d2 d1 d0 0 0 0

Pour lire la coordonnée x de l'appui, on polarise la plaque X et on mesure sur la plaque Y, et inversément pour lire y.
La pin irq du contrôleur indique par un état bas la pression sur le tactile. On peut mesurer la pression en polarisant les 2 plaques. Voila mon code C pour Paul
XPT2046.c..txt
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#192 Message par satinas » lun. 12 mars 2018 09:37

Bonjour,
pour la version ASM, ce document de Microchip présente le bus SPI. Il y a un exemple de programme pour 16F en mode spi master à la page 31.
http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#193 Message par JMarc » lun. 12 mars 2018 12:39

Bonjour

Documentation imprimée, merci pour cette nouvelle doc

J’étudie cela pour faire le pcb


Commande sur le port C Avec le SPI
Donner sur pour B et D ?

Comment fonctionne les pic en 16 bits pour les ports de données? Le pcb sera compatible ?

Merci !

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1008
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#194 Message par paulfjujo » lun. 12 mars 2018 13:34

Bonjour à Tous,


:+1: Merci à Satinas pour son support.. qui m'a facilité la tâche

Je viens de tester la partie Touch screen..
il repond bien aux commandes .
Je constate une petite zone morte au bord de l'ecran ..

programme d etest :
j'affiche 1 cercle plein à chaque coin et demande successivement de toucher chacun d'eux
et finir par la croix au centre.
J'utilise RB0 interrupt pour detecter l'appui ...
:cry: Ce qui est dommage :furieux: c'est que les fonctions SPI ne sont pas re-entrante dans l'interrupt !

peut etre avec un morceau 100% asm .. à suivre

pour n'etre dérouté du programme principal, QUE SI ON TOUCHE L'ECRAN !
pour l'instant donc, je suis en mode pooling du Flag_RB0
Les 5 points sont stockés dans un tableau ... si repetitivité assurée, sera par la suite stocke en EEPROPM du PIC
et l'operation calibration ne sera que sur demande expressive exmple : avec une pin MCU affectée à cela.

Faut-il valider une saisie X Y que sur un seuil PRESS dépassé ?
votre avis ?
Je voudrais connaitre quelles sont vos valeurs obtenues pour les 4 angles et le centre de l'ecran 240x320 en Mode 0 = Mode Portrait

Résumé Calibration
Relevé Moyenne X, Y
En Haut a Gauche X= 404 Y= 464
En Haut a Droite X= 63 Y= 468
En Bas a Droite X= 63 Y= 127
En Bas a Gauche X= 400 Y= 63
au Centre X= 248 Y= 282
Press moyen = 168




un morceau du programme :

Code : Tout sélectionner

// Touch screen datas
Word x, y , xx ,yy ;
Word z0,z1,z2,Press;
Word TK=0;
Word Calibration_TouchScreen[10];  // 5 couple de donnees  XY  pour les points de calibration
const unsigned char ICI[5][17]={ "En Haut a Gauche" ,
                            "En Haut a Droite" ,
                            "En Bas  a Droite" ,
                            "En Bas  a Gauche" ,
                            "au Centre       "};


...
etc...
   Orientation=0;
   SetOrientation(Orientation);
   UART1_Write_CText(" Efface ecran  via Rectangle noir\r\n");
   _CS=0;
   SetBackgroundColor(COLOR_BLACK);
   UART1_Write_CText(" Rectangle Plein x1=0 y1=0 x2=239 y2=319 COLOR_BLACK\r\n");
   Rectangle_Plein(0,0,239,319,COLOR_BLACK);
  
   Font_Active
=1;
   Select_Font_Type(Font_Active);

    UART1_Write_CText(" Test Touch screen :\r\n");
    strConstRamCpy(TEXTE," TEST TOUCH SCRENE XPT2046");
   _CS=0;
    DrawText(10, 100, TEXTE,COLOR_CYAN);
    Draw_CText(10,112, " Toucher dans l'ordre d'activation les cercles et la croix",COLOR_GREEN);
    Draw_CText(10,122," et relever les coordonnees ",COLOR_WHITE);
    Delay_1sec();
    Close_Font_Type(Font_Active);
    
    UART1_Write_CText
(" Cercles bleus aux 4 coins \r\n");
    FillCircle(5,5,4,COLOR_CYAN) ;
    FillCircle(235,5,4,COLOR_CYAN) ;
    FillCircle(5,315,4,COLOR_CYAN) ;
    FillCircle(235,315,4,COLOR_CYAN) ;

    UART1_Write_CText(" Croix Jaune Epaisse ,au milieu \r\n");
    for (i=-8;i<8;i++)
    {
     Put_Pixel(119,160+,COLOR_YELLOW ); Delay_ms(1);
     Put_Pixel(120,160+,COLOR_YELLOW ); Delay_ms(1);
     Put_Pixel(121,160+,COLOR_YELLOW ); Delay_ms(1);
     Put_Pixel(120+i,160, COLOR_YELLOW ); Delay_ms(1);
     Put_Pixel(120+i,161, COLOR_YELLOW ); Delay_ms(1);
     Put_Pixel(120+i,159, COLOR_YELLOW ); Delay_ms(1);
    }
    Font_Active=2;
    Select_Font_Type(Font_Active);
    
    TK
=0;
    k=0;
    do
    
{
        _CS=;
        T_CS=1;
        UART1_Write_CText(ICI[TK>>1]);  CRLF1();
        Draw_CText(40,285,"                       ",COLOR_BLACK);
        Draw_CText(40,265,"Appuyer ",COLOR_WHITE);
        Draw_CText(40,285, ICI[TK>>1],COLOR_YELLOW);
       
        _CS
=1;
        UART1_Write_CText(" Arme interupt RB0\r\n");
        Arme_Interrupt_RB0();
        while(Flag_RB0==0);
        _CS = 1;
        T_CS = 0;
        for (i=0;i<12;i++)
        {
           xx = tsGet(0xd1);    // read yp (xp=Vcc, xn=Gnd, penirq disabled)
           yy = tsGet(0x90);    // read xp (yp=Vcc, yn=Gnd, penirq enabled, power down)
           z1 = tsGet(0xb1);   // read xp (yp=Vcc, xn=Gnd, penirq disabled)
           z2 = tsGet(0xc0);   // read yn (yp=Vcc, xn=Gnd, penirq enabled, power down)
           if (>= 2 && i < 10)
           {
           x =+ xx;
           y = y+ yy;
           z0 = z0+(z2-z1);
           }
        }
        x= xx >>3;
        y= yy >>3;
        Press= 4095 -(z0>3);
        T_CS = 1;
        Press = 4095-(z2-z1);

        // RB0=0 apres appui touch screen
        //UART1_Write_CText(" RB0 input =");
        //UART1_Write(48+(PORTB & 0x01)); CRLF1();

        UART1_Write_CText("x= ");
        WordToStr(x,CRam1);
        UART1_Write_Text(CRam1);
        UART1_Write(TAB);
        UART1_Write_CText("y= ");
        WordToStr(y,CRam1);
        UART1_Write_Text(CRam1);
         UART1_Write(TAB);
        UART1_Write_CText("Press= ");
        WordToStr(Press,CRam1);
        UART1_Write_Text(CRam1);
        CRLF1();
        Draw_CText(40,190, " X=        ",COLOR_BLACK);
        Draw_CText(40,190, " X= ",COLOR_GREEN);
        WordToStr(x,CRam1);
        DrawText(100,190,CRam1,COLOR_GREEN);
        Draw_CText(40,210, " Y=        ",COLOR_BLACK);
        Draw_CText(40,210, " Y= ",COLOR_GREEN);
        WordToStr(y,CRam1);
        DrawText(100,210,CRam1,COLOR_GREEN);
        Draw_CText(40,230, " Press=        ",COLOR_BLACK);
        Draw_CText(40,230, " Press= ",COLOR_CYAN);
        WordToStr(Press,CRam1);
        DrawText(100,230,CRam1,COLOR_CYAN);
        Calibration_TouchScreen[TK]=x;
        Calibration_TouchScreen[TK+1]=y;
        TK=TK+2;
        Delay_ms(1000);
        k=k+Press;

    }while(TK<10);

    _CS=1;
    T_CS=1;
    CRLF1();
    UART1_Write_CText(" Résumé Calibration \r\n");
    UART1_Write_CText(" Relevé moyenné X, Y  \r\n");
    for (TK=0;TK<9;TK=TK+2)
    {
        UART1_Write_CText(ICI[TK>>1]);
        UART1_Write(TAB);
        UART1_Write_CText("X= ");
        WordToStr(Calibration_TouchScreen[TK],CRam1);
        UART1_Write_Text(CRam1);
        UART1_Write_CText("  Y= ");
        WordToStr(Calibration_TouchScreen[TK+1],CRam1);
        UART1_Write_Text(CRam1);
        CRLF1();
   }
     UART1_Write_CText(" Press moyen = ");
     WordToStr(Press>>2,CRam1);     // 4 series
     UART1_Write_Text(CRam1);
     CRLF1();



:+1: il est vraiment bien cet ecran ..
Touch_screen_Calib_HG.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#195 Message par satinas » lun. 12 mars 2018 13:41

bonjour Paul, super ...
C'est un 2,4" ou 2,8" ton lcd ?
Sur mon 2,8" récent, j'ai le même problème, un coin ou ça répond moins, la pression passe de 2000 si stylet (3000 si doigt) sur l'écran à 200 sur le coin foireux (la broche irq ne bronche pas). En plus quand je clique sur les bords, il envoie des coordonnées bidons. sur mes anciens 2,4", ça marchait mieux, bene que pas parfait aussi.
La pression est à peu près constante sur tout l'écran (à part le coin foireux) contrairement aux tactiles analogiques qui eux ont bien une valeur variable avec la pression d'appui et aussi variable avec la position en x,y, ce qui est normal et plus embêtant (la formule de calcul de la pression exacte se complique)
Tous les lcd régissent différemment, je pensais que le contrôleur simplifierait les choses, mais c'est pas gagné, il y a beaucoup de valeurs parasites. Pour tester je fais un paint, qui affiche tous les points appuyés.
J'ai pas mis mes fonctions de conversion coordonnées ts vers coordonnées lcd, et celle de calibrage. Pour la conversion de coordonnées, c'est juste une règle de trois., celle de calibrage n'est pas nécessaire (hors industrie), à part pour se faire plaisir :)

Pour JMarc
Oui pour les ports. Tu vas un peu gagner en vitesse mais pas des masses.
Passer à un pic 16 bits en ASM, c'est une autre histoire. L'ASM 16 bits est très costaud, j'en ai jamais fait, Claudius a pratiqué. Il y a par exemple 16 registres W :)
En C on programme aussi simplement un 16 bits qu'un 8 bits. C'est même plus simple sur 16 bits car les fonctions C traitent indifféremment les données en ram ou en flash, alors que le C 8 bits (C18) les différencient.
Je pense pas qu'il y ait des boitiers de pic 16 bits (24F) de même brochage que les boitiers de pic 8 bits.
Modifié en dernier par satinas le lun. 12 mars 2018 14:23, modifié 1 fois.

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1008
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#196 Message par paulfjujo » lun. 12 mars 2018 14:22

satinas a écrit :.
C'est un 2,4" ou 2,8" ton lcd ?



c'est celui là

100% tout neuf et de haute qualité
Type: écran tactile
taille: 2.4 " SPI Série
zone d'affichage: 36.72 (W) X48.96 (H) mm
élément conducteur: a-si TFT à matrice active
Pixel arrangement: RGB bande verticale
Driver IC: ILI9341
rétro-éclairage: LED Blanche
regarde Direction: 6 heures
Profondeur de couleur: 262 K/65 K
résolution (points): 240RGB * 320 Points
5 V compatible, utiliser avec 3.3 V
besoin d'au moins 4 IOs de votre MCU
avec PCB plaque (y compris alimentation IC, SD), compatible avec 5110 interface
le paquet contient:
1x240x320 2.4 " SPI TFT LCD Tactile Panneau Port Série Module avec PBC ILI9341 5/3. 3 V

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#197 Message par satinas » lun. 12 mars 2018 15:21

La valeur P = 4095-(z2-z1) varie beaucoup avec x,y contrairement à ce que j'ai écrit plus haut.
Par contre elle varie très peu avec la pression d'appui, elle mesure plutôt la surface d'appui, stylet ou doigt.
Valeurs retournées par le contrôleur :

Code : Tout sélectionner

  X  --------------------------
  ^ |* | |                    |
  | |* | |                    |
  | |* | |                    |
  | |* | |                    |
  | |* | |                    |
  . --------------------------
       .---------------------> Y

           2 lcd 2,4"       lcd 2,8"
X          200 -> 3950     3950 ->  400
Y          200 -> 3950     3950 ->  400
P stylet   600 -> 2600     2100 ->  500
P doigt   1900 -> 3400     3100 -> 1000

Les valeurs de P ci-dessus correspondent à l'appui, si pas d'appui P est inférieur à 10.

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
JMarc
Passioné
Passioné
Messages : 486
Enregistré en : août 2016
Localisation : Dans le Sud...

#198 Message par JMarc » lun. 12 mars 2018 20:04

Merci Satinas

Je reste donc en 8bits pour le pic

Merci !

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1008
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#199 Message par paulfjujo » mar. 13 mars 2018 11:54

Bonjour à tous,

Satinas
Je suis loin de retrouver tes valeurs
X 200 -> 3950
Y 200 -> 3950

Résumé Calibration
Relevé moyenné X, Y
En Haut a Gauche X= 464 Y= 464
En Haut a Droite X= 48 Y= 400
En Bas a Droite X= 48 Y= 48
En Bas a Gauche X= 464 Y= 48
au Centre X= 240 Y= 240
Press moyen = 319


que je sois en mode PORTRAIT au lieu de mode PAYSAGE ne doit rien changer sur la gamme de mesure
le Touch screen etant fixe.

Si je regarde le timming donné par la spec sheet du XPT2046 ou celle , semblable du ADS7243
je vois qu'il y a 2 ecritures ( si DIN est le coté Touch screen) pour recuperer les 16 bits..
le schema du timming n'est pas tres explicite ..
quid du contenu correspondant au bit 1 du 1er byte MSB
un bit de bourrage à zero , je suppose ..
puis viennent ensuite les bit 11 ..à 5
et le 2em Byte qui contient les bits 4 à 0 .. + zero de bourrage ( je suppose)

la valeur serait donc cadrée à droite pour le MSB et cadree à gauche pour le LSB.
donc pour restituer le mot de 12 bits
Mesure = MSB <<5 + LSB >> 3

et pas MSB<<8 .. ?

mon raisonnement est-il ok ?


Code : Tout sélectionner


Word tsGet
(Byte cmd)
{
  Word u;
  _CS=1;
  T_CS=0;
  SPI1_Write(cmd);
  u  = SPI1_Read(Dummy);
  u =<<8;
  u =+ SPI1_Read(Dummy);
  u=>> 3;
  T_CS=1;
  return u;
}


ADS7843_16clock_conversion.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#200 Message par satinas » mar. 13 mars 2018 12:09

Bonjour Paul,

Dans mon cas le MSB est shifté 8 fois à gauche, puis 3 fois à droite, ça fait bien 5 à l'arrivée :)
Tes shifts sont plus rapides, mais tu risques d'être obligé de caster, et les compilateurs se comportent pas forcément pareil sur des casting, qui sont de toute façon pas très esthétiques.
En plus les pic 16 et 32 bits shiftent n fois en une seul instruction machine, alors on se complaît dans le luxe :)
Peut être même que le compilateur simplifie tout ça je suis pas allé voir


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot], Google [Bot] et 3 invités