• version 1.4
    18/01/2019
    rev 05/02/2023

    TFT LCD Ecran Graphique Tactile

    avec 18F26K22 :
    Partie Graphique du LCD 240x320 ILI9431 .. sans texte
    Les 8 fontes de characteres
    Test complet Graphique + TEXTE
    Partie TOUCH Screen XPT2046
    Test TOUCH Screen en mode Bit Bang ( sans suite !)
    Touch Screen avec SOFTWARE SPI , Test PAINT (23/03/2018)
    Petite Application avec 3 zones tactiles (24/03/2018)
    Une Horloge 60 leds Semi-Virtuelle (05/04/2018)
    Interfacage GUI pour commande systeme d'arrosage (..à suivre )

    Avec 18F27K42 :
    Version avec LCD ILI9341 seul ( SPI Hardware) (nov 2020)


    Test Ecran LCD TFT OPEN-SMART 2,4P, 320x240, Tactile, liaison SERIE ! (15/10/2021)
    Test avec Terminal PC VBRAY: liaison directe interface CH340G USB/TTL <---> Ecran LCD serie
    Affichag image BMP stockés sur SDCard 2Go
    (2210/2021)
    Application test avec PIC 16F1847 MikroC
    (21/10/2021)
    à suivre :
    gestion Touch screen pour clavier DTMF




    Ecran LCD couleur 240x320
    avec PIC 18F26K22
    mode Graphique


    usage d'un PIC18F26K22 en DIP28 et du Pickit2 Microchip pour charger l'executable
    Environnemen t: MikroC Pro 7.1.0

    Testé avec oscillateur interne PIC Fosc=32Mhz

    Vendu sous la denomination 2.2 Inch SPI 240 x 320 TFT Color LCD Module Compatible 5110 4 IO for Arduino
    mais en réalité : afficheur TFT 2,2" 176x220 65K couleurs,dialogue en SPI.

    images/t_LCD_TouchScreen_Back.gif images/t_ILI9341_Virtual_Physical_Pointer.gif
    Front view Back view organisation de l'ecran , rotations ecran

    la partie carte SD n'est pas (encore) utilisée.

    Hardware :

    PIC18F26K22 en DIP28
    Vcc alim PIC= 3,3 à 3,5V MAXI ! pour le LCD
    Prototype:

    images/t_Proto_LCD_ILI9341_180309a.gif


    RB7 et RB6 reste libres pour l' ICSP
    MCLR au +Vcc via 6,8K et au ICSP Vpp
    pour Usage avec Pickit2
    Le MSSP SPI1 est mobilisé pour l'echange des données avec LCD ET Touch Screen.
    L'aiguillage se faisant via les pin de Selection _CS et T_CS.
    #define Led_On_RA4 LATA4_bit //tirage au +VCC via 2,7K
    RC6 = sortie Tx UART 19200,8,N,1-> Cordon FT232 LTTL/USB -> PC
    Tx sur fil Blanc (Pin 5 )
    Gnd sur fil Noir (Pin 1)


    Connectique et Schéma :

    images/t_18F26K22_TFT_ILI9341_schema_180310.gif
    hardware tres simple ! version ALL SPI


    Utilisation du SPI1 Hardware du Pic 18F26K22.
    ../_LCD_Graf_Coul_176x220/images/MSSP_SPI_mode_diagram.jpg

    fontes affichage figures mode PAYSAGE



    Attention aux appellations et de quel coté on se situe: RC5 =MOSI=Master Output pour le Slave Input
    Le Slave étant le LCD TFT. avec son entree SDI
    Configuration Control pins :

    #define Led_On_RA4_Direction TRISA4_bit
    #define ON 0
    #define OFF 1

    #define T_IRQ PORTB.B0
    #define T_CS PORTA.B2

    #define MISO LATC4_bit // not used
    #define _RST LATC0_bit // Reset TFT
    #define _RS LATC1_bit //Command (RS=0) Parameter (RS=1)
    #define _CS LATC2_bit // CS
    #define _SDI LATC5_Bit // MOSI SDO RC5 MSSP1 SPI data output.
    #define _CLK LATC3_Bit // SCK
    #define _LED 0 // 0 if wired to +5V directly
    #define SQ50_trigger LATA3_bit
    Liaison UART1 : Affichage sur Terminal .. (avec option: Reception de commande via Clavier)





    Software :

    Compilateur MikroC 7.20.

    Problematique :
    Stockage des 3 fontes
    Si situées en RAM, il faut 677+2405+642= 3724 bytes ... sur 3875
    Taille RAM insuffisante, car il y a d'autres besoins en RAM (TEXTE ..80 , Buffer1 ..80 , CRam1 ..32 et autres variables)
    d'ou l'usage d'une zone spéciale appelée HEAP ( ou Tas) destinée à un usage dynamique , permutable.
    Cette Zone est definie par la taille de la plus grande Fonte , qui occupe 2405 bytes (arrondi à 2408)
    Le mecanisme d'allocation memoire est géré par la librairie MemManager
    Il faut definir cette taille maxi dans la configuration du projet
    Project
    --Edit Project
    ---cocher Heap
    -------et mettre la valeur voulue (2408) dans l'emplacement Size.

    ../_LCD_Graf_Coul_176x220/images/Heap_size_reservation.jpg
    fichier de config resultant : P18F26K22_FOSC_interne_8xPLL_32Mhz_with_Heap.cfgsch

    Les 3 fontes sont definies dans l'espace Constant code ( en Memoire programe)
    pour pouvoir les utiliser en RAM, il faudra donc, au préalable , les transferer dans l'espace alloué dans le HEAP.
    et utiliser alors ce pointeur d'espace memoire.
    La fonction void Select_Font_Type(int Type) s'en charge.
    Apres usage ,on peut utiliser void Close_Font_Type(int Type) qui libere l'espace mémoire
    Nota: on pourrait eventuellement toujours utiliser l'espace maxi pour les 3 fontes.. mais c'est aussi à but didacticiel.

    Occupation memeoire RAM et ROM
    // Used RAM (bytes): 534 (14%) Free RAM (bytes): 3341 (86%) Used RAM (bytes): 534 (14%) *Free RAM (bytes): 3341 (86%)
    * Attention, Ce n'est vrai ,Tant qu'on utilise pas de fonte !, la vrai valeur à prendre en compte, c'est 401 bytes.
    // HEAP RAM (bytes): 2410 HEAP RAM (bytes): 2410
    // Used ROM (bytes): 18902 (29%) Free ROM (bytes): 46634 (71%) Used ROM (bytes): 18902 (29%) Free ROM (bytes): 46634 (71%)

    Version SIMPLIFIEE sans Fontes ,ni affichage Texte

    Resultat Affichage
    Projet complet :
    18F26k22_LCD_Touch_ILI9341_SPI_minimal_180206.zip


    Bibliotheque ILI9341 :

    Les documents trouvés sur le web sont surtout axés sur le monde ARDUINO ATMEL ( racheté par MicroChip!!)
    Mais grace aux exemples fournis en simili C++ ( liens en fin de page.)
    j'ai pu quand meme arriver à quelques chose..
    l'avantage de ce LCD est que je sais qu'il y a ce controleur ILI9341 ! ,même si ce n'est pas inscrit dessus..comme le PORT SALUT
    L'essentiel des fonctions sont OK., mais il reste un bug sur la fonction Drawline


    Fonctions disponibles :

    TFT_ILI9341_SPI_180311.h

    void Init_ILI9341(void);
    void Clear_LCD(void);
    void TFT_CLS(void);
    void Put_Pixel(int x1,int y1,Word color);
    void Rectangle_Plein(int x1,int y1, int x2,int y2,Word color);
    void SetWindow(int x1, int y1, int x2, int y2);
    void SendCmd(unsigned char c);
    void SendData(Byte c);
    Byte Set_Cursor_XY(int x, int y);
    Word Set_RGB_Color(Byte red, Byte green, Byte blue);

    void SetBacklight(char flag);
    void SetBacklightBrightness(Byte brightness);
    void SetDisplay(char flag);
    void Invert(char flag);
    void SetBackgroundColor(Word color); //= COLOR_BLACK);
    void SetOrientation(Byte orientation);
    void SetAddrWindow(int x0, int y0, int x1, int y1);
    void SetTextColor(Word Color) ;
    Byte GetOrientation(void);
    void SetFont( unsigned char * font);
    int maxX2(void);
    int maxY2(void);
    unsigned char Set_Cursor_XY(int x, int y);

    void DrawLine(Word x1,Word y1, Word x2, Word y2, Word color);
    void DrawText(int x, int y, Byte * s, Word Color);
    Byte DrawChar(int x, int y, Byte ch, Word color);
    void DrawCircle(int x0, int y0, int r, Word color);
    void Swaping(int a, int b);
    void OrientCoordinates(int x1, int y1);
    void Invert_Display(char bb);
    Word Compose_Color(Byte red, Byte green, Byte blue);

    void DrawBitmap(int, int y, const Byte *bitmap, int w, int h, Word color);
    void drawXBitmap(int x, int y, const Byte *bitmap, int w, int h, Word color);


    Les Fontes de characteres :

    TFT_Fonts_320x240_ILI9341_180311.h

    structure : entête de 5 bytes Avaat le tableau de définition des caracteres .
    struct _currentFont
    {
    unsigned char * font; // nom de la fonte
    Byte width; // largeur d'un caractere (en pixels)
    Byte height; // hauteur d'un caractere en pixel
    Byte offset; // adresse demarrage 1er caracatere utile
    Byte numchars; // nombre de characteres definis
    unsigned char MaxC; // maximum de char pouvant etre affichés sur une ligne

    } cfont;


    exemples :
    #1 Taille Font TerminaL6x8 = 677 cfont.MaxC= 25
    #3 Taille Font Trebuchet_MS13x21 = 1045 cfont.MaxC= 13
    #4 Taille Font Terminal5x11 = 1061 cfont.MaxC= 32
    #5 Taille Font Trebuchet_MS16x23 = 1279 cfont.MaxC= 11


    Fontes de grande taille.

    #2 Taille TerminaL12x16 = 2405 cfont.MaxC= 14
    #6 Taille Font Arial_Narrow22x32 = 2319 cfont.MaxC= 8
    #7 taille Font NI7SEG22x28 = 2319 cfot.MaxC = 8
    #8 Taille Font NI7SEG26x35 = 1708 cfont.MaxC= 6

    Avec Gestion specifique :
    En gérant chaque caractere individuellement , pour minimiser l'usage d'espace RAM

    lire en RAM, la ligne de bytes correspondant à la lettre à afficher
    La zone RAM nessaire serait alors bien plus faible < 32 bytes ! .. mais quid de la vitesse d'affichage.

    exemple testé sur la récup des bytes de la lettre A , fonte TerminaL12x16..
    une fonte demarre generalement à partir du 32em char normalisé, soit l'espace=32
    L'entete de fonte sur 5 bytes, contient des parametres sur la fonte ..( j'ai rajouté le 5em = Nb de char maxi par ligne)
    Si on choisit la lettre A , l'adresse de debut du charactere A dans la fonte se trouve donc à :

    L1=TerminaL12x16+5 + ('A'-32)*25; // 25 bytes par caracteres
    FLASH_Read_N_Bytes(L1, buffer1,25); // transfert des 25 bytes en RAM
    LongWordToStr(L1+5,CRam1);
    UART1_Write_Text(CRam1);
    UART1_Write('=');
    for (i=0;i<25;i++) // verification des Bytes récupérés
    {

    ByteToHex(buffer1[i],CRam1);
    UART1_Write_Text(CRam1);
    UART1_Write(' ');
    }

    Resultat sur terminal :
    font.width= 6 cfont.height= 8 cfont.nbrows= 1 cfont.MaxC= 25
    6819=0B 00 38 00 3F E0 3F FC 07 FF 06 1F 06 FF 06 FC 07 E0 3F 00 3F 00 38 00 00


    const unsigned char TerminaL12x16[] = {
    0x0C, 0x10, 0x20, 0x60,14,
    .... etc
    0x0B, 0x00, 0x38, 0x00, 0x3F, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x06, 0x1F, 0x06, 0xFF, 0x06, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0x3F, 0x00, 0x38, // lettre A




    Version Affichage LCD complet , avec Fontes (et Texte)
    MikroC Pro registered V 7.1.0

    Résultat:

    images/t_TFT_ILI9341_Test_180308a.gif images/t_TFT_ILI9341_Test_180308b.gif images/t_LCD_ILI9341_Affichage_PAYSAGE_180320.gif

    Projet complet Zipé:

    Avec Affichage PORTRAIT et PAYSAGE
    Fosc=64MHz et SPI ralenti

    _18F26K22_SPI_LCD_ILI9341_Affichage_seul_180320.zip
    _18F26K22_SPI_LCD_ILI9341_Affichage_seul_180320.c
    18F26k22_LCD_240x320_Affichage_ILI9341_SPI_180320.hex

    Result Dialogue terminal RS232 :





    Video :
    LCD_240x320_ILI9341_Portrait_Paysage_180320.webm



    Liens et docu, utilisés pour ce projet :
    ILI92341_Wiki_GitHub.html
    ILI9341.pdf

    Fonctions Graphiques à debugger

    * Drawline ..
    ..




    Touch screen

    voir xpt2046-datasheet.pdf


    Connectique Touch screen :

    version ALL MSSP SPI1
    images/XPT2016_SPI_Drive_schema.jpg



    Test Calibration du Touch Screen
    (via liaison MSSP SPI)

    images/Touch_screen_Calib_HG.jpg
    1ere mesure 4em mesure



    HARDWARE :

    Le Touch screen utilise MISO et MOSI CLOCK ( déja relié au LCD)
    T_CS= 0 ; // (RA2 ,LATA2_bit) utilisé pour valider le PORT SPI du TOUCH SCREEN
    si on s'adresse au Touch Screen, il faut devalider le LCD par _CS=1 ( RC2 ,LATC2_bit)
    Les 14 pins du LCD sont donc toutes raccordées.

    programme de test :

    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 du stylet , pour declencher les mesures...
    Le but final étant de n'etre dérouté du programme principal, QUE SI ON TOUCHE L'ECRAN !
    mais les fonctions SPI ne sont pas re-entrante dans l'interrupt !
    peut etre avec un morceau de SPI à 100% asm .. à suivre
    donc, pour l'instant , je suis en mode pooling du Flag_RB0

    Les 5 couples de points , coordonnees XY : 4 angles et centre de l'ecran,
    sont stockés dans un tableau ... et comparées avec des limites MAXI et MINI , stokees dans le code .
    Ces lilmites ont été dterminées par de multiples series de mesure , et sont assez "larges".
    .... pourraient etre aussi stockées par la suite en EEPROPM du PIC !
    Si les mesures sont dans les clous .. message OK en face de chaque mesure , sinon ..BAD !
    La mesure de PRESSion stylet est aussi verifiée ..
    le MINima ,MOYenne et MAXIma sont affichés .
    Si le MINima est inferieur à 120 , il y a un fort risque de mauvaise lecture
    => message BAD Calibration .et relance (RESET) programme apres 5 secondes,
    sinon affiche .. FIN ...

    Pour la suite, l'operation calibration ne se fera que sur demande expressive de l'utilisateur ,
    example : en activant une pin MCU affectée à cela.

    La fonction de lecture datas Touch screen :
    (avec le concours de : forum FANTASPIC SATINAS)
    Les differentes commandes : x => 0x91 , y => 0xD1 , z1 => OxB1, z2 => 0xC0

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


    Limites dans le code :
    Word Calibration_TouchScreen[10]; // couple XY de chaque point de calibration
    //couple Maxi et Mini pour chacune des 5 mesures en X et Y.
    const Word MAXI[10]= {4100,4100,550,4100,550,550,4000,600,2800,2800};
    const Word MINI[10]= {3500,3500,250,3500,250,250,3500,250,1990,1990};


    En Haut a Gauche X= 3744 OK Y= 3974 OK
    En Haut a Droite X= 302 OK Y= 3974 OK
    En Bas a Droite X= 479 OK Y= 511 OK
    En Bas a Gauche X= 77 BAD Y= 3011 BAD
    au Centre X= 2046 OK Y= 2208 BAD
                 
    Press Min 9 Moy= 1012   Max 1983


    Mesures OK :
    Résumé Calibration
    Relevé moyenné X, Y
    En Haut a Gauche X= 3744 OK Y= 4000 OK
    En Haut a Droite X= 255 OK Y= 4000 OK
    En Bas a Droite X= 511 OK Y= 511 OK
    En Bas a Gauche X= 3744 OK Y= 463 OK
    au Centre X= 2003 OK Y= 2180 OK
    Press Min= 220 Moy= 1391 Max= 1979


    exemple d' affichage sur le Terminal :




    Projet MikroC
    zippé : _18F26K22_SPI_LCD_ILI9341_Test_Calibration_Touch_Screen_180314.zip
    Source : _18F26K22_SPI_LCD_ILI9341_Test_Calibration_Touch_Screen_180314.c
    Chargeur : 18F26k22_SPI_Test_Calibration_Touch_screen_XPT2046_180314.hex
    Config : P18F26K22_FOSC_interne_8xPLL_32Mhz_with_Heap_2410.cfgsch
    * avec usage du heap !




    Version gestion Touch Screen avec SOFTWARE SPI.

    Les Pins du Touch screen sont affectées AUTREMENT, sans lien avec le LCD


    images/XPT2016_Soft_SPI_Drive_schem.jpg

    Hardware:


    sbit T_CS at LATA2_bit;
    sbit T_CS_Dir at TRISA.B2;
    / Software SPI module connections
    sbit SoftSpi_SDI at RB1_bit;
    sbit SoftSpi_SDO at RA4_bit;
    sbit SoftSpi_CLK at RA3_bit;
    sbit SoftSpi_SDI_Direction at TRISB1_bit;
    sbit SoftSpi_SDO_Direction at TRISA4_bit;
    sbit SoftSpi_CLK_Direction at TRISA3_bit;
    // Port B;


    La routine d'acquisition , utilisée en mode POOLING dans le amin programme.


    void TS_Get_XY_Values(void)
    { int i;
    Word z1,z2,z0;
    Word xx,yy;
    Word H,L;
    Byte Dummy=0;
    _CS=1;
    xx=0;yy=0;
    x=0;y=0;z1=0;z2=0;z0=0;
    for (i=0;i<12;i++)
    {
    T_CS=0;
    Soft_SPI_Write(0xD1);
    H= Soft_SPI_Read(Dummy);
    L= Soft_SPI_Read(Dummy);
    xx =(H <<8) + L;
    xx=xx >>3;
    T_CS=1;
    Delay_us(20);

    T_CS=0;
    Soft_SPI_Write(0x91);
    H= Soft_SPI_Read(Dummy);
    L= Soft_SPI_Read(Dummy);
    yy =(H <<8) + L;
    yy=yy>>3;
    T_CS=1;
    Delay_us(20);

    T_CS=0;
    Soft_SPI_Write(0xB1);
    H= Soft_SPI_Read(Dummy);
    L= Soft_SPI_Read(Dummy);
    z1 =(H <<8) + L;
    z1=z1 >>3;
    T_CS=1;
    Delay_us(20);

    T_CS=0;
    Soft_SPI_Write(0xC0);
    H= Soft_SPI_Read(Dummy);
    L= Soft_SPI_Read(Dummy);
    z2 =(H <<8) + L;
    z2=z2>>3;
    T_CS=1;
    Delay_us(20);
    if ((i >= 2) && (i < 10))
    {
    x = x + xx;
    y = y+ yy;
    z0 = z0+(z2-z1);
    }
    }
    x= x >>3; // moyenne de 8 valeurs
    y= y >>3;
    Press= 4095 -(z0>>3);
    T_CS = 1;
    }


    Nota : ne peut pas etre utilisé en mode Interruption ET ailleurs en mode pooling
    car fonction Soft_SPI NON REENTRANTE


    Sortie sur Terminal



    Ecrans LCD :

    Presentation zones sensibles dessinons ! 0 + 0 =


    Dans tous les cas de figure, il sera INDISPENSABLE de faire une CALIBRATION préalable du Touch Screen

    #define Version "180323"
    // test avec soft SPI pour le touch screen et SPI1 Hardware pour le LCD
    // Test OK à FOSC=32MHz

    Avec MA calibration du touch screen :
    Valeurs brutes :
    Test Touch screen dans les 4 angles ,et au centre (32MHz) avec delay 60mS
    En Haut a Gauche * X= 3445 Y= 3577 Press= 1523
    En Haut a Droite * X= 527 Y= 3671 Press= 627
    En Bas a Droite * X= 635 Y= 577 Press= 1972
    En Bas a Gauche * X= 3457 Y= 521 Press= 2303
    au Centre * X= 2014 Y= 2288 Press= 1753


    Mise à l'echelle du Touch Screen :
    Attention à l'orientation naturelle , IMMUABLE, du Touch Screen,
    et celle , differente par défaut, et modifiable du LCD

    // x1=(Word)f1; // Orientation=2
    x1=240-(Word)f1; // Orientation=0
    f1= (float) (y-410)/10.5 ;
    //y1= (Word)f1; // Orientation=2
    y1= 320-(Word)f1; // Orientation=0


    SOFWARE :

    Projet zipé : 18F26k22_LCD_ILI9341_SPI1_Touch_screen_XPT2046_SPI_Soft_PAINT_180323.zip
    Source : _18F26k22_LCD_ILI9341_SPI1_Touch_screen_XPT2046_SPI_Soft_PAINT_180323.c
    Chargeur : 18F26k22_LCD_ILI9341_SPI1_Touch_screen_XPT2046_SPI_Soft_PAINT_180323.hex

    La resolution du Touch Screen est suffisament stable te fiable pour definir des zones sensibles sur l'ecran
    Touches de fonction curseur , ..etc .. pour pouvoir l'utiliser ainsi.
    Le seul point NEGATIF de mes invistigations ( Mea Culpa..) est de n'avoir pas pu faire une mesure 100% Bit Bang
    ne faisant pas appel à une fonction MikroC , NON RE-ENTRANTE



    APPLICATION:
    18F26K22
    Test simple avec 3 Zones tactiles

    gestion du Touch Screen en mode SOFTWARE SPI.
    L'appel de la routine de lecture X,Y,PRESS se fait UNIQUEMENT via l'interruption RB0.
    Petite presentation avec Fonte #1 et #2
    Utilisation de la fonction Fill_Round_Rect(..) pour définir les 3 zones tactiles
    Les 2 boutons "ON" et "OFF" pour commander une sortie (RA5 Led).
    Un bouton sélectionné est Encadré d'un liseret Blanc.
    Le status Led RA5 s'affiche avec cercle Rouge = eteint , et cercle Vert= Allumée
    Mesure de temperature "Tp DS18B20" (sensor OWS) affichée en Fonte #6
    Mesure Analogique EA0 : "Temperature"
    Bandeau progressif suivant la temeprature , Echelle affichée en dessous 0 à 70°C
    Affichage valeur en format 7 segment (Fonte #8 )

    La detection stylet (IRQ PEN output) est faite par l'interruption sur RB0
    qui lance la fonction saisie X,Y,Press
    si la pression exercée depasse un seuil mini, les mesures X,Y sont validées.
    puis testées , si le stylet est à l'interieur d'une des 3 zones tactiles préalablement définies
    on declenche l'action correspondante.
    La zone RAZ , effectue simplement une RAZ de la mesure de "Temperature" ,
    Nota:
    celle ci est simplement simulée par un compteur ... pour voir evoluer le ruban.
    La mesure DS18B20 est réelle ..

    Nota: la saisie de position stylet est immediate,mais le rafraichissement de l'ecran n'est fait que toutes les secondes
    on peut donc VOIR un decalage entre l'action et la reaction.

    l'affichage 7segment est effacé par 88.88 en NOIR , car les largeurs de chiffres sont variables
    il manque un caractere BLANC dans cette fonte #8.. à suivre



    Video : Test_zones_tactiles_180324.webm


    SOFWARE :

    Projet zipé : 18F26k22_LCD_ILI9341_SPI1_Test_Touch_screen_XPT2046_SPI_Soft_IRQ_PEN_180324
    Source : _18F26k22_LCD_ILI9341_SPI1_Test_Touch_screen_XPT2046_SPI_Soft_IRQ_PEN_180324.c
    Chargeur : 18F26k22_LCD_ILI9341_SPI1_Test_Touch_screen_XPT2046_SPI_IRQ_PEN_180324.hex



    APPLICATION :
    Horloge semi-virtuelle 60 leds

    Pourquoi Semi-Virtuelle
    Parce que elle n'est pas completement Réelle , comme celle du projet Horloge 6 digits_Modifiée
    Ni comme celle , completement virtuelle, en Ray Tracing
    Celle ci afficha la representation en Ray Tracing et le fonctionnement de l'horloge reelle,
    de plus , elle donne l' heure !

    HARDWARE:
    Inchangé , LCD 240x320 65Kcoul en mode SPI (HARDWARE)
    mais Touche screen NON utilisé dans cette appli

    Le programme :
    Usage de 95 cercles plein pour simuler les Leds.
    L'extinction des leds est faite par Noircicement du cercle .
    L'allumage est synchronisé par la variable "Secondes" évoluant de 0 à 59.

    Les differentes zones d'action :
    Le contour , leds Blanches .. de 0 à 59
    L'oeil droit , leds Vertes de 0 à 12
    pupille droite Magenta ==5
    Sourire Leds Rouge de 22 à 38
    L'oeil Gauche , leds Vertes de 48 à 59
    pupille droite Magenta ==52

    L'affichage HH MM SS est fait avec la fonte mode 7 segments .
    Quelques modif sur la Fonte #8 affichage en 7 segments
    Uniformisation des largeurs de caracteres, largeur trop differente entre le "0" et le "1"
    car cela faisait BAVER l'affichage en mode surimpresssion
    Usage du TAS (Heap=2410 bytes) , Allocation Dynamique de RAM pour les fontes

    Utilisation de FOSC interne 8MHz x PLL soit 32Mhz
    La table de sinus et cosinus est precalculée pour ne pas perdre trop de temps.
    Chaque Led dessinée utilise la fonction FillCircle(x,y,rayonCOULEUR);
    Chaque position de led utilise la table T_Sin[] et T_Cos[]
    Les 95 leds sont effacées en 1 seule foispar un cercle plein NOIR , lors du passage de secondes 59 à Zero
    La boucle principale du programme s'execute entre 450 et 500mS maxi.
    Le timming est assumé par le Timer1 50mS , incremente Secondes apres 20 interuptions Timer1 (50mS x20=> 1sec)
    Il reste donc un TEMPS MORT de ~500mS , disponible... à d'autres taches
    Nota:
    Amelioration possibles :
    Utilisation d'un Quartz +-10ppm au lieu de FOSC interne
    ou d'une RTC en I2C ..
    Utilisation du Touch screen pour faire la mise à l"heure en touchant lezs zones d'affichage HH ou MM ou SS
    faisant apparaitre 3 touches +,-,Valid

    nota: Le LCD ne fonctionne plus à 64MHz

    Projet Zipe: _18F26k22_LCD_240x320_ILI9341_Horloge_Simule_180404.zip
    Main Source _18F26k22_LCD_240x320_ILI9341_Horloge_Simule_180404.c
    Chargeur : 18F26k22_LCD_240x320_Horloge_AT89_simule_180404.hex


    ../_AT89C2051/images/t_LCD_ILI9341_Horloges_1804.gif


    Video :
    LCD_ILI9341_Horloge_180404.webm




    APPLICATION :
    Interface Operateur pour systeme d'arrosage de plantes


    A suivre ....
    --> sur le sujet :gestion arrosage plantes d'appartement




    Version PIC18F27K42 successeur au 18F26K22, en plus etoffée

    Hardware :

    Usage du circuit imprimé pour BASE 18F .. avec un 18F27K42
    Liaisons carte MCU <--> LCD ILI9341 via cordons F---F de couleurs



    Le montage est quasi identique à celui realisé sur le 18F26K22
    La partie TFT et Touch screen sont cablées
    FOSC interne 16MHz x PLL => 64 MHz
    Usage de UART1 RC6 Tx et RC7 Rx , pour debugger et tracer l'évolution du programme.
    Entree Ana 12 bits sur RA0,
    entree OWS DS18B20 sur RA1 ...
    Entree RB0 .. prevue pour la gestion Touch screen
    SPI1 Hardware sur RC3,RC4,RC5
    Alimentation externe 3,3V ( bloc USB 5V -> regulateur DC/DC -> 3,3V)

    SOFTWARE :

    Version allégée pour TEST uniquement du LCD ILI9341
    Inclusion de differentes fontes pour les tailles de Texte
    usage d'une taille Heap de 2500 bytes , et librairie MikroC MemManager
    Test affichages TEXTE
    Tests grafiques : carré , rectangle , cercle ..
    Le point clé , est la gestion Hardware SPI .
    MikroC fournit une librairie avec un mode SPI Avancé
    La vitesse SPI ne doit pas etre trop élévée, sinon le LCD ne peut pas suivre ..
    Vitesse choisie FOSC/64

    UART1_Write_CText(" Init SPI1 advanced HARDWARE \r\n");
    // void SPIx_Init_Advanced(unsigned short master_slav, unsigned short data_sample, unsigned short clock_idle, unsigned short transmit_edge);
    // Set SPI1 module to master mode, clock = Fosc/4, data sampled at the middle of interval, clock idle state low and data transmitted at low to high edge:
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

    UART1_Write_CText(" Init ILI9341 LCD 240x320 \r\n");
    Init_ILI9341();


    SQA Analyser :
    SQA_test_LCD_ILI9341_SPI_18F27K42_2020_1118.scana
    RA3 output , utilisée pour declenchement capture SPI

    images/t_SQA_SPI_HW_18F27K42_LCD_ILI9341.gif images/t_SQA_SPI_HW_18F27K42_LCD_ILI9341_Zoom.gif

    Analyse trame SPI

    zoom transfert d'un byte

    avec FOSC MCU=64Mhz
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);


    Projet MikroC 7.60 :

    LCD_ILLI9341_SPI_Base_18F27K42.zip
    PIC18F27K42_UART1_ADC_SPI_LCD_ILLI9341_Tests_2020_1117.c
    TFT_ILI9341_SPI_2020_11.h
    TFT_Fonts_320x240_ILI9341_180405.h
    TFT_ILI9341_SPI_2020_11.c
    P18F27K42_Fosc_Interne_64Mhz_w_Heap2500.cfgsch

    Ce MCU necessite le PICKIT 4 MPLAB pour etre programmé !
    Avec le logiciel MPLABX IPE V5.30 (stand alone)


    bandeau inferieur de MPLABX IPE V5.30


    Connecting to MPLAB PICkit 4...

    Currently loaded versions:
    Application version............00.05.41
    Boot version...................01.00.00
    Script version.................00.03.33
    Script build number............0540a22e50
    Target voltage detected
    Target device PIC18F27K42 found.
    Device Revision Id = 0xa0010000



    select file
    PIC18F27K42_UART1_ADC12b_LCD_ILI9341_2020_1117.hex

    Loading code from C:\_MikroC\_MesProjets_MikroC\_BASE_18F27K42\PIC18F27K42_UART1_ADC12b_LCD_ILI9341_2020_11.hex...
    2020-11-17 18:36:56 +0100 - Hex file(s) loaded successfully.
    2020-11-17 18:36:57 +0100 - Programming...
    *****************************************************
    Calculating memory ranges for operation...
    Erasing...
    The following memory area(s) will be programmed:
    program memory: start address = 0x0, end address = 0x897f
    configuration memory
    User Id Memory
    Programming/Verify complete
    2020-11-17 18:37:07 +0100 - Programming complete


    images/t_Test_LCD_ILI9341_Base_18F27K42_a.gif

    cablage arriere LCD

    Montage de Test

    differentes taille de texte ( 8 fontes dispo)


    Resultat sur terminal :


    Presentation :
    Directory :C:\_MikroC\_MesProjets_MikroC\_LCD_ILLI9341_SPI_Base_18F27K42
    MikroC pro 7.60
    Projet : PIC18F27K42_UART1_ADC12b_LCD_ILI9341_2020_11.mcppi
    BASE PIC18F27K42 SPI1 / I2C1 HW
    Config bit : P18F27K42_Fosc_Interne_64Mhz.cfgsch FOSC: 16x4 =64.0 MHz
    Source : PIC18F27K42_UART1_ADC_SPI_LCD_ILLI9341_Tests__2020_1117.c
    18F27K42 UART1 ADC LCD 320x240 ILI9341 en SPI

    OTHERS TFT_ILI9341_SPI_2020_11.h
    TFT_ILI9341_SPI_2020_11.c
    TFT_Fonts_320x240_ILI9341_2020_11.h


    Init
    SPI1 advanced HARDWARE
    Init
    Memory Manager
    Total RAM Free = 2500
    Taille Maxi Heap = 2500

    Init ILI9341 LCD 240x320
    maxX= 239 maxY= 319
    Max RAM Buffer into the Lcd = 76800
    Efface ecran Mode Portrait via Rectangle Plein Vert
    PORTRAIT avec Gris et Noir => brodure Grisee
    Rectangle_Plein x1=40 y1=40 x2=80 y2=80 COLOR_YELLOW
    DrawRectangle x1=80 y1=140 x2=160 y2=220 COLOR_INDIGO
    DrawCircle 150,100,40, COLOR_TURQUOISE
    DrawCircle 140,110,42, COLOR_INDIGO
    DrawCircle 130,120,44, COLOR_ORANGE
    FillCircle 100,180,30, COLOR_RED

    Taille Font
    TerminaL6x8 = 677
    Set Font.
    Param Font :
    cfont.width= 6 , cfont.height= 8 , cfont.nbrows= 1 , cfont.MaxC= 40
    Ecritures sur LCD
    Close Font TerminaL6x8
    Taille Font
    TerminaL12x16 = 2405
    cfont.width= 12 , cfont.height= 16 , cfont.nbrows= 2 , cfont.MaxC= 18
    Draw Font#2 PAULFJUJO at 0,148
    PAULFJUJO@free.fr Close Font TerminaL12x16
    Taille Font Trebuchet_MS16x23= 1279
    cfont.width= 16 , cfont.height= 23 , cfont.nbrows= 3 , cfont.MaxC= 15
    Draw Font#5 18 cars at 6,200
    123456789012345678 Close Font Trebuchet_MS16x23
    Taille Font
    NI7SEG26x35 = 1708
    cfont.width= 26 , cfont.height= 35 , cfont.nbrows= 5 , cfont.MaxC= 9
    Draw Font#8 at 0,240
    123456789 Close Font
    NI7SEG26x35le 130,120,44, COLOR_ORANGE
    FillCircle 100,180,30, COLOR_RED


    librairies utilisées :
    _Lib_Math.mcl" "
    _Lib_MathDouble.mcl" "
    _Lib_System.mcl" "
    _Lib_Delays.mcl" "
    _Lib_CType.mcl" "
    _Lib_CString.mcl" "
    _Lib_CStdlib.mcl" "
    _Lib_MemManager.mcl" "
    _Lib_Conversions.mcl" "
    _Lib_PPS_2xK42.mcl" " ................................. utilisé par SPI1 !
    _Lib_UART_Remappable_K42_83.mcl" "
    _Lib_SPI_Remappable_K42.mcl" ............... SPI1 Advanced
    _Lib_Delays.c
    _Lib_MemManager.c

    ressources :
    Used RAM (bytes): 771 (9%) Free RAM (bytes): 7399 (91%) .. c'est faux .. compter 7399 - 2560 !
    HEAP RAM (bytes): 2560 HEAP RAM (bytes): 2560
    Used ROM (bytes): 34429 (26%) Free ROM (bytes): 96643 (74%)

    ATTENTION : la valeur du Heap n'est pas mémorisée dans le fichier config du Projet !



    voir aussi :
    Test Ecran LCD TFT OPEN-SMART 2,4P, 320x240, Tactile, liaison SERIE ! (15/10/2021)




    ../common/GIF/mylogo_CI.gif

     

     

    paulfjujo@free.fr


    Retour à l'index general