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

Travailler sur le TAS, c'est mieux ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 13 janv. 2018 16:20

Bonjour à tous,

Ce post suite à une mise en service laborieuse d'un LCD TFT 176x220 non identifié ( ILI9225 par deduction)

Préambule:

Lorsqu'on s'attaque aux LCD Grafiques, il faut gerer des fontes de caracteres, pour les textes (ou symboles)
qui sont alors dessinés , point par point
contrairement aux LCD texte genre 1602 qui ont leurs caracteres deja definis dans la ROM interne du LCD.
Fonte : table de bytes (octest) representant les caracteres ascii suivant un format donné
ex: Fonte6x8 6 pixels de large 8 pixel de haut => <= 8 bytes par caratere
Une Fonte represente normalement les 96 chars ascii

Sur les PIC18F On peut stocker les fontes
- en Flash Rom
- En EEPROm :
* L'EEPROM du PIC ne pouvant contenir qu'une fonte de petite taille ( 1K EEPROM)
* Ou alors utiliser une EEPROPM I2C externe genre 24FC1026
- en RAM .. necessite un "GROS PIC". ou ....
- Sur carte SD
.. etc..

L'ideal est d'avoir la Fonte de caractere en RAM, car c'est le moyen de traitement le plus rapide.

La Problematique :
Me voila confronté à utiliser 3 fontes pour mon afficheur LCD TFT 176x220 65K couleurs.
Fontes 6x8 .. 677 bytes ( 96 chars ascii)
Fonte 12x16 ..2405 Bytes ( 96 chars ascii)
Fonte 16x21 .. 642 bytes car uniquement pour les chiffres 0 à 9


Si situées en RAM, il faut 677+2405+642= 3724 bytes ... sur les 3875 que compte mon 18F26K22
Mais ça ne va pas, car j'ai besoin aussi de RAM par ailleur :
Buffer Uart =>80 bytes, TEXTE =>80 bytes , CRam1 =>32 bytes + autres variables

Elles seront donc stockées en FLASH ROM. (si la taille maximum du programme le permet)
Pour les utiliser , il faudrait, de préférence, les transférér en RAM .


1) soit utiliser la librairie FLASH :
permetant , par exemple de transferer les bytes d'un caractere donnée de la Fonte,
dans un espace de travail en RAM
L'avantage est que le besoin en RAM se limite à 32 bytes seulement ...(pour la fonte 16x21
L'inconvenient est une perte de vitesse de traitement. (voir exemple code, plus bas)

2) C'est là, qu'intervient la notion d'usage du TAS ou HEAP.
Lié à la gestion dynamique de memoire , via la librairie MemManager
Le principe est de definir une zone "No Man's land", appelé HEAP..
qui sera mis à la disposition d'un demandeur, qui devra ensuite libéré cet espace apres usage, pour un autre "locataire"..
De la location courte durée en sorte.

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.

Heap_size_reservation.jpg


Les 3 fontes sont definies dans l'espace Constant code ( en Memoire programe)
pour pouvoir 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 didactique. (code en bas de page)

La RAM dispo pour l'application,
sur les 3875 bytes que compte mon 18F26K22
passe alors à 3875 - 2410 = 1465 bytes

Attention aux valeurs données par la fenetre STATISTIQUES
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, Free Ram=3341 ..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%)

à remarquer: la zone en jaune (HEAP)

Statistiques_Summary.jpg


======================================
Usage du transfert FLASH -> RAM

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=..

Code : Tout sélectionner


