"Not enough RAM" dans mikroC

Résolu
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   -  
 loupius -
Bonjour,

Comme l'indique le titre du sujet, je travaille sur mikroC, dans le but de programmer un PIC. Cependant, lorsque je veux compiler, il me dit qu'il n'y a pas assez de RAM. Or je trouve que mon programme n'est pas très long comparé aux grands programmes que j'ai déjà vu.
Quelqu'un aurait il une solution ? Je travaille sur un PIC P16F887A et voici le code :




void main()
{
unsigned char e = 3;
unsigned char premiere = 0;
unsigned char deuxieme = 0;
unsigned char troisieme = 0;
unsigned char quatrieme = 0;

unsigned int codeEnVigueur = 1234;
unsigned int premiereP = 0;
unsigned int deuxiemeP = 0;
unsigned int troisiemeP = 0;
unsigned int quatriemeP = 0;
unsigned int total = 0;
char i = 0;

Glcd_Init(&PORTB, 0,1,2,3,5,4, &PORTD);
Glcd_Fill(0);
Glcd_Set_Font(FontSystem5x8, 5, 8, 32);



ADCON1 = 0b00000110;
TRISA = 0b11111111;
TRISB = 0b11111100;
while(1)
{
Glcd_Write_Text("Il vous reste", 0, 0, 1);
Glcd_Write_Text(e, 0, 1, 1);
Glcd_Write_Text("essai", 3, 1, 1);

if(e == 0)
{
Glcd_Write_Text("Serrure bloquée pour 10 secondes", 0, 0, 1);
Delay_ms(10000);
}
else
{
if(i < 4)
{
Glcd_Write_Text("Saisir code!", 0, 0, 1);
}



switch (i)
{
case 0:

while(i != 1)
{
if (PORTA.F0==1)
{
premiere = 0;
i++;
}

else if(PORTA.F1 == 1)
{
premiere = 1;
i++;
}
else if(PORTA.F2 == 1)
{
premiere = 2;
i++;
}
else if(PORTA.F3 == 1)
{
premiere = 3;
i++;
}
else if(PORTA.F4 == 1)
{
premiere = 4;
i++;
}
else if(PORTA.F5 == 1)
{
premiere = 5;
i++;
}
else if(PORTA.F6 == 1)
{
premiere = 6;
i++;
}
else if(PORTA.F7 == 1)
{
premiere = 7;
i++;
}
else if(PORTC.F0 == 1)
{
premiere = 8;
i++;
}
else if(PORTC.F1 == 1)
{
premiere = 9;
i++;
}
}
break;

case 1:

while(i != 2)
{
if (PORTA.F0 == 1)
{
deuxieme = 0;
i++;
}

else if(PORTA.F1 == 1)
{
deuxieme = 1;
i++;
}
else if(PORTA.F2 == 1)
{
deuxieme = 2;
i++;
}
else if(PORTA.F3 == 1)
{
deuxieme = 3;
i++;
}
else if(PORTA.F4 == 1)
{
deuxieme = 4;
i++;
}
else if(PORTA.F5 == 1)
{
deuxieme = 5;
i++;
}
else if(PORTA.F6 == 1)
{
deuxieme = 6;
i++;
}
else if(PORTA.F7 == 1)
{
deuxieme = 7;
i++;
}
else if(PORTC.F0 == 1)
{
deuxieme = 8;
i++;
}
else if(PORTC.F1 == 1)
{
deuxieme = 9;
i++;
}
}
break;

case 2:

while(i != 3)
{
if (PORTA.F0 == 1)
{
troisieme = 0;
i++;
}

else if(PORTA.F1 == 1)
{
troisieme = 1;
i++;
}
else if(PORTA.F2 == 1)
{
troisieme = 2;
i++;
}
else if(PORTA.F3 == 1)
{
troisieme = 3;
i++;
}
else if(PORTA.F4 == 1)
{
troisieme = 4;
i++;
}
else if(PORTA.F5 == 1)
{
troisieme = 5;
i++;
}
else if(PORTA.F6 == 1)
{
troisieme = 6;
i++;
}
else if(PORTA.F7 == 1)
{
troisieme = 7;
i++;
}
else if(PORTC.F0 == 1)
{
troisieme = 8;
i++;
}
else if(PORTC.F1 == 1)
{
troisieme = 9;
i++;
}
}
break;

case 3:

while(i != 4)
{
if (PORTA.F0 == 1)
{
quatrieme = 0;
i++;
}

else if(PORTA.F1 == 1)
{
quatrieme = 1;
i++;
}
else if(PORTA.F2 == 1)
{
quatrieme = 2;
i++;
}
else if(PORTA.F3 == 1)
{
quatrieme = 3;
i++;
}
else if(PORTA.F4 == 1)
{
quatrieme = 4;
i++;
}
else if(PORTA.F5 == 1)
{
quatrieme = 5;
i++;
}
else if(PORTA.F6 == 1)
{
quatrieme = 6;
i++;
}
else if(PORTA.F7 == 1)
{
quatrieme = 7;
i++;
}
else if(PORTC.F0 == 1)
{
quatrieme = 8;
i++;
}
else if(PORTC.F1 == 1)
{
quatrieme = 9;
i++;
}
}
break;
}
}
}

premiereP = premiere*1000;
deuxiemeP = deuxieme*100;
troisiemeP = troisieme*10;
quatriemeP = quatrieme*1;
total = premiereP + deuxiemeP + troisieme + quatriemeP;
e--;


if(total == codeEnVigueur)
{
Glcd_Write_Text("Code OK", 0, 0, 1);
Glcd_Write_Text("Ouverture gache.", 0, 1, 1);
PORTB.F1 = 1;
Delay_ms(5000);
PORTB.F1 = 0;
}


}

