Cherche explication bug TFT ILI9325 et MEGA2560

Hello ! C’est encore moi ^^

Suite à ce topic:

[RESOLU] Problème avec PROGMEM

Me revoilà avec mon souci qui m’a poussé à écrire ma propre méthode pour afficher des images.
Ce souci me trotte dans la tête en continue et j’aimerai comprendre pourquoi cela fait cela comme bug.

Le code et les fichiers nécessaires sont en pièce jointe à ce message.

Le matériel utilisé:
Arduino MEGA2560 + TFT 320*240 avec controller ILI9325

Le soft:
Arduino IDE 1.8.5

Le problème en détail et en étapes:

  • Dans le sketch .ino, si j’affiche une seule image, celle en ligne 30, et que je commente les lignes 31,32,33; l’affichage sur le TFT n’a aucun souci.
  • Je décommente la ligne 31, afin d’afficher successivement 2 images; aucun souci.
  • Je décommente la ligne 32, afin d’afficher successivement 3 images; La première image est bugguée, les 2 autres sont OK.
  • je décommente la ligne 33, afin d’afficher successivement 4 images; et là ce sont les images 1 & 2 qui partent en couille.

Je n’arrête pas de me demander pourquoi ça déconne, et ça me perturbe pour continuer; car j’aime bien tout comprendre et là je sèche ^^

C’est pour ça que sur mon précédent sujet j’étais partis avec un souci avec PROGMEM ^^

Donc, quelqu’un ici présent saurait-il pourquoi ça bug ?

Problème sur mon programme ?
Problème sur la librairie ?
Problème hardware ?

:roll_eyes:

testprogmem.zip (31.8 KB)

Je peux pas lire le zip sur mon mobile mais si vous avez plusieurs images elles peuvent se retrouver hors mémoire « near » (pointeur 16 bits) et il faut les lire avec les fonctions « far » (genre pgm_read_word_far et pgm_get_far_address)

Notez que si vous définissez des éléments mais que vous ne les utilisez pas le compilateur a tout loisir de les virer Donc vous ne pouvez pas raisonner sur l’endroit de stockage des données en fonction de leur place de déclaration dans votre code - le compilateur est libre de gérer cela comme il veut

Hello !
Merci pour la réponse !
Une image pèse 0x2E18 soit 11800 dans le tableau.
Effectivement si le pointeur est un int…
Pourquoi le int dans arduino est-il si petit xD (je sais ca vient du compilateur il me semble :-/ )

Ninnin:
Pourquoi le int dans arduino est-il si petit xD (je sais ca vient du compilateur il me semble :-/ )

le microprocesseur de votre MEGA (ATmega2560) est 8 bits, pas 32 ou 64 bits :slight_smile: - travailler sur 16 bits ajoute donc déjà à la complexité. si vous prenez un processeur ARM et autre ESP vous aurez une architecture 32 bits et les int sont sur 32 bits. ce n’est donc pas le compilateur vraiment, mais plus le matériel qui guide ces contraintes

La norme en C impose qu’un char soit un byte défini comme étant la plus petite unité adressable en mémoire et donc sizeof(char) c’est 1 et un char c’est au moins 8 bits car la norme aussi impose des valeurs au moins entre -127 et 127. la norme impose aussi des tailles min pour les différents types

norme.png

Le bus de données est sur 8 bits et si vous regardez la doc page 14 en section 7.5.1 The X-register, Y-register, and Z-register vous verrez que les registres d’accès mémoire sont sur 16 bits

ATMEGA.png

Super l'info ! :) Merci !

Du coup dans mon cas, vaut mieux modifier la bibliothèque, ou créer un nouvel array lu avec FAR et le passer en paramètre ?

lire dans la partie haute (après 64k) est plus lent que lire dans la partie basse... il n'y a pas de solution miracle, idéalement il faudrait placer les données dans la partie basse mais ça veut dire sortir de ce que l'IDE fait pour vous...

vous pouvez lire cet article et la solution proposée par Carlos Lamas dans [url=https://www.avrfreaks.net/sites/default/files/morepgmspace.h]morepgmspace.h[/url] avec la macro GET_FAR_ADDRESS()

ça fait très longtemps que je n'ai pas joué avec donc à explorer...

Thanks, vais voir cette doc :)

Re.
Bon honnetement, je crois que c’est hors de mes capacités :-/
Au final pour mon projet, j’ai 51K de graphismes (déjà pas mal compressés/simplifiés…)
Il semble que quand je monte au delà de 36 ou 37% de stockage sur la flash, selon mes tests, les images commencent à déconner.
Certainement en rapport avec le post de J-M-L au dessus, que je remercie encore pour les infos qu’il a fourni ^^

Donc là je sèche, car même si je recode une blibliothèque perso comme je l’avais prévu je serai encore confronté au même souci :-/

Ce qui m’embête c’est que le reste du programme est quasi fini, et que… ben je pense avoir fait tout ça pour rien :s

Suis démotivé… need une corde les gars :’( !!! (et une poutre solide pour l’attacher , suis un peu en surpoid :stuck_out_tongue: )

Vous pouvez jeter un oeil sur ce post pour vous donner des idées

vous pouvez sinon prendre la méthode “bourrin” - si ça plante après avoir compilé, modifiez le read pour obtenir l’adresse far et faites la requête avec cette adresse

La corde n’est jamais la solution…

Toute façon elle supporterait pas mon poids la pauvre corde :p Merci pour le lien, j'y jette un œil demain, là j'ai perdu la journée avec ce souci, idem que hier quoi :-/ Ca démotive de rester coincer sur un problème quand le reste est fait et fonctionne (testé sans graphique, tout tourne nickel ça fou la rage....) Merci J-M-L ;)

Bon ben c'est pas faute d'avoir cherché et lu. J'y arrive pas. Ca fout les boules :'(