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 ---
- 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 ---
Modérateur : mazertoc
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
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
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
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)
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
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)
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à Tous,
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 ...
Ce qui est dommage 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
un morceau du programme :
il est vraiment bien cet ecran ..
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 ...
Ce qui est dommage 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+i ,COLOR_YELLOW ); Delay_ms(1);
Put_Pixel(120,160+i ,COLOR_YELLOW ); Delay_ms(1);
Put_Pixel(121,160+i ,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=1 ;
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 (i >= 2 && i < 10)
{
x =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();
il est vraiment bien cet ecran ..
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)
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.
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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)
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 :
Les valeurs de P ci-dessus correspondent à l'appui, si pas d'appui P est inférieur à 10.
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)
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à tous,
Satinas
Je suis loin de retrouver tes valeurs
X 200 -> 3950
Y 200 -> 3950
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 ?
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 =u <<8;
u =u + SPI1_Read(Dummy);
u=u >> 3;
T_CS=1;
return u;
}
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)
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
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 : Aucun utilisateur enregistré et 51 invités