Piklab et LCD

Bonjour, comme vous pouvez le voir je suis toujours sur debian.

Je me remets à vous, car pour mes programmations de PIC j’utilise piklab que je trouve très bien.
Mais depuis peu je me suis lancé sur les afficheurs LCD, mais cela se passe bien si l’on considère qu’il faut tout paramétrer.

Voici mon problème. Je récupère une valeur qui et convertie de l’analogique en numérique dans une variable, que je nomme valeur.
Ce que je veux, c’est afficher le résultat obtenu sauf que je ne sais pas comment la convertir en ASCII pour que l’afficheur l’accepte.

Je vous joins tous le code désolé si c’est long, mais comme ça vous pouvez mieux voir.
Le problème est tout en bas, a c’est endroits.

LCD_ECRIRE_CHAINE(valeur ,7);

il faudrait convertir la valeur en ASCII
J’ai testé plein de choses, mais ce qui est étrange c’est quand je programme en c et que j’utilise une fonction comme:

nbr = strlen("Bonjour");

comme substr.

Il ne reconnaît pas substr bien que #include <string.h> soit présent.
Avez-vous une idée?

/* ----------------------------------------------------------------------- */
/* Fichier source modèle généré par Piklab */
#include <pic16f876.h>
#include <string.h>
#include <math.h>

/* ----------------------------------------------------------------------- */
/* Bits de configuration: adapté à votre dispositif et à vos besoins */
typedef unsigned int word;
word at 0x2007 CONFIG = 0x3F39;

//word at 0x2007 CONFIG = _RC_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF & _CP_OFF;

#define LCD_LIGNE_1         0x80    // Adresse ligne 1  
#define LCD_LIGNE_2         0xC0    // Adresse ligne 2  
#define LCD_LIGNE_3         0x94    // Adresse ligne 3  
#define LCD_LIGNE_4         0xD4    // Adresse ligne 4  

// Declaration des h
void antirebond(void);
void Pause(int duree);
void LCD_INITIALISATION(void);
void LCD_INIT_8_BITS(void);
void LCD_EFFACER(void);
void LCD_RETOUR_HOME(void);
void LCD_ECRIS_VALEUR(int valeur);
void LCD_ECRIS_COMMANDE(char mot);
void LCD_ECRIS_LETTRE(char mot);
void LCD_ECRIRE_CHAINE(char *chaine, int nb_caracteres);


// Debut programme

void antirebond(void)
{
	Pause(500);
}

void Pause(int duree)
{
	int boucle;
	boucle = 0;

	while(boucle < duree)
	{	
		boucle++;
		TMR0 = 0;
	}
}

// Lance la procedure d'initialisation
void LCD_INITIALISATION(void)
{
// Regle en mode 8 bits plusieurs fois de suite pour etre sur
LCD_INIT_8_BITS();
Pause(300);
LCD_INIT_8_BITS();
Pause(300);
LCD_INIT_8_BITS();
Pause(300);

// Regle le curseur nombre de ligne et format
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = 0b00111000;
	RC2 = 0;
	Pause(800);

// Pas de curseur
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = 0b00001100;
	RC2 = 0;
	Pause(800);

// Retour en haut a gauche
LCD_RETOUR_HOME();
Pause(300);

// efface
LCD_EFFACER();
Pause(300);
}

// Initialise l'afficheur sur 8 bits
void LCD_INIT_8_BITS(void)
{
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = 0b00110011;
	RC2 = 0;
	Pause(200);
}

// Efface le texte et place le curseur au debut
void LCD_EFFACER(void)
{
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = 0b00000001;
	RC2 = 0;
	Pause(100);
}

// Renvois le curseur au debut sans effacer
void LCD_RETOUR_HOME(void)
{
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = 0b00000010;
	RC2 = 0;
	Pause(100);
}

// Ecris une valeur 
void LCD_ECRIS_VALEUR(int valeur)
{
	PORTB = 0;
	RC2 = 1;
	RC0 = 1;
	RC1 = 0;
	PORTB = valeur;
	RC2 = 0;
	Pause(50);
}

// Envois une commande a l'afficheur
void LCD_ECRIS_COMMANDE(char mot)
{
	PORTB = 0;
	RC2 = 1;
	RC0 = 0;
	RC1 = 0;
	PORTB = mot;
	RC2 = 0;
	Pause(50);
}

// Ecris un caractere
void LCD_ECRIS_LETTRE(char mot)
{
	PORTB = 0;
	RC2 = 1;
	RC0 = 1;
	RC1 = 0;
	PORTB = mot;
	RC2 = 0;
	Pause(50);
}

// Ecris une chaine ascii
 void LCD_ECRIRE_CHAINE(char *chaine, int nb_caracteres)
 {
     int u;
     for (u=0;u<nb_caracteres;u++)
     {
         LCD_ECRIS_LETTRE(chaine[u]);
     }
 }

