• version 0.0
    11/01/2018
    rev 19/01/2018

    Test Ecran LCD couleur 176x220 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.
    je me suis fait roulé !

    Back view Front view 3 types de fonte 6x8,12x16 et 16x21

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

    Hardware :

    Vcc alim PIC= 3,6 à 5V
    Sortie RA4 sur Led rouge --2,2K--+VCC
    #define _RS LATC1_bit //Command (RS=0) Parameter (RS=1)
    #define _CS LATC2_bit // Chip Select
    #define _SDI LATC5_Bit // MOSI
    #define _CLK LATC3_Bit // SCK
    #define _LED 0 // entre LED du LCD connectée au +VCC via R=2,7K
    Liaison UART1 : Affichage sur Terminal .. (avec option: Reception de commande via Clavier)

    Prototype:

    images/t_LCD_176x200_ILI9225_Proto_180117.gif


    RB7 et RB6 reste libres pour l' ICSP
    MCLR au +Vcc via 6,8K et au ICSP Vpp
    pour Usage avec Pickit2
    RC6 = sortie Tx UART 19200,8,N,1-> Cordon PROLIC TTL/USB -> PC
    RC7 =RX pour recevoir les commandes claviers .. se terminant toujours par un <CR>

    Connectique et Schema :

     
    hardware tres simple !  


    Utilisation du SPI1 Hardware du Pic 18F26K22.



    RC4 SDI (ou MISO) coté MCU n'est pas utilsée.

    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
    d'ou la configuration :
    // Control pins
    #define _RST LATC0_bit
    #define _RS LATC1_bit //Command (RS=0) Parameter (RS=1)
    #define _CS LATC2_bit // Chip Select
    #define _SDI LATC5_Bit // MOSI
    #define _CLK LATC3_Bit // SCK



    Software :

    Compilateur MikroC 7.10.

    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.


    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 poiuoir les utiliser en RAM, il faudra donc, au prealable , 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%)




    Une autre façon de gerer l'espace serait d'utiliser la librairie FLASH
    et 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

    Une 3em façon serait d'utiliser l'EEPROM du PIC, pour mettre une (petite) Font ( terminal6x8 =>677 bytes)
    Ou carrement, une EEPROM Extern genre 24FC1026 ,pour mettre les 3 Fontes et d'autres..

    une 4em façon: Carte SD
    interressant pour les fontes 7segment, en differentes tailles, , ou en matrice de point

    Reste ensuite à comparer les vitesses d'execution et faire des des compromis : le plus rapide sera toujours en RAM !

    Bibliotheque ILI9225 :

    Je n'ai trouvé aucune LIB , disponible pour PIC ! tout est basé sur 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..
    Pas evident avec mon LCD TFT acheté en RPC , avec AUCUN MARQUAGE .
    La face arriere étant differente des autres modeles touvés sur le WEB., je n'étais as sûr du type de LCD
    J'y ai passé pas mal d'heures , surtout à cause des fontes ..
    L'essentiel des fonctions sont OK., mais il reste des Bugs


    Fonctions disponibles :

    void TFT_Init(void);
    void Clear_TFT(void);
    void Invert(char flag);
    void SetBackgroundColor(uint16_t color); //= COLOR_BLACK);
    void SetOrientation(uint8_t orientation);
    void SetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
    void SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
    void SetTextColor(uint16_t c) ;
    uint16_t SetColor(uint8_t red, uint8_t green, uint8_t blue);
    uint8_t GetOrientation(void);
    void SetFont( unsigned char * font);
    uint16_t maxX2(void);
    uint16_t maxY2(void);

    void DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
    void DrawPixel(uint16_t x1, uint16_t y1, uint16_t color);
    void DrawText(uint16_t x, uint16_t y, char * s, uint16_t color); // = COLOR_WHITE);
    unsigned char DrawChar(uint16_t x, uint16_t y, unsigned char ch, uint16_t color);
    void FillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
    void DrawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
    void Swaping(uint16_t a, uint16_t b);

    void OrientCoordinates(uint16_t x1, uint16_t y1);
    void _writeRegister(uint16_t r, uint16_t d);
    void _writeData(uint8_t HI, uint8_t LO);
    void _writeData16(uint16_t W);
    void _writeCommand(uint8_t HI, uint8_t LO);
    void _spiWriteCommand(uint8_t c);



    Projet complet en MikroC Pro registered V 7.1.0

    LCD_rouge_2-2P_176x220_SPI_ILI9225_180112.zip .
    _
    18F26K22_SPI_LCD_ILI9225_180113.c
    TFT_ILI9225_SPI_2018.c


    Result Dialogue terminal RS232 :

    (sans le Debug des fontes)




    Video :
    LCD_176x220_65Kcolor_SPI_18F26K22_2018.webm


    Liens et docu, utilisés pour ce projet :
    Nkawu_TFT_22_ILI9225_Wiki_GitHub.html
    ILI9225B_DS_V0.5.pdf
    https://os.mbed.com/users/Arman92/code/ILI9225_SPI_TFT/file/e97881aef140/TFT_22_ILI9225.h/

    Video : LCD_176x220_65Kcolor_SPI_18F26K22_2018.

    Rajout fontes 7 segment grande taille.

    //18-01-2017 rajout fontes
    (#1) Taille Font TerminaL6x8 = 677 cfont.MaxC= 25
    (#2) Taille TerminaL12x16 = 2405 cfont.MaxC= 14
    (#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
    (#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
    (#9) Taille SevenSegNumFont_32x50 =2605 cfont.MaxC = 5

    _18F26K22_SPI_LCD_ILI9225_DS18B20_180119.c
    TFT_Fonts_2018.h
    18F26k22_Test_LCD_Rouge_SPI_180119.hex

    images/t_LCD_176x200_ILI9225_test_Fontes_7Seg.gif






    Fonctions Graphiques à debugger

    * Drawline .. OK dans le sens X , mais limitée dans le sens Y autour de 200?*
    alors qu'avec une commande via DrawPixel , la hauteur totale (219) est parcourue
    *Rectangle : les lignes verticales ne sont pas tracées ? alors que FillRectangle est OK..
    *FillCircle .. rien . mais DrawCircle ..OK
    * Est-ce vraiment un modele ILI9225 176x220 ?



    Envoyer vos remarques, suggestions,ameliorations, modifications ....

     

    paulfjujo@free.fr


    Retour à l'index general