23 réponses

loupius
 
Je ne connais pas le 'mikroC', mais je trouve ton code un peu lourd et à la limite de la lisibilité. Ne pourrait-on pas simplifer:
case 0:
  while(i != 1)
  {
    if (PORTA.F0==1)
    {
      premiere = 0;
      i++;
    }
    else if(PORTA.F1 == 1)
    {
      premiere = 1;
      i++;
    }

  ...

    else if(PORTA.F7 == 1)
    {
      premiere = 7;
      i++;
    }
    else if(PORTC.F0 == 1)
    {
      premiere = 8;
      i++;
    }
    else if(PORTC.F1 == 1)
    {
      premiere = 9;
      i++;
    }
  }
  break;
par quelque chose du genre:
case 0:
  int valBit, valPort;  // à déclarer avant le switch
  while (1)
  {
    if ( (valPort = PORTA) != 0)
      for (premiere=0,valBit=1; premiere<8; premiere++, valBit<<=1)
        if (valPort & valBit)
          break;
    if ( (valPort = (PORTC & 3) != 0)
      for (valBit=1; premiere<10; premiere++, valBit<<=1)
        if (valPort & valBit)
          break;
  }
  i = 1;
  break;
En espérant que ce code est compatible avec 'mikroC' et que cela puisse t'aider...
1
loupius
 
Si j'ai bien compris, dans le while, tu attends jusqu'à trouver un bit à '1', tu veux en connaître la position. Je n'avais pas lu tout le code et comme tu fais x fois la même chose, il faut faire une fonction (j'ai modifié quelques petites choses et je préfère le code suivant.)Je mets 2 fois le même code car avec les commentaires ce n'est pas facile à lire:
unsigned char attendTouche (void)
{
  unsigned char valPort;
  while (1)
  {
    if ( (valPort = PORTA) != 0)  // valPort enregistre la valeur de PORTA, pour ne pas le relire sans cesse et n'exécutera la boucle seulement si au moins 1 bit est à '1'
      for (position=0; position<8; position++, valPort>>=1)  // Boucle pour les 8 bits, >>=1 décale valPort de 1 bit vers la droite
        if (valPort & 1)  // Test si le bit de droite est non nul
          break;  // Si oui, on sort de la boucle
    if ( (valPort = (PORTC & 3) != 0)  // On ne conserve que les 2 bits de droite afin de ne pas être pollué par les 6 bits de gauche
      for (position=8; position<10; position++, valPort>>=1)
        if (valPort & 1)
          break;
  }
  return (position);
}

unsigned char attendTouche (void)
{
  unsigned char valPort;
  while (1)
  {
    if ( (valPort = PORTA) != 0)
      for (position=0; position<8; position++, valPort>>=1)
        (valPort & 1)
          break;
    if ( (valPort = (PORTC & 3) != 0)
      for (position=8; position<10; position++, valPort>>=1)
        if (valPort & 1)
          break;
  }
  return (position);
}
Il faudra donc modifier le 'switch' de la manière suivante:
switch (i)
{
  case 0:
    premiere = attendTouche();
    break;
  case 1:
    deuxieme = attendTouche();
    break;
  case 2:
    troisieme = attendTouche();
    break;
  case 3:
    quatrieme = attendTouche();
    break;
}
if (++i > 4)
  i = 0;
total = 1000*premiere + 100*deuxieme + 10*troisieme + quatrieme;  // A tester et si ça ne marche pas il faudra déclarer premiere, deux... en int
 
Tu as oublié certaines choses:
- tu ne gères pas le 'i', j'ai mis un exemple mais ce n'est peut-être pas ce qui convient,
- tu gères mal le 'e', tu le décrémentes toujours; alors que se passe-t-il lorsque 'e' atteint la valeur '0',
- je pense qu'il faudrait donner un temps maximum entre 2 touches et réinitialiser si ça tarde trop ou si l'utilisateur à abandonné.
Bon courage.
1
loupius
 
J'ai oublié de mettre : unsigned char position
D'ailleurs s'il fallait retourner un entier, on aurait:
unsigned int attendTouche (void)
{
  unsigned int position;
...
  return (position);
}
avec bien sûr:
unsigned int premiere, deuxieme, troisieme, quatrieme;
il est inutile de les initialiser.
0
loupius
 
Je connais bien les PIC, mais c'est 'mikroC' que je ne connais pas.
En lisant le port en entier et en l'épluchant bit par bit, cela revient au même, sauf que dans ton cas on va lire 8 fois le port ce qui est plus couteux en temps et en octets; si une touche est enfoncée, le port ne sera plus nul et on peut alors chercher quel bit est à '1'.
Tu oublies aussi que les touches rebondissent, il faut gérer une tempo après relêchement de la touche.
pour ce qui est de 'i', tu ne réinitialise pas...
J'avais bien vu le rôle de 'e', mais il va bien falloir à un moment ou un autre, repartir en mettant 'e' à 3.
1
loupius
 
Je veux bien t'aider mais je ne vais pas écrire tout le programme.
Je vais t'expliquer le principe pour obtenir le n° du bouton enfoncé.
Supposons 8 boutons connectés sur le port A du PIC dont le 3ème est enfoncé.
Je lis le port A; je vais donc obtenir : valPort = 0b00000100.
Comme valPort est différent de 0, je vais éplucher le port, c'est-à-dire le tester bit à bit.
valPort & 1 donnera l'opération suivante: 0b00000100 &(ET binaire) 0b00000001 soit 0b00000000
-> test n° 1: résultat nul donc ce n'est pas le bon bouton.
Je décale 1ère fois valPort à droite, donc valPort = 0b00000010
valPort & 1 donnera l'opération suivante: 0b00000010 &(ET binaire) 0b00000001 soit 0b00000000
-> test n° 2: résultat nul donc ce n'est pas le bon bouton.
Je décale 2ème fois valPort à droite, donc valPort = 0b00000001
valPort & 1 donnera l'opération suivante: 0b00000001 &(ET binaire) 0b00000001 soit 0b00000001
-> test n° 3: résultat non nul donc le bouton n°3 est enfoncé.
Voilà c'est tout simple; il ne faut pas faire plus de 8 tests (et encore on n'est pas obligé de tester car on est sûr de trouver au moins un bit à '1') et il suffit de compter les tests pour avoir le n° du bouton (évidemment on corrige suivant que l'on veuille que le premier bouton porte le n° '0' ou le n° '1').
Bon courage.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
j'ai résolu mon probleme, tout à l'air de marcher, je testerai lundi, en le transférant vers la PIC =)=)

