Aller au contenu


Photo
- - - - -

programme en mikroc


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 walid_med-RX

walid_med-RX

    Nouveau membre

  • Membres
  • 1 messages

Posté 05 juin 2011 - 11:11


slt j'ai fais un petit programme en mikroc et j'ai declaréé l'angle desiré (theta1) et jai voulue quand theta1 et mesure1 seront égaux le moteur (PORTD4 et 5) stop
mais sa fonctionne pas avec protéus svp aidez moi ,ou est le probleme ( je pense que le probleme est dans le calcule )help me
voila le programme:



unsigned float pot;
unsigned float pot2;
unsigned float pot3;
unsigned float pot4;
unsigned float pot5;
unsigned float pot6;
double theta1;
double theta2;
double mesure1;

#define M1_actif {PORTD.F1=1;PORTD.F0=0;PORTC.F3=1;}
#define M1_avant {PORTD.F4=1;PORTD.F5=0;}
#define M1_ariere {PORTD.F4=0;PORTD.F5=1;}

void angle()
{
double Px=2;
double Py=5;
double Pz=0;

{
theta1=atan2(Py,Px);
}

}

void main()
{
ADCON1=0x80;
TRISA=0xFF;
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
while(1)
{
pwm_init(5000);
pwm_start();
pwm_change_duty(128);

pot=Adc_Read(0);
mesure1=pot*(160/255)-80;
angle();

if(mesure1==theta1)
{
PORTD=0;
}
else if(mesure1 {
M1_actif;
M1_avant;
}
else
{
M1_actif;
M1_ariere;
}

}
}[/code]

#2 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 05 juin 2011 - 05:16

Je trouve que tu n'expliques pas du tout correctement ce que tu essayes de faire. Personnellement je n'ai rien compris à ton explication...

En plus, tu peux utiliser la balise "code". (je vais éditer ton post pour le mettre, sinon c'est illisible..)

Je me demande aussi si tes "define" sont corrects :
"#define M1_actif {PORTD.F1=1;PORTD.F0=0;PORTC.F3=1;}"

Ça me semble bizarre. Il y a aussi ce bout là qui me pose question :
"{ theta1=atan2(Py,Px); }"

Pourquoi mettre les accolades ?

#3 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 05 juin 2011 - 05:48

Salut !!

Les defines sont correct (quand tu appelleras M1_actif, le compilo le remplacera par le bout de code après).
Pour les accolades sur le calculs de theta1, elles ne sont pas obligatoire.

Sinon, ton problème viens du fait que tu compares deux nombre flottant !! Du coup, au lieu de mettre if(nb1 == nb2), tu ferais mieux de mettre if(abs(nb1-nb2) < 0.00001)
En effet, si nb1 = 1.222222222 et nb2 = 1.22222222221, nb1 et nb2 ne seront pas égaux (alors qu'en pratique, je présume que tu souhaites qu'ils le soit ^^)

++
Black Templar

#4 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 05 juin 2011 - 08:13

Ok pour le define. Petite question, tant qu'on y est :
"#define M1_actif {PORTD.F1=1;PORTD.F0=0;PORTC.F3=1;}"

Est ce que quand tu mets "M1_actif;" dans le code, ça remplace par "{PORTD.F1=1;PORTD.F0=0;PORTC.F3=1;}" (avec les acolades ?) Mais du coup, est-ce que les accolades sont importantes dans le define ?

#5 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 05 juin 2011 - 09:09

Oui, ça marche comme ça.

En effet, les accolades sont importante. Imagine que tu écrives ces lignes de code :

M1_actif;[/code]

Si tu ne mets pas les accolades, je présume que tu dévines le problème !! Si test ne vaut pas true, la première ligne du define ne sera pas exécuté, mais les suivantes si !! cas elles ne sont pas incluse dans le if ! :)
J'ai déjà passé pas mal de temps (quelques heures) à trouver cette erreur une fois, lorsque j'ai du définir des préprocesseur de fonction de cette manière ! C'est assez bête au final, mais il vaut mieux ajouter les accolades. Au moins, pas de problème :)

#6 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 05 juin 2011 - 09:32

Euh... Pas si simple. :)
(Quand j'ai lu ton message, je me suis senti tout bête, puis j'ai vérifié...)

{
M1_actif;
M1_avant;
}[/code]

En remplaçant par :

define M1_avant {PORTD.F4=1;PORTD.F5=0;}[/code]

Ça donne :

{
{PORTD.F1=1;PORTD.F0=0;PORTC.F3=1;}
{PORTD.F4=1;PORTD.F5=0;}
}[/code]

Donc en fait, ici les accolades ne sont pas indispensables. Cependant c'est une bonne pratique de les mettre si je comprends bien. Ou alors la bonne pratique serait de mettre à chaque fois les accolades après un if.

Donc ne pas mettre :
M1_actif;[/code]

Mais mettre :
{
M1_actif;
}[/code]

Pourquoi ne pas mettre à chaque fois les accolades même s'il n'y a qu'une seule instruction ? Je sais qu'on essaye de simplifier au maximum le code et surtout à taper le moins possible mais parfois, je trouve que ça n'aide pas à la clarté.

#7 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 06 juin 2011 - 08:39

[quote"Esprit"]Donc en fait, ici les accolades ne sont pas indispensables. Cependant c'est une bonne pratique de les mettre si je comprends bien. Ou alors la bonne pratique serait de mettre à chaque fois les accolades après un if. [/quote]

C'est à toi de voir ce qui te convient le mieux !
Perso, je ne met pas d'accolades à mes if/for/while etc. si après, je n'ai qu'une instruction. Et comme je n'écris pas de préprocesseurs tous les jours, je préfère penser rajouter les accolades dans ces #define plutôt que dans les if :)

Après, chacun son choix, tout est permis.

++
Black Templar




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users