Soucis de Prog

Electronique numérique / Circuits logiques programmables EPLD, CPLD, FPGA d'Altera ou de Xilinx VHDL, Verilog ou SystemC

Modérateur : Modérateur

Makia
NOUVEAU
NOUVEAU
Messages : 5
Inscription : 27 févr. 2007 15:13

Soucis de Prog

Message 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.

nanick
HABITUE
HABITUE
Messages : 70
Inscription : 28 mai 2006 12:53

Message 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+.

Makia
NOUVEAU
NOUVEAU
Messages : 5
Inscription : 27 févr. 2007 15:13

Message 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 ;

Répondre