Convertir une variable en constante

Fermé
joube31 Messages postés 1 Date d'inscription mardi 28 janvier 2014 Statut Membre Dernière intervention 28 janvier 2014 - 28 janv. 2014 à 09:03
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 - 28 janv. 2014 à 14:23
Bonjour,

je shouaite créer un tempo variable à l'aide d'une macro qui est fourni par mon IDE (MikroC) qui s'écrit :

delay_us (xx);

ou xx est ma valeur en us, mon problème est que xx doit être une constante et je ne peu donc pas écrire ceci car cela fait appel à une variable :


void command (char angle)
{

int a = 0;


a = angle;
a *=10:
a += 1000;

delay_us (a);
}

Ce calcul a pour but de convertir une position en % 0 à 100 et une impultion entre 1us et 2us

Un petitte idée pour "transformer" ma variable en constante ??

Merci


A voir également:

1 réponse

[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié par [Dal] le 28/01/2014 à 14:26
Salut joube31,

Tout d'abord, je n'ai jamais utilisé ce compilateur. Alors prend mon message avec une pincée de sel :-)

Une recherche Google donne la documentation de Delay_us pour ce compilateur pour PIC à la page suivante :

https://download.mikroe.com/documents/compilers/mikroc/pic/help/built-in_routines.htm

Son prototype est :
void Delay_us(const unsigned long time_in_us);


Note que c'est Delay_us et pas delay_us (majuscule initiale), et note aussi que c'est un
const unsigned long
qui doit lui être passé, et pas un
int
. Comme c'est une "built-in routine" du compilateur selon la doc (pas une macro comme tu le dis), que c'est du C non standard, le compilateur décide de son fonctionnement comme bon lui semble.

A tout hasard, tu pourrais tester de caster ta variable
Delay_us((const unsigned long)a);
et mettre en cohérence le type de
a
en le déclarant unsigned long.

Cependant, une hypothèse possible est que que quand la doc parle de "constante", elle veuille dire "constante littérale", comme semblerait l'indiquer l'exemple de code sous cette "built-in routine", qui est une constante littérale. Si c'est le cas, tu devrais certainement comparer cette routine à Vdelay_ms (temporisation en millisecondes), qui elle accepte qu'une variable lui soit passée selon cette doc, alors que la doc de Delay_us (temporisation en microsecondes) indique n'accepter qu'une "constante" (sans autre précision).

Autrement, si tu tiens à garder Delay_us, tu peux toujours faire :

for (n = 0; n < angle; n++)
        Delay_us(10);
Delay_us(1000);


à la place de ce que tu as écrit. Bien sûr, la boucle
for
va introduire des délais additionnels par rapport aux microsecondes de temporisation que tu souhaitais, d'autant plus longs que angle est important, que alors je ne sais pas si cela te convient.


Dal
0