void main()
{
	
	int temps;
	unsigned int valeur;

	TRISA = 0xFF;  // 1 = Entree 0 = Sortie
	TRISB = 0x00;
	TRISC = 0x10;

	OPTION_REG = 0xC7; // reglage option temps
	TMR0 = 0; // Mise a 0

	ADCON1 = 0x80; // config entree A/D 0x06 Dig 0x80 analogique

	PORTA = 0x00; //etat des pattes 
	PORTB = 0x00; // tous etaint
	PORTC = 0x00;

	temps = 0;
	valeur = 0;

	TMR0 = 0;

	// Initialisation de l'afficheur
	Pause(3000);
	LCD_INITIALISATION();
	LCD_ECRIRE_CHAINE("Initialisation OK",17);
	Pause(5000);
	LCD_EFFACER();
	Pause(3000);
	LCD_ECRIS_COMMANDE(LCD_LIGNE_1);				// Ce place a la premiere ligne
	LCD_ECRIRE_CHAINE("Bonjour",7);					// Envois le texte
	LCD_ECRIS_COMMANDE(LCD_LIGNE_2);
	LCD_ECRIRE_CHAINE("Resultat:",9);

	while (1)
	{	
		if (TMR0 >= 250)
		{
			TMR0 = 0;
			temps++;
		}

		if (temps >= 8) // mise a jour environ toutes les 1/2 second
		{
			temps = 0;

			ADCON0 = 0xC5; // Reglage du port a controler demarrage test
			//ADCON1 = 0x80; // Reglage decodeur sur 8 bits a droite

			valeur = ADRESH;	// recuperation
			valeur <<= 8;		// des valeurs
			valeur |= ADRESL;	// analogique
			
			LCD_ECRIS_COMMANDE(LCD_LIGNE_4);		// Ce place a la ligne 4
			LCD_ECRIRE_CHAINE(valeur ,7);
		}

	}
}


:006

Je suis une bille en C mais quand tu teste ton strlen tu déclare bien le type de nbr avant ? Genre :

int nbr = strlen("Bonjour");

et pour :

LCD_ECRIRE_CHAINE(valeur ,7);

Cela sous entend donc que ta chaine valeur fera toujous 7 caractères de long ou que tu veux afficher seulement les 7 premiers. Est ce bien le cas ?

Et puis je suis pas sur que ceci soit valide :

void LCD_ECRIRE_CHAINE(char *chaine, int nb_caracteres)
…LCD_ECRIRE_CHAINE(valeur ,7);

Attend la solution de quelques expert C ici présent sinon pose ta question dans un forum spécialisé

Bonjour, bon voilà le problème vient du fait qu’avec piklab les librairies comme string.h ne sont pas prises en compte en tout cas chez moi j’ai du créer la fonction strlen voici le code:

int strlen(char *texte) 
{
	int nbr;
	nbr=0;
	while (texte[nbr]!=0)
	{
		nbr++;
	}
	return(nbr);
}

Avec cette fonction et la modification de mon code, cela va mieux.
Mais mon plus gros souci c’est la conversion de la valeur reçue par le convertisseur A/D
exemple:
Si ma valeur = 876 moi je veux convertir 876 en chaine soit "876"
donc je dois découper en 3 se qui fait “8” “7” “6”.
Mais 8 dec en ASCII cela fait 56 dec.

Après mes recherches il semble qu’il faut crée la table ASCII a peut près de cette façon:

const char code[256] =
{ // code ascii
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 'a', '&', 0, 0, 0, 'w', 's', 'q', 'z', 0x82, 0, 
0, 'c', 'x', 'd', 'e', 0x27, '"', 0, 0, ' ', 'v', 'f', 't', 'r', '(', 0, 
0, 'n', 'b', 'h', 'g', 'y', '-', 0, 0, 0, ',', 'j', 'u', 0x8A, '_', 0, //30 à 3F
0, ';', 'k', 'i', 'o', 0x85, 0x87, 0, 0, ':', '!', 'l', 'm', 'p', ')', 0, 
0, 0, 0x97, 0, 0x5E, '=', 0, 0, 0, 0, 0x0D, '$', 0, '*', 0, 0, 
0, '<', 0, 0, 0, 0, 0x08, 0, 0, '1', 0, '4', '7', 0, 0, 0, 
'0', '.', '2', '5', '6', '8', 0x1B, 0, 0, '+', '3', '-', '*', '9', 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 'A', '1', 0, 0, 0, 'W', 'S', 'Q', 'Z', '2', 0, 
0, 'C', 'X', 'D', 'E', '4', '3', 0, 0, ' ', 'V', 'F', 'T', 'R', '5', 0, 
0, 'N', 'B', 'H', 'G', 'Y', '6', 0, 0, 0, '?', 'J', 'U', '7', '8', 0, 
0, '.', 'K', 'I', 'O', '0', '9', 0, 0, '/', 0, 'L', 'M', 'P', '°', 0, 
0, 0, '%', 0, 0, '+', 0, 0, 0, 0, 0x0D, 0x9C, 0, 0xE6, 0, 0, 
0, '>', 0, 0, 0, 0, 0x08, 0, 0, '1', 0, '4', '7', 0, 0, 0,
'0', '.', '2', '5', '6', '8', 0x1B, 0, 0, '+', '3', '-', '*', '9', 0, 0, 
};

Il me reste à voir si cela passe dans piklab car je ne sais pas si cela n’arrive qu’a moi, mais pleins de fonctions semble ne pas être prise en compte bien qu’en placent les headers.

Bref je sais que ce forum est pour debian mais j’ai beau chercher je n’ai pas vu de forum specialement reservé a piklab sauf en anglais a part de passer sur mplab ou autre compatible linux sans wine.

Merci.