L1
=TerminaL12x16++ ('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, 0x00,0x00// lettre A
=================================================
La solution que j'ai retenu:
selection et usage de fonte via le TAS

Code : Tout sélectionner


void Select_Font_Type
(int Type)
{
   switch(Type)
   {
    case 1:
      {
      Print_Cte_String(" Taille Font TerminaL6x8 = " );
      km=sizeof(TerminaL6x8) ;
      WordToStr(km,CRam1);
      UART1_Write_Text(CRam1); CRLF1();
      pp= (unsigned char *) Malloc(km);
      for (i=0;i<km;i++)  *(pp+i)=TerminaL6x8[i];
      SetFont(pp);
      Param_Font();
      break;
      }
     case 2:
      {
       Print_Cte_String(" Taille Font TerminaL12x16 = ");
       km=sizeof(TerminaL12x16) ;
      WordToStr(km,CRam1);
      UART1_Write_Text(CRam1); CRLF1();
      pp= (unsigned char *) Malloc(km);
      for (i=0;i<km;i++)  *(pp+i)=TerminaL12x16[i];
      SetFont(pp);
      Param_Font();
      break ;
      }
     case 3:
      {
       Print_Cte_String(" Taille Font Trebuchet_MS16x21= ");
      km=sizeof(Trebuchet_MS16x21) ;
      WordToStr(km,CRam1);
      UART1_Write_Text(CRam1); CRLF1();
      pp= (unsigned char *) Malloc(km);
      for (i=0;i<km;i++)  *(pp+i)=Trebuchet_MS16x21[i];
      SetFont(pp);
      Param_Font();
      break;
      }
     defautlt:
     {
      UART1_Write_CText("Ereur choix font \r\n");
      Delay_1sec();
      }
    }
  }

void Close_Font_Type(int Type)
{
switch(
Type)
   {
    case 1:
      {
      Print_Cte_String(" Close Font TerminaL6x8\r\n" );
      km=sizeof(TerminaL6x8) ;
      FreeMem(pp,km);
      break;
      }
     case 2:
      {
       Print_Cte_String(" Close Font TerminaL12x16\r\n");
       km=sizeof(TerminaL12x16) ;
       FreeMem(pp,km);
      break ;
      }
     case 3:
      {
       Print_Cte_String(" Close Font Trebuchet_MS16x21\r\n");
      km=sizeof(Trebuchet_MS16x21) ;
       FreeMem(pp,km);
      break;
      }
     defautlt:
     {
      UART1_Write_CText("Erreur close font \r\n");
      Delay_1sec();
      }
     }
  }


utilisé de cette façon

Code : Tout sélectionner



UART1_Write_CText
("Init Memory Manager \r\n");
  MM_Init();
  //This function is used to determine total free memory size.
  L1=MM_TotalFreeMemSize();
  LongWordToStr(L1,CRam1);
  UART1_Write_CText("Total RAM Free = ");
  UART1_Write_Text(CRam1); CRLF1();
  // largest available free memory block for the Heap.
  L1=MM_LargestFreeMemBlock();
  LongWordToStr(L1,CRam1);
  UART1_Write_CText("Max Free bloc memoire = ");
  UART1_Write_Text(CRam1); CRLF1();
  UART1_Write_CText("Allocation de 2410 bytes pour les fonts \r\n ");
  ....
  
  Clear_TFT
();
   Font_Active=1;
   Select_Font_Type(Font_Active);
   Draw_CText(1,1,"1234567890123456789012345",COLOR_CYAN);
   .....
   
   Close_Font_Type 
(Font_Active);
  Font_Active=2;
  Select_Font_Type(Font_Active);
  Print_Cte_String("Drawtext BIG at 20,20\r\n" );
  strConstRamCpy(buffer1,"ABCDEFGHIJKLMN");
  DrawText(16, 80, "A B C D E F G H", COLOR_YELLOW)
   ...
   
   Close_Font_Type
(Font_Active);
    Font_Active=3;
  Select_Font_Type(Font_Active);
  strConstRamCpy(buffer1,"01234567890");
  DrawText(1, 170,buffer1, COLOR_RED);
  Delay_1sec(); Delay_1sec();
  Close_Font_Type(Font_Active);



Si vous etes interessé ce LCD TFT, probablement avec un ILI9225 .. Lien ICI
Res te quelques bugs à corriger , aide appréciée..
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités