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 le langage C !

Modérateur : Jérémy

Ecran Easy TFT
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#113 Message par satinas » lun. 9 nov. 2015 21:01

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

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 (>= 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
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#114 Message par Jérémy » lun. 9 nov. 2015 21:09

Bonsoir,

Tout d'abord bienvenue sur le Forum . :D

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.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran Easy TFT
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#115 Message par satinas » lun. 9 nov. 2015 21:33

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,

Ecran Easy TFT
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#116 Message par Jérémy » lun. 9 nov. 2015 21:38

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 :lol:

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran Easy TFT
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#117 Message par satinas » lun. 9 nov. 2015 21:42

Ca doit être BYTE qui passe pas, mets unsigned char à la place
J'ai rectifié le programme en conséquence, voir plus haut

Ecran Easy TFT
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#118 Message par Jérémy » lun. 9 nov. 2015 21:55

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 :

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] = { 0x880x280x480xe8 };
int lLcdhLcd;
int i;
void LcdStart(unsigned int ori);
void LcdFillSet(int x1int y1int x2int y2);
void LcdSetPixel(int xint yunsigned 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_HEIGHThLcd LCD_WIDTH;  }
  else       { 
lLcd LCD_WIDTH;  hLcd LCD_HEIGHT; }

  
LCD_CS LCD_RS LCD_RD LCD_WR 1;
  
LCD_RESET 0delay_ms(10); LCD_RESET 1delay_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(2010RED);               // pixel rouge en x=20, y=10
  
LcdSetPixel(2110RED);
  
LcdSetPixel(2111RED);
  
LcdSetPixel(2011RED);
}

void LcdFillSet(int x1int y1int x2int 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 xint yunsigned int clr) {
  if (
>= && lLcd && >= && hLcd) { // clipping
    
LCD_CS ;
      
LcdFillSet(xyxy); SendData16(clr);
    
LCD_CS 1;
  }
}

void LcdErase(unsigned int clr) {
 
LCD_CS 0;
 
LcdFillSet(00lLcd-1hLcd-1);
 
SendData16(clr); // on envoie une seule fois la couleur
 
for (i=1i<lLcd*hLcdi++) {
   
LCD_WR 0LCD_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


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

Ecran Easy TFT
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#119 Message par satinas » lun. 9 nov. 2015 22:00

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.

Ecran Easy TFT
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#120 Message par Jérémy » lun. 9 nov. 2015 22:06

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Ecran Easy TFT
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#121 Message par satinas » lun. 9 nov. 2015 22:17

- J'ai modifié la fontions LcdErase, regarde plus haut, notamment il y a 2 boucles car le nombre de pixels dépasse 65536
- Tu n'utilises pas les registres LAT ?
- essaye de démarrer en mettant RESET à 1 pendant 10 ms, puis en le passant définitivement à 0

Ecran Easy TFT
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#122 Message par Jérémy » lun. 9 nov. 2015 22:20

- Tu n'utilises pas les registres LAT ?

Ben je connais pas trop . j'ai préféré faire avec ce que je connaissais en fait .

- essaye de démarrer en mettant RESET à 1 pendant 10 ms, puis en le passant définitivement à 0

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


Retourner vers « Langage C »

Qui est en ligne

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