Programmation PIC18f2525

Résolu/Fermé
Manue971 - 8 sept. 2010 à 09:41
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 8 sept. 2010 à 14:33
Bonjour,

Mon programme fonctionne avec un pic 18f2525 doit afficher des angles à partir d'un capteur. J'ai réalisé déjà toute la partie acquisition, affichage et mesure des angles et je sauvegarde les mesures dans l'EEPROM. Le programme enregistrement et affichage des valeurs contenues dans l'EEPROM fonctionne. Mon problème se situe plus au niveau de l'écran LCD en fait. Je souhaite faire défiler le texte de gauche a droite parce que je n'ai pas réussi à faire afficher les valeurs une à une quand je demande l'affichage il m'affiche toutes les valeurs contenue dans l'EEPROM les une à la suite des autres.
J'ai vu su le net qu'il existait une bibliothèque XLCD avec déjà toutes ces fonctions mais je n'arrive pas à reprogrammer celle qui permet de faire défiler le texte. Je suis obliger de la reprogrammer parce que comme je reprend un code existant et que la personne à recréer une bonne parties des fonctions contenues dans cette bibliothèque de ce que j'ai pu voir alors je dois moi aussi la reprogrammer.

voila mon code pour enregistrer les valeurs

char valeur_lue=0;
unsigned int compteur_valeur=0;
int adresse_debut;
void enregistrer_valeur_dans_eeprom (void)
{
extern ram volatile int valeur_angle_afficheur;
extern ram volatile int valeur_angle_afficheur_1;
extern ram volatile int valeur_angle_afficheur_2;
int taille_chaine_tampon2=0,i ;
char tampon2[19];
unsigned int compteur_eeprom=0;


sprintf(tampon2,"V%d=%d-%d-%d/",compteur_valeur,valeur_angle_afficheur_1,valeur_angle_afficheur_2,valeur_angle_afficheur);
do
{
valeur_lue=eeplit(compteur_eeprom);
adresse_debut=compteur_eeprom;
compteur_eeprom++;
}while(valeur_lue!='a');
taille_chaine_tampon2 = strlen(tampon2);
for( i=0;i<=taille_chaine_tampon2;i++)
{
eepecr(adresse_debut+i,tampon2[i]);
}
compteur_valeur++;
}

Voici celui qui permet d'afficher les valeurs contenues dans l'
eeprom:


int afficher_valeur(int argc,char **argv)
{

unsigned int compteur_tampon3=0;
int taille_chaine_tampon3=0;
char tampon3[100];
int adresse_debut=0x00;

do{
valeur_lue=eeplit(adresse_debut);
if(valeur_lue!='a')
{
do{
valeur_lue=eeplit(adresse_debut);
adresse_debut++;
tampon3[compteur_tampon3]=valeur_lue;
compteur_tampon3++;
}while(valeur_lue!='/');
}
taille_chaine_tampon3 = myStrlen(tampon3);
sprintf(ligne_test,"%s",tampon3);
EcritUneLigne_LCD_MODE_4_BITS(ligne_test,deuxieme_ligne);
Delay10KTCYx(200); // 1s
Delay10KTCYx(200); // 1s
adresse_debut++;
}while(valeur_lue!='a');

}

merci pour votre aide :-)

4 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
8 sept. 2010 à 10:06
J'avais fait un vieux code pour ca en VB... le principe est le suivant (dsl, je peux pas tester le code ici):
char texte = "voici le texte a faire defiler car il sort de l'ecran";
unsigned short index.
unsigned short taille_texte = strlen(texte);
while (true)
{
  for (index = 0; index <  taille_texte; index++)
      EcritUneLigne_LCD_MODE_4_BITS(texte + index); 
}


comme tu le vois, j'y vais en gros bourin, au leiu de passer la ligne, je passe la ligne avec un décalage d'index... ca crain rien du tout, par contre le compilo risque de te mettre un warning, ou tu risques d'avoir à faire un transtypage. Si il y a des modifications en temps réel de la taille de la ligne de texte, il faudra améliorer un peu le code ....
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
8 sept. 2010 à 10:07
si tu comprends mieu cette notation, on doit aussi pouvoir passer

&texte[index];
0
En fait le texte a afficher n'est pas statique parce ce sont des mesures d'angles
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
8 sept. 2010 à 10:52
2 solutions: soit tu t'arranges pour que la taille de ta chaine ne change pas (genre tu affiches toujours tes angles dans le meme format: 030.2° => dans ce cas je pense qu'une réécriture de la chaine en live est possible ... (au pire a la plasse du zero tu peux mettre des espaces, si besoin tu rajoutes un mutex lors du changement pour pas avoir de "bavure"), soit tu regénères la chaine uen fois que la ligne a fini de défiler...

avec mon code, le texte doit etre totalement sorti de l'écran pour commenser à se réafficher. On peut faire un meilleur défilement, genre la phrase qui se répète à l'infini sans se retrouver avec un écran quasi vide à aucun moment, mais ca pompera plus de mémoire, et necessitera plus d'opérations... a toi de voir si tu as du rab au niveau de la mémoire programme et de la RAM ... (il faudrai prévoir un 2° buffer ayant la taille de l'écran pour faire simple. Avec les fonctions que j'utilisais à l'époque (home made) => pas besoin de 2° mémoire car je n'écrivais pas ligne par ligne... mais bon, t'es peut être pas à 50 octets pret !
0
merci j'ai adapté le premier programme que tu m'a donné et sa fonctionne à merveille merci beaucoup

a+
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
Modifié par Nabla's le 8/09/2010 à 14:35
y a pas de quoi ...
u de ces 4 c'est ptetre moi qui te demanderai de l'aide: faut vraiment que je me mette à la programmation des PIC !

Je met ton sujet en résolu
0