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.
Soucis de Prog
Modérateur : Modérateur
Le soucis a été réglé :
« Vr = (Var*100)/1024 ; »
« 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 ;