Page 1 sur 1

Soucis de Prog

Publié : 27 févr. 2007 15:17
par Makia
Bonjours a tous .
J'utilise une carte EsayPic 4 avec le compilateurs Mikroc et le µc 16F877A .
Je souhaite simplement faire varier une variable ( dsl pour le jeux de mots ^^ ) en fonction du CAN.
Le CAN est sur 10 bits donc il renvoit une valeur entre 0 et 1024.
Moi je veut simplement faire varier ma variable de 0 à 100 .
Voici mon programme:
/////////////////////////////////////////////////////////////////////////

void main()
{
char Vr ;
char txt[6];
int Var;
OPTION_REG = 0x80;
ADCON1 = 0x82;
INTCON = 0;


LCD_Init(&PORTD);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Cmd(LCD_CLEAR);

Var = Adc_Read(2);

Vr = (Var*100)/1024 ;

WordToStr(Vr,txt);

LCD_Out(1,1,txt);

}

}
/////////////////////////////////////////////////////////////////////////

Lors de la conversion ( 0 - 1024) à ( 0-100) "Vr = (Var*100)/1024 ;" je visualise sur un Affciheur 2x16 le résulat de la convertion.
La conversion est normal jusqu a 31 mais au dela de 31 il se passe une chose assez bizard, la valeur visualiser passe directement a 225 ,puis incrémente jusqu'a 255 , puis repart a 0 et incrémente de nouveaux.
Pour etre plus claire voici se que j'obtien en faisant varier le CAN de 0 a 5v
(0 à 31) => (225 à 255) => (0 à 31)=>(225 à 255)
Je ne vois pas comment je peut avoir se résultat avec le culcule que je fais ...
Si quelqu'un peut m'eclairer svp .
Merci.

Publié : 27 févr. 2007 19:53
par nanick
bonjour,
Vr = (Var*100)/1024 ;
dans cette ligne de code, vr est un char et le résultat (var*100)/1024 donne un résultat de type int.
il doit manqué une commande de convertion de type.

du genre Vr=(char) (Var*100/1024);

à essayer.

A+.

Publié : 28 févr. 2007 13:01
par Makia
Le soucis a été réglé :
« Vr = (Var*100)/1024 ; »
En C, le compilateur ne surclasse pas automatiquement les type de variables :

Var est de type int : il peut prendre une valeur de -32768 à 32767, il y a donc un dépassement de capacité car (Var*100) sera évalué également en int alors que le résultat peut prendre des valeurs de 0 à 102400 et nécessite un long pour être stocké.

Si tu utilises déjà dans une autre partie du programme des variables de type long, ou si tu dois conserver absolument toute la précision, il suffit de déclarer Var en long (ou mieux en unsigned long)

Sinon si tu ne veux pas inclure la librairie long, tu peux conserver Var en int (ou mieux unsigned int) et écrire :

Vr = (Var*10)/102 ;