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.
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:
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 :
Utilisation du SPI1 Hardware du Pic 18F26K22.
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.
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:
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
Test Calibration du Touch Screen
(via liaison MSSP SPI)
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
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
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 SPIavec 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
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)