Conversion décimal

flothehacker Messages postés 3 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 3 février 2008 - 1 févr. 2008 à 17:38
flothehacker Messages postés 3 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 3 février 2008 - 3 févr. 2008 à 10:12
Bonjour,
Je vais essayer d'être le plus clair possible.
En fait j'ai un projet qui vise à récupérer une tension d'un capteur de rotation à envoyer sur un CAN d'une carte de développement de chez STelectronics (DK3300).
Après paramètres et autre initialisations, je met les contenus des registres ADAT0 et ADAT1 dans un buffer nommé : char nb_degre [3].
ensuite j'affiche ce buffer : printfLCD(nb_degre).
pas de souci, résultat : 100  -> c'est qui veut dire que je tourne le capteur de 360° , la valeur hexa vaut 0x100 donc 256 en décimal...

Maintenant, place au problème!
Je doit afficheur sur mon afficheur 2x16 la valeur en degré.
d'abord je passe ma valeur hexa (0x100) en décimal avec un petit algorithme trouvé sur le net ( nb_buffer[2] + (16* nb_buffer[2] + 16*( nb_buffer[0]*16) il me semble).
Pour finir je fait  (*360 / 256) pour me donner la valeur en degré. cette nouvelle variable s'appelle "new_degre" par exemple.
je devrai donc avoir 360 sur mon afficheur.

quand je lance un printfLCD("nombre en degré %w",new_degre), cela m'affiche 168 au lieu de 360. remarque : 0x168 est la valeur hexa de 360!

notes : la fonction printfLCD est toute faite dans le kit de développement et je n'ai à ma disposition lors des paramètres d'affichage que %d   %x  %w

J'ai fait pas mal de test, dont un avec Dev-C++ et là ca marche, miracle!
mais pas avec mon compilateur fourni avec le kit ( Uvision 3).

j'ai essayé d'autre chose, comme mettre ma valeur "new_degre" en int, mais rien l'affiche m'affiche lentement des '0' ou des '1'...

Voilà qu'en pensez vous?

Merci d'avance

4 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
2 févr. 2008 à 16:42
Ben c'est peut-être ta fonction printfLCD qui affiche en hexa; dans ce cas tu dois convertir ta valeur pour que, par exemple si tu souhaites afficher 360 (décimal), faudrais alors passer à printf la valeur 360 (hexa ce coup-ci).
0
flothehacker Messages postés 3 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 3 février 2008
2 févr. 2008 à 21:11
Oui, j'ai pensé aussi à cette solution, mais je ne me retrouve pas dans ce sous-programme "printfLCD" pour pouvoir afficher en décimal et non en hexa.
voici ce sous-programme, si vous trouver l'endroit où cela pose problème ca serait génial!

void printfLCD(unsigned char *ptr, ...)

{

unsigned char c1,c2;

unsigned int c3;

//unsigned char *var_ptr=&ptr+1;

unsigned char var;

unsigned char orig_buscon;

#ifdef __RC51__ //use ANSI stdarg

va_list var_ptr;

va_start(var_ptr,0);

#else

unsigned char *var_ptr=&ptr+1;

#endif

orig_buscon = BUSCON; // Save buscon value

BUSCON |= 0x3C; // Set Xdata Read/Write to max wait states

 

if(ulayer >3) //if page exceed the range 0 to 3,force it to 0.

ulayer = 0;

while (*ptr != NULL)

{

c1 = *ptr;

c2 = *(ptr+1);

c3 = c1;

c3 = (c3<<8)|c2;

if(c1 <= 128) // deal with asc code , if c1<=128 ,it will deal with asc code,otherwise Chinese word.

{

if ( *ptr == '\r')

{

ptr++;

ucol = 0;

}

else if( *ptr == '\n')

{

ptr++;

ucol = 0;

ulayer++;

}

else if( *ptr == '%')

{

ptr++;

if (*ptr == 'd')

{

ptr++;

#ifdef __RC51__ //use ANSI stdarg

var = *var_ptr--;

var_ptr--;

#else

var = *var_ptr++;

#endif

c1 = (var & 0x0F)+'0';

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

}

else if (*ptr == 'x')

{

#ifdef __RC51__ //use ANSI stdarg

var = *var_ptr--;

var_ptr--;

#else

var = *var_ptr++;

#endif

c1 = htoa_hi(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

c1 = htoa_lo(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

ptr++;

}

else if (*ptr == 'w')

{

ptr++;

#ifdef __RC51__ //use ANSI stdarg

var_ptr--;

var = *var_ptr;

#else

var = *var_ptr++;

#endif

c1 = htoa_hi(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

c1 = htoa_lo(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

#ifdef __RC51__ //use ANSI stdarg

var_ptr++;

var = *var_ptr;

var_ptr-=2;

#else

var = *var_ptr++;

#endif

c1 = htoa_hi(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

c1 = htoa_lo(var);

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

}

else

{

c1 = *ptr;

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

ptr++;

}

}

else

{

disp_one_asc(ucol,ulayer,c1,mode);

ucol+=7;

ptr++; // one asc need one byte in computer system

}

}

#ifdef ENGLISH_CHINESE_FONT

else //deal with Chinese, if c1<=128 ,it will deal with asc code, otherwise Chinese word.

{

if(mode)

disp_one_ch(ucol,ulayer,c3,1);

else

disp_one_ch(ucol,ulayer,c3,0);

ucol+=16; //16*16 Chinese dot matrix

ptr += 2; //one Chinese word need two byte in computer system

}

#endif

}

BUSCON = orig_buscon; // Restore buscon value

}

c'est long je sais, et je vous en remercie si vous avez tout regardé.

F.Pierru
Etudiant Master 2 Electronique Instrumentation Photonique
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 févr. 2008 à 23:27
Pour afficher en décimal, on utilise %d
printfLCD("nombre en degré %d",new_degre)

C++ (@++)<!--
0
flothehacker Messages postés 3 Date d'inscription mercredi 9 mai 2007 Statut Membre Dernière intervention 3 février 2008
3 févr. 2008 à 10:12
le problème est que %d m'affiche très lentement des "0". pourtant j'ai tenté de mettre ma variable en int, et autre.
Il n'y a qu'avec %w que je m'approche le mieux du résultat.
mon but est de comprendr le programme ci-dessus et ainsi tenter de déboger le truc et le refaire à ma sauce.

F.Pierru
Etudiant Master 2 Electronique Instrumentation Photonique
0
Rejoignez-nous