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)
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
satinas a écrit :Dans mon cas le MSB est shifté 8 fois à gauche, puis 3 fois à droite, ça fait bien 5 à l'arrivée :)
Exact, mais moins évident pour ma "comprenette" personelle.
et au sujet du delta maxi-mini de mesure x ou y, que j'obtiens,
nettement plus faible que tes resultats ?
une piste , suggestion, idée ?
en attendant, je vais faire un test avec l'analyser logique , pour visualiser l'echange de datas..
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
ouille x = xx >>3;
de l'avantage de la syntaxe C qui suit, on évite de taper 2 fois la même chose, source d'erreur
x >>= 3;
Toujours déclarer les variables le plus tard possible, si xx était déclarée dans le for, le compilateur ne laissait pas passer. Et xx est un très mauvais choix de nom de variable, là c'est ma faute :)
de l'avantage de la syntaxe C qui suit, on évite de taper 2 fois la même chose, source d'erreur
x >>= 3;
Toujours déclarer les variables le plus tard possible, si xx était déclarée dans le for, le compilateur ne laissait pas passer. Et xx est un très mauvais choix de nom de variable, là c'est ma faute :)
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
Code : Tout sélectionner
Press= 4095 -(z0>3);
T_CS = 1;
Press = 4095-(z2-z1);
Je comprends pas, ce serait pas plutôt
Press = 4095 - (z0>>3);
Et je vois pas ou tu remets à zéro x, y et z0
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
j'avais déja rectifié ..
je suis en train d'essayer de traiter les infos Touch panel DANS l'interrupt RB0
en simil ASM .. vu que les fonction SPI_Write et Read ne sont pas re entrantes .
Mais je pense même traiter independament, en mode bit bang le Touch panel
pour pouvoir separer completement les 2 traitements Touch Panel et LCD
.. actuellement commun , par le SPI MSSP MOSI et MISO . soit l'un , soit l'autre via les pin de selection
_CS et T_CS
Code : Tout sélectionner
Arme_Interrupt_RB0();
while(Flag_RB0==0);
CS = 1;
T_CS = 0;
x=0;y=0;z0=0;z1=0;z2=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; // moyenne de 8 valeurs
y= yy >>3;
Press= 4095 -(z0>3);
T_CS = 1;
je suis en train d'essayer de traiter les infos Touch panel DANS l'interrupt RB0
en simil ASM .. vu que les fonction SPI_Write et Read ne sont pas re entrantes .
Mais je pense même traiter independament, en mode bit bang le Touch panel
pour pouvoir separer completement les 2 traitements Touch Panel et LCD
.. actuellement commun , par le SPI MSSP MOSI et MISO . soit l'un , soit l'autre via les pin de selection
_CS et T_CS
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
Press = 4095 -(z0>3);
ça manque encore de rectification ...
Voila pourquoi je préfère mettre z0/8, le compilo shiftera quand même
J'ai pas de problème à mettre le tactile et l'affichage sur le même port spi, mais il faut changer la vitesse spi à la volée, car le tactile est limité à 2MHz.
Par contre la sdcard n'aime pas partager son port spi. Même si le SD_CS est high, le simple fait d'insérer une sd empêche le tactile de marcher, essais sur un ESP32 (qui n'a qu'un port spi).
Pour la réentrance je comprends pas exactement le problème. Tout dépend de l'appli et de son utilisation du tactile. Si une interruption du tactile se produit pendant qu'on envoie des datas sur le spi lcd, c'est ça ?
ça manque encore de rectification ...
Voila pourquoi je préfère mettre z0/8, le compilo shiftera quand même
J'ai pas de problème à mettre le tactile et l'affichage sur le même port spi, mais il faut changer la vitesse spi à la volée, car le tactile est limité à 2MHz.
Par contre la sdcard n'aime pas partager son port spi. Même si le SD_CS est high, le simple fait d'insérer une sd empêche le tactile de marcher, essais sur un ESP32 (qui n'a qu'un port spi).
Pour la réentrance je comprends pas exactement le problème. Tout dépend de l'appli et de son utilisation du tactile. Si une interruption du tactile se produit pendant qu'on envoie des datas sur le spi lcd, c'est ça ?
é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 :Pour la réentrance je comprends pas exactement le problème. Tout dépend de l'appli et de son utilisation du tactile.
si dans le traitement interrupt RB0 , je met une fonction mikroC SPI_Write ou SPI_Read
le compilo n'est pas content .. error !
//84 365 Reentrancy is not allowed: function 'SPI1_Write' called from two threads __Lib_SPI_c345b123.c
Si une interruption du tactile se produit pendant qu'on envoie des datas sur le spi lcd, c'est ça ?
Des l'apparition du flag_rb0 à 1 ,
je mets l'aiguillage sur T_CS=0 _CS=1 . etapres recup des coordonnées. le remet sur LCD T_CS=1 _CS=0
à priori on est bien obligé de gerer l'aiguillage du SPI vers l'un OU l'autre ?
ce qui oblige à prevoir , au niveau de l'application , une surveillance de l'interruption (Stylet) en mode pooling..
on ne fait donc rien d'autre en attendant l'appui du stylet ..
si on peut lire la position du stylet DANS l' interrupt , on n'est plus bloqué dans une boucle d'attente
et gerer cette info position stylet ailleurs dans le programme . L'ideal etant de separer les 2 fonctions SPI..
j'ai 2 SPI sur mon PIC .. séparation à tenter.
avec FOSC=32MHz clock FOSC/4 pour le SPI1_Init classique => 8MHZ
semble pourtant suivre cette cadence ..
mais je vais tester aussi avec le SPI1_Init_Advanced pour clock= FOSC/16 => 2MHz
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
Pour MikroC, si tu mets le SPI_Read() et Spi_Write() dans une fonction appelée par la routine d'interruption, ça passe pas ?
Les 2 MHz viennent du Tack qui doit être > 1,5us. Comme il dure 3 périodes d'horloge, ça donne une période d'horloge spi minimale de 0,5us.
Sur Arduino et ESP32 je maîtrise pas bien le bas niveau. Actuellement le tactile est en mode polling.
On peut inhiber l'interruption tactile pour éviter qu'elle se produise pendant des affichages spi.
Ou alors (En C18) on laisse faire, et on peut imaginer 2 fonctions spi différentes. Une classique utilisée par l'affichage qui ne fait que de l'envoi, l'autre un peu spéciale utilisée par l'interruption tactile. Si la routine d'interruption détecte un envoi spi en cours, elle le termine en testant les flags et en lisant SPIBUF. Ensuite elle passe à 2 MHz, lit les datas tactiles, les stocke ou les traite, remet le spi à plein pot et se termine. Au pire il y a 2 lectures successives de SPIBUF, mais cela devrait passer.
Les 2 MHz viennent du Tack qui doit être > 1,5us. Comme il dure 3 périodes d'horloge, ça donne une période d'horloge spi minimale de 0,5us.
Sur Arduino et ESP32 je maîtrise pas bien le bas niveau. Actuellement le tactile est en mode polling.
On peut inhiber l'interruption tactile pour éviter qu'elle se produise pendant des affichages spi.
Ou alors (En C18) on laisse faire, et on peut imaginer 2 fonctions spi différentes. Une classique utilisée par l'affichage qui ne fait que de l'envoi, l'autre un peu spéciale utilisée par l'interruption tactile. Si la routine d'interruption détecte un envoi spi en cours, elle le termine en testant les flags et en lisant SPIBUF. Ensuite elle passe à 2 MHz, lit les datas tactiles, les stocke ou les traite, remet le spi à plein pot et se termine. Au pire il y a 2 lectures successives de SPIBUF, mais cela devrait passer.
é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 :Pour MikroC, si tu mets le SPI_Read() et Spi_Write() dans une fonction appelée par la routine d'interruption, ça passe pas ?
oui, c'est bien là, le blème ..
de meme qu'on ne peut pas mettre un UART_WRITE dans une interrupt , pour faire du tracage programme
Dans une autre application, j'ai été obligé de mettre un UART3_Write_Text 100% assembler , à la place de la fonction MikroC.
à la rigueur, seul le TX1REG peut etre utilisé, puisque c'est un registre MCU.
écran tactile 2.4 TFT LCD 240 x 320 (version ASM)
Bonjour,
tiré du programme nrf, pourquoi s'embêter avec des bibliothèques ? Même l'init spi, c'est 2 ou 3 registres du pic à renseigner.
tiré du programme nrf, pourquoi s'embêter avec des bibliothèques ? Même l'init spi, c'est 2 ou 3 registres du pic à renseigner.
Code : Tout sélectionner
static BYTE NrfWriteReadSpi(BYTE b)
// module spi nRF24L01, écrire/lire octet
{
SSPBUF = b;
while (!SSPSTATbits.BF) ;
return SSPBUF;
}
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 21 invités