problème de ram avec SD + nokia5110 + gps -Résolu

bonjour,
Je suis en train d'essayer de me faire un "tracker gps", j'ai donc mis un œuvre un afficheur nokia 5110, un module gps et une carte SD, le tout piloté par un arduino mini pro.

Mais voila, je sait que mon problème est un grand standard de l'utilisation de la librairie SD, je suis à cours de mémoire vive...

j'ai déjà passé les quelques chaines de caractères affichées avec des Serial.println(F("xxx")) et viens de réaliser que ma table ASCII est déclarée comme suit :
static const byte ASCII[][5] =
{
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
......

j'avoue être "une quiche" en 'C' et imagine que ce tableau est logé en mémoire vive, si c'est le cas, est-il possible de le basculer en mémoire programme et comment ?

merci par avance

Bonjour,

petit post pour décrire ma fin de soirée et mon début de matinée :wink:

Pour gérer mon afficheur, je suis donc partie sur un sketch trouvé ici Tutoriels pour Arduino • Afficher le sujet - Ecran LCD Nokia 5110 interfaçage de l'afficheur avec Arduino

  • la table ASCII étais déclarée comme indiqué dans le §"origine", et gérée par la routine LcdCharacter qui suis, ça marchais tip-top, mais en occupant bien sur un max de RAM...

  • J'ai eu des comportements " curieux " et ai compris que j'avais des pb de RAM d'où mon premier post...
    en cherchant, j'ai trouvé PROGMEM qui semblais être la solution, j'ai alors modifié mon code comme ci-après (tentative 1),
    pas de problèmes de compil, ma ram passait de 200 à plus de 700, donc ok de ce coté là, mais résultat désastreux (n'affiche que des bouts de traits)
    j'imagine que la gestion d'index pose problème, mais j'avoue ne pas avoir compris pourquoi, certainement mauvaise utilisation...... :frowning:

  • après quelques nouvelles recherches, une fois de plus, le sîte de Skywodd est venu à mon secours, j'ai modifié ma table ASCII et ma routine en reprenant les siennes (tentative2) et réalisé qu'il ne gère visiblement pas d'index,
    et voilà que ça marche ! :slight_smile:

donc tout de bon, merci Skywodd, bien que frustré car pas vraiment compris l'astuce, là qu'on se rend compte qu'il y as encore du boulot....

merci à tous de faire vivre ce forum :slight_smile:

//----------------------------------------------------
// *********    ORIGINE      *************************

static const byte ASCII[][5] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
...
};

void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}



//----------------------------------------------------
// *********    TENTATIVE 1 *************************

PROGMEM prog_uchar ASCII[][5] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
...
};

void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
    LcdWrite(LCD_D, pgm_read_byte_near(ASCII[character - 0x20][index]));
   }
  LcdWrite(LCD_D, 0x00);
}



//----------------------------------------------------
// *********    TENTATIVE 2 *************************

PROGMEM prog_uchar ASCII[] = 
{
  0x00, 0x00, 0x00, 0x00, 0x00 // 20 
  ,0x00, 0x00, 0x5f, 0x00, 0x00 // 21 !
...
};
void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  unsigned int val = (character - 0x20) * 5; // 0x20 -> 1er caractéres de notre table ascii
  LcdWrite(LCD_D, pgm_read_byte_near(ASCII + val));
  LcdWrite(LCD_D, pgm_read_byte_near(ASCII + val + 1));
  LcdWrite(LCD_D, pgm_read_byte_near(ASCII + val + 2));
  LcdWrite(LCD_D, pgm_read_byte_near(ASCII + val + 3));
  LcdWrite(LCD_D, pgm_read_byte_near(ASCII + val + 4));    
  LcdWrite(LCD_D, 0x00);
}

Bonjour,

petit post pour faire appel à une âme charitable qui aurait un moment à perdre pour me conseiller...

mon projet est le suivant :
faire un module gps qui m'indique en temps réel ma position, l'heure et la date (accessoirement la vitesse), et qui sur basculement d'un bouton déclenche l'enregistrement de ces infos (toutes les minutes par ex) sur une carte SD pour ensuite pouvoir géotagger des photos (randos ou balade en mer).

le matos mis en jeux est : mini pro(328P), carte SD, module gps, écran nokia 5110

mais comme expliqué dans mon post d'hier, je bloque sur la ram.
Malgré les solutions déjà trouvées, il suffit que je "charge" un peu plus le prg ou autorise l'appel de la fonction "entete()" qui ouvre mon fichier sur la carte SD pour que ma RAM passe de 647octets à n'importe quoi avec plantage à la clé :frowning: :frowning:

pensez-vous qu'il s'agit d'un problème de codage, erreur de ma part ou le projet est-il trop ambitieux pour un ATMEGA328 ?

si le cas, je me vois pas avec une mega dans la poche, alors peut-être essayer le 1284 qui traine dans un coin ou peut-être partager la tache entre 2 mini pro relié en I2C ! :wink: :wink:

merci au courageux qui se sentirais de m'éclairer, là je sèche !

j'ose pas créer un nouveau fil, vous met mon code là-dessous, après une nuit et la journée dessus, là je vois plus rien... ! :frowning:

GPS_V3.ino (12 KB)

Il y aurait peut être moyen de gagner de la mémoire en supprimant softwareSerial. Il faudrait récupérer Serial pour la gestion du GPS ce qui permettrait de supprimer softwareSerial.
Je ne connais pas TyniGPS mais à l'examen de ton code j'ai l'impression que la liaison série n'est utilisée qu'en lecture (mais je peux me tromper) ce qui du coup n'interdirait pas d'utiliser la ligne TX de Serial pour envoyer des messages de debug vers un terminal.

Il y a aussi la carte arduino Teensy qui aura peut être plus de capacités :wink:

pas mal l'idée de supprimer softwareSerial, je m'interdis par principe d'utiliser les pins rx et tx pour pas faire de connerie, mais peut-être bien là l'occase d'essayer, histoire de grappiller qcq octets... :wink:
merci, j'essaie demain !

pour la Teensy, m'y étais jamais intéressé car pas vraiment de la famille arduino et pas suivie sur ce forum (logique ! :wink: ) et suis pas capable de faire une librairie, mais bluffé car les librairies que j'utilise sont là, le prix est pas délire, je note donc dans un coin pour quand j'aurais le temps d'essayer...

merci à vous, vous tiens au courant de la suite !

tout d'abord, merci pour votre coup de main ! :slight_smile:

en fait le problème étais une nouvelle fois le truc situé entre le clavier et l'écran.....
mon soucis provenait du fait que j'avais zappé l'importance de la tempo smartDelay utilisée avec la librairie,

j'avance donc, tout fonctionne et je génère maintenant un fichier .csv à la structure propriétaire, l'étape suivante est d'essayer de faire un fichier au format GPX et là, je coince sur un autre sujet, j'ouvre donc un autre fil...