flothehacker
Messages postés3Date d'inscriptionmercredi 9 mai 2007StatutMembreDernière intervention 3 février 2008
-
1 févr. 2008 à 17:38
flothehacker
Messages postés3Date d'inscriptionmercredi 9 mai 2007StatutMembreDerniè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'...
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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).
flothehacker
Messages postés3Date d'inscriptionmercredi 9 mai 2007StatutMembreDerniè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é.
flothehacker
Messages postés3Date d'inscriptionmercredi 9 mai 2007StatutMembreDerniè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.