Programmation PIC18f2525
Résolu
Manue971
-
Nabla's Messages postés 20731 Statut Contributeur -
Nabla's Messages postés 20731 Statut Contributeur -
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 :-)
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 :-)
A voir également:
- Programmation PIC18f2525
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation binaire - Guide
- Programmation vb - Télécharger - Langages
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
4 réponses
J'avais fait un vieux code pour ca en VB... le principe est le suivant (dsl, je peux pas tester le code ici):
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 ....
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 ....
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 !
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 !
&texte[index];