Merci beaucoup pour ton aide jusqu'à maintenant, je te suis infiniment reconnaissant, beaucoup aurait laissé tombé avant ...Vraiment chapeau

Deux dernieres questions, qui seront les dernières :

1) La tempo de 500ms est elle suffisante à ton avis pour annihiler les rebonds ?
2) avec quel commande pourrait on réaliser l'abandon en cas de durée trop importante d'une saisi ?
1
loupius
 
Les deux dernières questions... avant les prochaines:
- La durée de la tempo est variable suivant les boutons; souvent entre 50 et 100 ms est une valeur correcte (si la valeur n'est pas assez importante, le bouton sera pris plusieurs fois en compte). Après avoir attendu que les rebonds sont terminés, il faut attendre le ralâchement du bouton sinon celui-il sera pris en compte une autre fois.
- Il n'y a pas de commande; il faut, dans la boucle d'attente, incrémenter une variable et une certaine valeur (à calculer en fonction de la durée de la boucle) atteinte décider de réinitialiser la saisie.
Nota: J'aurais bien aimé savoir comment l'erreur a été résolue.
Bon courage.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Ok merci beaucoup d'avoir répondu, mais bon, je ne m'y connais pas trop en programmation, pourrais-tu expliquer ce que ton code fait, enfin quel étape il suit je ne suis pas sur de tout comprendre =S

Tant qu'il est en C, il sera compatible ;)
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
oui je vois bien, mais bon, je pense que comme tu connais pas les PIC, tu peux pas vraiment voir ...

*tout ce qui est PORTA.F0, PORTA.F1 ...correspond à un bouton donc il y en a 8, donc on peux pas "juste" tester le port A en général, ça n'a pas de sens, il faut regarder tour à tour si un des boutons est appuyé

* le "i" est destiné à gérer en même temps, le nombre de touche saisies (ça ne doit pas excéder 4) et en même temps la position du bit dans le nombre final.
le "e" quand à lui, gère le nombre d'essai qu'on à le droit... si <3 on peux encore essayer, si >3 on a plus le droit on bloque la serrure.
enfin l'idée du temps est intéressante, j'y avait pensé, une idée de la manière de procéder


En tout cas, merci pour ton aide, et c'est gentil de "suivre l'affaire" et pas simplement de donner une petite réponse sans suite =)=)
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Bonjour

Pourrais tu réécrire ton code, mais complet si possible que je puisse le tester, et en même temps m'expliquer ce que font tes commandes, notamment les choses inscrites comme conditions des if avec les "&" etc

Merci beacoup d'avance.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
ok, merci de ta réponse, elle m'a aidé. Je remets ci-après, le code que j'ai recomplété.
Il y a des erreurs, sur la partie de code que tu m'as donné. je ne vois pas où? Tu pourrais m'aider.
Au fat, quel logiciel utilise tu pour compiler-débugger- et envoyer vers le PIC ?
Enfin, t'as proposition de décompte pour genre si la personne abandonne, je ne vois vraiment pas comment faire

Encore merci pour toute ton aide.
voici le code :


unsigned char position, valPort, i=0, premiere, deuxieme, troisieme, quatrieme, e=3;
int total=0, codeEnVigueur=1234;


unsigned char attendTouche (void)
{
unsigned char valPort;
while (1)
{
if ( (valPort = PORTA) != 0)
for (position=0; position<8; position++, valPort>>=1)
(valPort & 1)
break;
if ( (valPort = (PORTC & 3) != 0)
for (position=8; position<10; position++, valPort>>=1)
if (valPort & 1)
break;
}
return (position);
}





void main()
{

Glcd_Init(&PORTB, 0,1,2,3,5,4, &PORTD);
Glcd_Fill(0);
Glcd_Set_Font(FontSystem5x8, 5, 8, 32);

while(1)
{

Glcd_Write_Text("Il vous reste " 0, 0, 1);
Glcd_Write_Text(e, 0, 15, 1);
Glcd_Write_Text("essais" 0, 20, 1);

if(e == 0)
{
Glcd_Fill(0);
Glcd_Write_Text("Serrure bloquée pour 1 minute", 0, 0, 1);
Delay_ms(60000);
Glcd_Fill(0);
e=3;
}



Glcd_Write_Text("Saisir le code!", 0, 0, 1);


switch (i)
{
case 0:
premiere = attendTouche();
Delay_ms(500);
i++;
break;
case 1:
deuxieme = attendTouche();
Delay_ms(500);
i++;
break;
case 2:
troisieme = attendTouche();
Delay_ms(500);
i++;
break;
case 3:
quatrieme = attendTouche();
Delay_ms(500);
i++;
break;
}

if (i == 4)
{
total = premiere*1000 + deuxieme*100 + troisieme*10 + quatrieme*1;
}


if (total == codeEnVigueur)
{
Glcd_Write_Text("Code OK! Ouverture serrure.", 2, 0, 1);
i=0;
PORTB.F0 = 1;
Delay_ms(5000);
PORTB.F0 = 0;
else
{
Glcd_Write_Text("Le code est faux", 2, 0, 1);
i=0;
e--;
}
}
}
}




-------------------------------------------

Cordialement
0
loupius
 
J'avais vu qu'il y avait une erreur de recopie/
while (1)
{
  if ( (valPort = PORTA) != 0)
    for (position=0; position<8; position++, valPort>>=1)
      (valPort & 1)  // Ligne erronée lors suppression commentaires
        break;
  if ( (valPort = (PORTC & 3) != 0)
    for (position=8; position<10; position++, valPort>>=1)
      if (valPort & 1)
        break;
}
Je pensais que tu avais corrigé
while (1)
{
  if ( (valPort = PORTA) != 0)
    for (position=0; position<8; position++, valPort>>=1)
      if (valPort & 1)
        break;
  if ( (valPort = (PORTC & 3) != 0)
    for (position=8; position<10; position++, valPort>>=1)
      if (valPort & 1)
        break;
}
Nota: Il faut utiliser les balises 'code'.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
MikroC (logiciel que j'utilise pour compiler) m'indique plein de fautes dans ta partie de code, il ne doit pas connaitre.
Quel logiciel utilises-tu ?
0
loupius
 
Mais je n'utilise pas de logiciel particulier!
Tu m'as dit 'réponse n° 2):Tant qu'il est en C, il sera compatible ;); alors j'ai écris un bout de programme compatible C standard, c'est tout; jusqu'ici j'ai toujours programmé les PIC en assembleur.
En utilisant les balises 'code' (il y a les balises: gras, italique, souligné, code et lien) et en numérotant les lignes du programmes, pourrais-tu donner la fonction 'attendTouche' avec les erreurs associées?
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
                                           unsigned char position, valPort, i=0, premiere, deuxieme, troisieme, quatrieme, e=3;
int total=0, codeEnVigueur=1234;


unsigned char attendTouche (void)
{
  unsigned char valPort;
  while (1)
  {
    if ( (valPort = PORTA) != 0)
      for (position=0; position<8; position++, valPort>>=1)
       if (valPort & 1)
          break;
    if ( (valPort = (PORTC & 3) != 0)
      for (position=8; position<10; position++, valPort>>=1)
        if (valPort & 1)
          break;
  }
  return (position);
}





void main()
{

           Glcd_Init(&PORTB, 0,1,2,3,5,4, &PORTD);
           Glcd_Fill(0);
           Glcd_Set_Font(FontSystem5x8, 5, 8, 32);

while(1)
{

      Glcd_Write_Text("Il vous reste " 0, 0, 1);
      Glcd_Write_Text(e, 0, 15, 1);
      Glcd_Write_Text("essais" 0, 20, 1);

      if(e == 0)
      {
           Glcd_Fill(0);
           Glcd_Write_Text("Serrure bloquée pour 1 minute", 0, 0, 1);
           Delay_ms(60000);
           Glcd_Fill(0);
           e=3;
      }



Glcd_Write_Text("Saisir le code!", 0, 0, 1);


switch (i)
{
  case 0:
    premiere = attendTouche();
    Delay_ms(500);
    i++;
    break;
  case 1:
    deuxieme = attendTouche();
    Delay_ms(500);
    i++;
    break;
  case 2:
    troisieme = attendTouche();
    Delay_ms(500);
    i++;
    break;
  case 3:
    quatrieme = attendTouche();
    Delay_ms(500);
    i++;
    break;
}

if (i == 4)
{
total = premiere*1000 + deuxieme*100 + troisieme*10 + quatrieme*1;
}


if (total == codeEnVigueur)
{
          Glcd_Write_Text("Code OK! Ouverture serrure.", 2, 0, 1);
          i=0;
          PORTB.F0 = 1;
          Delay_ms(5000);
          PORTB.F0 = 0;
else
{
    Glcd_Write_Text("Le code est faux", 2, 0, 1);
    i=0;
    e--;
}
}
}
}





------------------------------------------

Les erreurs sont les suivantes

Ligne 14 : ")" expected but for found
Ligne 15 : internal error (3 fois présente sur la même ligne =S=)
Ligne 15 : result is not defined: attendTouche




Merci
0
loupius
 
if ( (valPort = (PORTC & 3) != 0)
3 ouvrantes et 2 fermantes, évidemment il faut mettre:
if ( (valPort = (PORTC & 3)) != 0)
Après comme le compilateur est perdu, il met souvent n'importe quoi; il faut 'toujours' commencer par chercher à corriger la première erreur.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Merci beaucoup, c'est vrai j'avais pas vu cette faute. Je les ai toutes corrigées => toujours pas assez de RAM dispo...comment faire ? Qu'est-ce qui prend encore de la RAM ? =S
0
loupius
 
Je ne sais pas mais je me demanderais si le bon PIC a été déclaré. Je suppose que quelque part on doit donner cette indication au compilateur. Y-a-t-il un projet ?
Si le code donné à la réponse n° 13 est complet, il n'y a apparemment rien d'autre qui puisse faire déborder la RAM.
As-tu déjà compilé un programme plus simple ?
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
J'ai Réduit un peu mes messages affichés sur le GLCD, et recompilé. Je pense que c'était ça, les chaines de caractères prennent beaucoup de place.

Ensuite pour la tempo, je vais réfléchir cette nuit (lol) il suffit je pense, pour pas qu'on compte le bouton plusieurs fois de faire un boucle qu'on ne passe pas, tant qu'on a pas relâché le bouton, cela me semble réalisable

Je réfléchirai aussi pdt cette nuit, à cette histoire d'abandon, mais elle me semble plus délicate, et peut être pas obligatoire à mon niveau, avoir

Merci, désolé de faire tellement "durer" ce sujet :$
0
loupius
 
C'est bizarre, vu la taille de la mémoire flash. Ne planquerait-il pas les chaînes de caractères dans l'EEPROM qui est limitée à 256 caractères ?
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Je ne peux pas te répondre, je ne m'y connais pas assez dans ce domaine.
Mais pour l'instant ça à l'air de passer niveau taille, on verra demain comment il réagi dans le PIC
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Le programme ne marche pas, je ne comprends pas =S

Pourrai tu relire attentivement le code que j'ai poster plus haut, et repérer les erreurs éventuelle :$

Je suis désespéré, je sais plus quoi faire, pour moi il devrait marcher !!: s

merci
0
loupius
 
Que ça ne marche pas... ça ne m'étonne pas!
Avec les PIC, les programmes marchent rarement du premier coup. Il va falloir que tu commences par un programme plus simple.
D'abord, afficher quelque chose ( par exemple une chaîne) sur l'afficheur.
Puis ajouter une tempo et changer l'affichage toutes les 3 secondes (par exemple un chiffre qui s'incrémente).
Même chose, remplacer la tempo par l'appui sur une touche...
Et ainsi de suite, tu arriveras à écrire ton programme. Avec ton PIC, tyu peux faire 100 000 essais (soit 30 essais par jour pendant 10 ans... j'espère que tu auras trouvé avant ! ;-) ).
Mais au fait, il doit y avoir un simulateur avec ton mikroC; alors là c'est facile de suivre le déroulement du programme (suivre la valeur des variables et le déroulement des boucles).
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
non pas de simulateur, mais c'est la galère moi il me le faut rapidement. Je pensais que ta partie de code était sur :s:s
0
loupius
 
Si, si, j'ai chargé 'mikroC_manual.pdf' et s'il n'existe pas un simulateur au sens sémantique, il existe le debugger qui exerce le même rôle.
Donc à toi de jouer ;-)
Quant à la partie de code qui ne serait pas sûre, il est vrai que je ne l'ai pas testée n'ayant pas le logiciel adéquat; toutefois il faudrait savoir où se situe l'erreur.
Bon courage.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
ça fait quelque jours, tu te croyais débarrasser de moi...eh non

Dans un code que j'ai trouver, il y a un ligne:
ADCON1 = 0b00000110; // Toutes les broches A fonctionnent en logique


Elle m'est indispensable, mais j'aimerais l'étendre aux broches C...
J'ai essayer un peux tout les trucs qui me sont passés par la tête sans succès !

connaitrais tu le code exact ?
0
loupius
 
Etre débarrassé... oh non (voir post n° 18), ce n'était pas dans mes espérances! ;-)
Ah il faut toujours passer trop de temps à décoder les questions...
ADCON gère le CONvertisseur Analogique-Digital et ceci ne concerne que 14 canaux: une partie des ports A, B et E - rien sur les ports C et D.
Que signifie 'étendre aux broches C', d'autant plus qu'avec la valeur donnée 'ADCON1 = 0b00000110', la conversion A/D est inhibée ???
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Et bien, si j'enlève cette ligne mon code plante.

En faite pour revenir sur du concret, les touches de mon clavier utilisent le port A et C en entier.
Donc il faudrait aussi que ce port C soit en logique...

Mais dans mon cas, est-ce absolument indispensable ? je parle dans le cas d'une récupération du la touche du clavier ?
Sais tu comment ecrire la valeur d'une chaine de caractère sur le LCD ?
LCD_Out_Cp(1,1,une);   //  'une' étant => const char une[] = "Saisir code !"


Merci
0
loupius
 
Je ne vois pas ce qu'apporte cette ligne ADCON1 = 0b00000110;; le bit 0 est mis à '0' (ce qui invalide l'analogique), mais au Reset ce bit est mis à '0'...
Quant au port C il est par défaut en entrée logique (TRISC est à FF comme pour les autres ports donc en entrée). Si tu veux mettre en sortie, il faut modifier TRISC (comme tu as fait pour TRISB).
Sais tu comment ecrire la valeur d'une chaine de caractère sur le LCD ?
Il suffit de lire la doc. J'ai regardé mais je ne dois pas avoir la même car les fonctions sont du type Lcd... et non Glcd...
Nota: dans la doc, on trouve de quoi gérer des touches (Keypad)
0
loupius
 
J'ai trouvé. Tu utilises un afficheur graphique; Alors il y a quelque chose qui ne va pas:
Glcd_Init(&PORTB, 0,1,2,3,5,4, &PORTD);
Glcd_Fill(0);
Glcd_Set_Font(FontSystem5x8, 5, 8, 32);
TRISB = 0b11111100;

Dans la définition:
- void Glcd_Init (unsigned char *ctrl_port, char cs1, char cs2, char rs, char rw, char rst, char en, unsigned char *data_port);
Donc ctrl_port, est PORB et cs1 est bit0 et cs2 est bit1 et ... bit0 et bit1 sont en sortie -> donc OK. Par contre, rs et rw et rst et en sont les bits 2,3,5,4 et sont en entrée ce qui ne peut aller! A vérifier quand même sur la doc de l'afficheur.
Ah je ne comprends plus:
- dans le post 1: tu utilises Glcd...
- dans le post 28: tu utilises Lcd....
Quel est l'afficheur que tu utilises? Les afficheurs classiques (à base de HD44780) ne sont pas graphiques. Pour les graphiques il en existe avec plusieurs contrôleurs (2 types sont utilisables avec miKroC).
0
loupius
 
A la réflexion, je pense qu'en toute logique, mais ça reste à prouver, 'Glcd_Init' doit gérer la direction des bits du port concerné; par conséquent, il ne faut sans doute pas y toucher après avoir appelé 'Glcd_Init'.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Non j'ai décidé d'afficher sur le LCD, il me suffit =)

Mais le problème, c'est que en écrivant le texte directement après un 'LCD_OUT(1,1, "exemple de texte")' ça prend énormément de place, et je retombe sur mon problème originel, à savoir : pas assez de RAM.

Le problème est courant j'ai vérifié, et la solution est de mettre le texte qu'on veut écrire dans une 'cont char txt[] = "exemple de texte"' mais après je ne sais pas que fonction appeler pour lire cette chaine de caractère. Visiblement 'LCD_Out_Cp' n'est pas la bonne...

Merci
0
loupius
 
D'après la doc, tu peux utiliser:
- LCD_Out_Cp ("exemple de texte");
ou
- const char txt[] = "exemple de texte"
- LCD_Out_Cp (txt);
ou
- char* txt = "exemple de texte"
- LCD_Out_Cp (txt);

Ceci doit donner le même résultat; mais peut-être stocke-t-il les variables dans des zones différentes ?

Pour 'Lcd_Out', c'est pareil sauf qu'il faut préciser l'emplacement d'écriture.
0
handballeur68 Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   28
 
Oui mais justement, ça retourne une erreur (cf post N°28)

Oui l'avantage de stocker le texte dans une chaine de caractère, c'est que en la mettant en 'const' il le stocke en ROM et non en RAM, ce qui libère un peu de place, qui me serait utile pour faire tourner mon programme
0
loupius
 
Je ne sais pas comment il stocke ses variables (il faut faire des essais), mais à sa disposition il a:
- 368 octets de RAM,
- 256 octets d'EEPROM,
- 8 k octets de ROM Flash (moins le programme).
En assembleur il est possible de stocker des chaînes dans la ROM Flash, mais avec mikroC je ne sais pas si c'est possible.
0