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 : Jérémy
Ecran Easy TFT
Salut tout le monde
ouf, laborieux, cette inscription, faut être fort en devinette ...
Je vois que ça patauge avec les lcd, moi c'est plutôt avec les touchscreens que je me bats actuellement ...
Ci-après un résumé de ma façon de piloter le ili9341
L'initialisation est simplifiée, mais ça suffit pour qu'il réponde, ça marche sur l'écran de l'arduino Uno et d'autres écrans pilotés par un pic
Pour afficher, le principe est de définir une zone rectangulaire, puis de lui envoyer autant de couleurs 16 bit qu'il y a de points dans le rectangle
Le remplissage des points se fait par lignes, de haut en bas et de gauche à droite (changeable dans le registre "memory access control")
J'espère que ça pourra t'aider, bye
ouf, laborieux, cette inscription, faut être fort en devinette ...
Je vois que ça patauge avec les lcd, moi c'est plutôt avec les touchscreens que je me bats actuellement ...
Ci-après un résumé de ma façon de piloter le ili9341
L'initialisation est simplifiée, mais ça suffit pour qu'il réponde, ça marche sur l'écran de l'arduino Uno et d'autres écrans pilotés par un pic
Pour afficher, le principe est de définir une zone rectangulaire, puis de lui envoyer autant de couleurs 16 bit qu'il y a de points dans le rectangle
Le remplissage des points se fait par lignes, de haut en bas et de gauche à droite (changeable dans le registre "memory access control")
J'espère que ça pourra t'aider, bye
Code : Tout sélectionner
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define RED 0xf800
#define Pm8Out(d8) LCD_PM8 = d8; LCD_WR = 0; LCD_WR = 1
#define SendCmd(c8) LCD_RS = 0; Pm8Out(c8); LCD_RS = 1
#define SendData(d8) Pm8Out(d8)
#define SendData16(d16) Pm8Out((d16)>>8); Pm8Out((d16)&0xff)
unsigned char mactl[4] = { 0x88, 0x28, 0x48, 0xe8 };
int lLcd, hLcd;
void LcdStart(unsigned int ori) // démarrer ili9341 sur port parallèle 8 bit, orientation 0 à 3
{
ori %= 4;
if (ori%2) { lLcd = LCD_HEIGHT; hLcd = LCD_WIDTH; }
else { lLcd = LCD_WIDTH; hLcd = LCD_HEIGHT; }
LCD_CS = LCD_RS = LCD_RD = LCD_WR = 1;
LCD_RESET = 0; Wait1ms(10); LCD_RESET = 1; Wait1ms(50);
LCD_CS = 0;
SendCmd(0x01); Wait1ms(10); // soft reset
SendCmd(0x3a); SendData(0x55); // set pixel format -> 65k rgb565
SendCmd(0x11); Wait1ms(10); // exit sleep
SendCmd(0x29); Wait1ms(10); // display on
SendCmd(0x36); SendData(mactl[ori]); // set memory access control
LCD_CS = 1;
LcdErase(0x0000); // écran noir
LcdSetPixel(20, 10, RED); // pixel rouge en x=20, y=10
}
void LcdFillSet(int x1, int y1, int x2, int y2) // pas de clipping, le faire en amont
{
SendCmd(0x2a); SendData16(x1); SendData16(x2); // set column address
SendCmd(0x2b); SendData16(y1); SendData16(y2); // set page address (=row)
SendCmd(0x2c); // write graphic ram
}
void LcdSetPixel(int x, int y, unsigned int clr)
{
if (x >= 0 && x < lLcd && y >= 0 && y < hLcd) { // clipping
LCD_CS = 0
LcdFillSet(x, y, x, y); SendData16(clr);
LCD_CS = 1;
}
}
void LcdErase(unsigned int clr)
{
LCD_CS = 0;
LcdFillSet(0, 0, lLcd-1, hLcd-1);
for (int i=0; i<lLcd; i++) for (int j=0; j<hLcd; j++) { SendData16(clr); }
LCD_CS = 1;
}
Modifié en dernier par satinas le lun. 9 nov. 2015 21:51, modifié 3 fois.
Ecran Easy TFT
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonsoir,
Tout d'abord bienvenue sur le Forum .
Les indiens, les russes et autres pirates de tout bord sont des filous !! , je me dois de leur barrés la route du mieux possible afin de gardé l'intégrité du Forum intact .
As-tu vraiment galérer et sur quel point en particulier , ou était ce une boutade?
Sinon merci de partager ton expérience, çela me fait grandement plaisir , pas forcement pour trouver la solution( enfin si j'avoue tout) mais aussi car c'est exactement pourquoi j'ai créer ce forum ! . Comment la tu trouvé le Fofo au fait ?
Ton code je peux le traiter tout de suite ? c'est fait avec mikroC ?
J'essaye de tester ça tout de suite.
Tout d'abord bienvenue sur le Forum .
ouf, laborieux, cette inscription, faut être fort en devinette ...
Les indiens, les russes et autres pirates de tout bord sont des filous !! , je me dois de leur barrés la route du mieux possible afin de gardé l'intégrité du Forum intact .
As-tu vraiment galérer et sur quel point en particulier , ou était ce une boutade?
Sinon merci de partager ton expérience, çela me fait grandement plaisir , pas forcement pour trouver la solution( enfin si j'avoue tout) mais aussi car c'est exactement pourquoi j'ai créer ce forum ! . Comment la tu trouvé le Fofo au fait ?
Ton code je peux le traiter tout de suite ? c'est fait avec mikroC ?
J'essaye de tester ça tout de suite.
Ecran Easy TFT
C'est pas difficile, mais hier à 1h du matin, mon niveau intellectuel était proche du niveau zéro, j'avais lu micro-ordinateur au lieu de micro-contrôleur alors forcément ça coinçait.
Essaye d'adapter ce programme, en le comprenant sinon c'est pas profitable. Il faut le vérifier car il y a des erreurs dues à la recopie "à la main". Par exemple dans le LcdErase() il y a une erreur, car le fait d'envoyer la couleur une seule fois, suivie des signaux write (il en manque d'ailleurs dans la boucle), n'est possible que si la couleur est blanc ou noir, c'est à dire que si 2 octets de la couleur sont les mêmes.
Si tu comprends pas qq chose, dis-le.
PS Le fait que l'écran n'affiche rien tant que que tu ne lui as pas demander d'afficher quelaque chose, me semble normal,
Essaye d'adapter ce programme, en le comprenant sinon c'est pas profitable. Il faut le vérifier car il y a des erreurs dues à la recopie "à la main". Par exemple dans le LcdErase() il y a une erreur, car le fait d'envoyer la couleur une seule fois, suivie des signaux write (il en manque d'ailleurs dans la boucle), n'est possible que si la couleur est blanc ou noir, c'est à dire que si 2 octets de la couleur sont les mêmes.
Si tu comprends pas qq chose, dis-le.
PS Le fait que l'écran n'affiche rien tant que que tu ne lui as pas demander d'afficher quelaque chose, me semble normal,
Ecran Easy TFT
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Pour le moment c'est un echec !.
J'ai du mal a interpréter la commande
BYTE mactl[8] = { 0x88, 0x28, 0x48, 0xe8 };
Mon compilo ne veut pas en entendre parler
Je l'ai mis en commentaire . Ne sachant pas a quoi elle sert . J'ai essayre de corriger quelques erreurs effectivement, pour pouvoir compiler un truc , juste histoire de voir une réaction même quelconque !
Pour le moment je fais échec , malgres avoir réussis a faire compiler un truc
J'ai du mal a interpréter la commande
BYTE mactl[8] = { 0x88, 0x28, 0x48, 0xe8 };
Mon compilo ne veut pas en entendre parler
Je l'ai mis en commentaire . Ne sachant pas a quoi elle sert . J'ai essayre de corriger quelques erreurs effectivement, pour pouvoir compiler un truc , juste histoire de voir une réaction même quelconque !
Pour le moment je fais échec , malgres avoir réussis a faire compiler un truc
Ecran Easy TFT
Ecran Easy TFT
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Yes ca compile avec ca maitneant . Mais toujours rien .
L'écran reste toujours blanc ;
Je pense avoir a peut pret compris ... mais rien . dans le LCD start je met un display Off a la place du ON , rien du tout
D'apres ton prgoramme le LCD_RESET est actif à l'état haut ? chez moi je pense que c'est l'etat bas ? ( de toute façon j'ai essayé avec les deux )
J'en suis rendu ici :
L'écran reste toujours blanc ;
Je pense avoir a peut pret compris ... mais rien . dans le LCD start je met un display Off a la place du ON , rien du tout
D'apres ton prgoramme le LCD_RESET est actif à l'état haut ? chez moi je pense que c'est l'etat bas ? ( de toute façon j'ai essayé avec les deux )
J'en suis rendu ici :
Code : Tout sélectionner
#define LCD_RD PORTB.B0 // La Broche B0 du PORTB correspond à la broche READ
#define LCD_WR PORTB.B1 // La Broche B1 du PORTB correspond à la broche WRITE
#define LCD_RS PORTB.B2 // La Broche B2 du PORTB correspond à la broche Register Select
#define LCD_CS PORTB.B4 // La Broche B0 du PORTB correspond à la broche Chip Select
#define LCD_RESET PORTB.B5 // La Broche B0 du PORTB correspond à la broche RESET
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define RED 0xf800
#define Pm8Out(d8) PORTD = d8; LCD_WR = 0; LCD_WR = 1
#define SendCmd(c8) LCD_RS = 0; Pm8Out(c8); LCD_RS = 1
#define SendData(d8) Pm8Out(d8)
#define SendData16(d16) Pm8Out((d16)>>8); Pm8Out((d16)&0xff)
unsigned char mactl[4] = { 0x88, 0x28, 0x48, 0xe8 };
int lLcd, hLcd;
int i;
void LcdStart(unsigned int ori);
void LcdFillSet(int x1, int y1, int x2, int y2);
void LcdSetPixel(int x, int y, unsigned int clr);
void LcdErase(unsigned int clr);
void LcdStart(unsigned int ori) // démarrer ili9341 sur port parallèle 8 bit, orientation 0 à 3
{
ori %= 4;
if (ori%2) { lLcd = LCD_HEIGHT; hLcd = LCD_WIDTH; }
else { lLcd = LCD_WIDTH; hLcd = LCD_HEIGHT; }
LCD_CS = LCD_RS = LCD_RD = LCD_WR = 1;
LCD_RESET = 0; delay_ms(10); LCD_RESET = 1; delay_ms(50);
LCD_CS = 0;
SendCmd(0x01); delay_ms(10); // soft reset
SendCmd(0x3a); SendData(0x55); // set pixel format -> 65k rgb565
SendCmd(0x11); delay_ms(10); // exit sleep
SendCmd(0x29); delay_ms(10); // display on
SendCmd(0x36); SendData(mactl[ori]); // set memory access control
LCD_CS = 1;
LcdErase(0x0000); // écran noir
delay_ms(50);
LcdSetPixel(20, 10, RED); // pixel rouge en x=20, y=10
LcdSetPixel(21, 10, RED);
LcdSetPixel(21, 11, RED);
LcdSetPixel(20, 11, RED);
}
void LcdFillSet(int x1, int y1, int x2, int y2) { // pas de clipping, le faire en amont
SendCmd(0x2a); SendData16(x1); SendData16(x2); // set column address
SendCmd(0x2b); SendData16(y1); SendData16(y2); // set page address (=row)
SendCmd(0x2c); // write graphic ram
}
void LcdSetPixel(int x, int y, unsigned int clr) {
if (x >= 0 && x < lLcd && y >= 0 && y < hLcd) { // clipping
LCD_CS = 0 ;
LcdFillSet(x, y, x, y); SendData16(clr);
LCD_CS = 1;
}
}
void LcdErase(unsigned int clr) {
LCD_CS = 0;
LcdFillSet(0, 0, lLcd-1, hLcd-1);
SendData16(clr); // on envoie une seule fois la couleur
for (i=1; i<lLcd*hLcd; i++) {
LCD_WR = 0; LCD_WR = 1;
}
LCD_CS = 1;
}
void main() {
ANSELB = 0; // Configure le PORTB en digital
ANSELD = 0; // Configure le PORTD en digital
ANSELE = 0; // Configure le PORTD en digital
TRISB = 0; // Port B en sortie
TRISD = 0; // Port D en sortie
TRISE = 0; // Port en sortie pour test
//################# BOUCLE PRINCIPALE ###########################
while(1) {
LcdStart(0) ;
delay_ms(1000); // pause
}
}
Ecran Easy TFT
Tous les signaux sont actifs à l'état bas, au repos il sont tous à 1.
En fin de séquence reset, le signal RESET est à 1, normal.
L'astuce est de laisser RS à 1, et ne le changer que fugitivement si on envoie une commande(=registre), ce qui arrive pas très souvent, car ces écrans on passe son temps à leur envoyer des datas (couleurs).
Rallonge les délais dans l'initialisation, et dans le signal WRITE, mais je pense pas que ça ce soit nécessaire, car ils sont rapides, en spi ils tiennent les 20MHz.
En fin de séquence reset, le signal RESET est à 1, normal.
L'astuce est de laisser RS à 1, et ne le changer que fugitivement si on envoie une commande(=registre), ce qui arrive pas très souvent, car ces écrans on passe son temps à leur envoyer des datas (couleurs).
Rallonge les délais dans l'initialisation, et dans le signal WRITE, mais je pense pas que ça ce soit nécessaire, car ils sont rapides, en spi ils tiennent les 20MHz.
Ecran Easy TFT
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Tous les signaux sont actifs à l'état bas, au repos il sont tous à 1.
Quand je regarde le schéma de la carte j'ai pas l'impression ? mais je uis débutant alors je ne suis pas sur de moi ; En page 3
L'astuce est de laisser RS à 1, et ne le changer que fugitivement si on envoie une commande(=registre), ce qui arrive pas très souvent, car ces écrans on passe son temps à leur envoyer des datas (couleurs).
Oui au début j'aivaps as percuté, amis j'avais finis par comprendre, c'est malin ! on gagne une commande .
Quand tu ecris LcdErase(0x0000); // écran noir Il deviens tout noir ? donc deja pas la peine que j'essaye d'aller plus loin !
J'ai rajouter un délais de 1µs pour la commande sur LCD_WR, comme le préconise la DS c'est 15nS ? Mais bon pour les je pourrais améliorer quand il réagira cette écran de M...e
Ecran Easy TFT
Ecran Easy TFT
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités