ça peut pas marcher ...Code:uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) [...] /* Prototype des fonctions */ void revolt1(uChar_Bits s1); [...]
-----
ça peut pas marcher ...Code:uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) [...] /* Prototype des fonctions */ void revolt1(uChar_Bits s1); [...]
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
on fait comment alors?
HULK, j'ai suivi ton modele:ce que je veux, c'est que la fct revolt1 recoive comme argument un bit et que la valeur de ce bit soir celle que j'affecte à PORTDbits.RD1
certains pins sont configurés en entrée, comment ça se fait que tu mets un PORTB par exemple?Code:#include <p18f4520.h> #include <delays.h> #include "uchar.h" #include "capt.h" #include "recupercoord18.h" #include "Conversion.h" uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) int pos1,pos2;//a chager en char int posr1,posr2;//a changer en char /* Prototype des fonctions */ void init_pic(void); void init_var(void); void revolt1(uChar_Bits s1); void revolt2(uChar_Bits s2); void init(void); void track(void); /* initialisation du Pic */ void init_pic(){ PORTA=0b00000000; TRISA=0b00000000; PORTB=0b00000000; TRISB=0b11111111; PORTC=0b00000000; TRISC=0b10001111; PORTD=0b11111111; TRISD=0b00000000; PORTEbits.RE0=0; TRISEbits.TRISE0=0; } /* initialisation des variables globales */ void init_var(void){ pos1=0; pos2=0; posr1=0; posr2=0; } /* Fonction revolt1 *///tourner le moteur 1 dans le sens s1 void revolt1(uChar_Bits s1){ PORTDbits.RD1=s1; while(1){//Step PORTDbits.RD2 = 1; Delay10KTCYx(0); PORTDbits.RD2 = 0; Delay10KTCYx(0); posr1=posr1+1; } } /* Fonction revolt1 *///tourner le moteur 2 dans le sens s2 void revolt2(uChar_Bits s2){ PORTDbits.RD5=s2; while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(0); PORTDbits.RD6 = 0; Delay10KTCYx(0); posr2=posr2+1; } } /* Fonction init *///initialisation des positions des moteurs void init(){ if(PORTCbits.RC2){ while(PORTCbits.RC0!=1){ revolt1(1); } while(PORTCbits.RC1!=1){ revolt2(1); } } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 1 } /* Fonction trasck*///suivi de trajectoire void track(){ while(1){ if(posr1<pos1){ revolt1(1); } else if(posr1>pos1){ revolt1(0); } if(posr2<pos2){ revolt2(1); } else if(posr2>pos2){ revolt2(0); } } } void main(){ init_pic(); init_var(); while(1){ init(); recupercoord(); convertionsoul(X,Y,Z,pos1,pos2); track(); } }
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Je met un portB parceque tu le déclares avec TRISB, donc je suppose que tu vas t'en servir plus tard, non?
Si tu t'en sers il faut fixer les états selon les besoins à l'init, ça évite des trucs bizarres.
Sinon ben tu ne le fais pas apparaitre du tout...si tu ne t'en sers pas.
s1 est une variable structure passée en paramètre...
le uCharBits par contre on ne sait pas d'où il sort et comment il est définit.
Mais bon je pense que tout est à revoir à mon avis.
Mais non ... le problème c'est que le s1 est aussi un #define (un bool), alors que le paramètre est un uChar_bits ( voir plus haut dans le post )Envoyé par HULK28C'est sûr que les parenthèses sont un problème.
Dans le "uchar.h"Envoyé par HULK28En plus le uCharBits on sait pas d'où il sort et comment il est définit.
Mais bon je pense que tout est à revoir à mon avis.
C'est surtout les cours C qu'il va falloir revoir pour notre ami ...
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
j'ai fait comme à dit Seb:En plus le uCharBits on sait pas d'où il sort et comment il est définit.
uchar.h:
main.c:Code:#define uChar unsigned char typedef union _uChar_b { struct { unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; }; uChar value; }; #define uChar_Bits union _uChar_b
Code:#include <p18f4520.h> #include <delays.h> #include <math.h> #include "uchar.h" uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) #define R 6371 [...]
Voir mon post en fin de page #2 ... ... il est passé à la trappe avec le saut de page ...
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Essaye comme ça :
Code:#include <p18f4520.h> #include <delays.h> #include "uchar.h" #include "capt.h" #include "recupercoord18.h" #include "Conversion.h" uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) int pos1,pos2;//a chager en char int posr1,posr2;//a changer en char /* Prototype des fonctions */ void init_pic(void); void init_var(void); void revolt1(bool value); void revolt2(bool value); void init(void); void track(void); /* initialisation du Pic */ void init_pic(){ PORTA=0b00000000; TRISA=0b00000000; PORTB=0b00000000; TRISB=0b11111111; PORTC=0b00000000; TRISC=0b10001111; PORTD=0b11111111; TRISD=0b00000000; PORTEbits.RE0=0; TRISEbits.TRISE0=0; } /* initialisation des variables globales */ void init_var(void){ pos1=0; pos2=0; posr1=0; posr2=0; } /* Fonction revolt1 *///tourner le moteur 1 dans le sens s1 void revolt1(bool value){ PORTDbits.RD1=value; while(1){//Step PORTDbits.RD2 = 1; Delay10KTCYx(0); PORTDbits.RD2 = 0; Delay10KTCYx(0); posr1=posr1+1; } } /* Fonction revolt1 *///tourner le moteur 2 dans le sens s2 void revolt2(bool value){ PORTDbits.RD5=value; while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(0); PORTDbits.RD6 = 0; Delay10KTCYx(0); posr2=posr2+1; } } /* Fonction init *///initialisation des positions des moteurs void init(){ if(PORTCbits.RC2){ while(PORTCbits.RC0!=1){ revolt1(1); } while(PORTCbits.RC1!=1){ revolt2(1); } } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 1 } /* Fonction trasck*///suivi de trajectoire void track(){ while(1){ if(posr1<pos1){ revolt1(1); } else if(posr1>pos1){ revolt1(0); } if(posr2<pos2){ revolt2(1); } else if(posr2>pos2){ revolt2(0); } } } void main(){ init_pic(); init_var(); while(1){ init(); recupercoord(); convertionsoul(X,Y,Z,pos1,pos2); track(); } }
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
ok, allez y foutez vous de moiSi tu veux, envois moi tes fichiers et ton cahier des charges, je vais finir le projet pour toi ... donne moi aussi l'adresse mail de ton boss, je lui ferais une proposition ...
oui, mais c'est une entrée pas une sortie.Je met un portB parceque tu le déclares avec TRISB, donc je suppose que tu vas t'en servir plus tard, non?
Seb.26:Exact, j'avais corrigé mon post avant que tu ne répondes et je réalise que j'ai corrigé en écrivant une connerie en plus...
rien,
=>Code:void revolt1(bool val1);
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\mcc18\bin\mcc18.exe" -p=18F2520 "main.c" -fo="main.o" /i"C:\mcc18\h" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
MPLAB C18 v2.40 (demo)
Copyright 1999-2004 Microchip Technology Inc.
Days remaining until demo becomes feature limited: 12
c:\mpap\mpap\main.c:24:Error: syntax error
Halting build on first failure as requested.
BUILD FAILED: Sun Apr 27 23:01:16 2008
C'est bon, TRISB est bien à 0b11111111 donc le portB est bien en entrée.
Y a pas d'erreur, j'ai pour habitude de déclarer PORTx avant TRISx, c'est plus sûr de positionner l'état du port avant sa direction.
Donc y a pas d'erreur....au moins là.
ok,
si j'ai relevé la remarque c'est que je croyais qu'on ne mettait PORT que pour les ports configurés en sortie
Ah oui pardon je ne parlais pas de la même chose, dans le cas où c'est une entrée c'est en effet inutile la pin étant en haute impédance.
Je sui à coté de la plaque ce soir, désolé.
Bon ... remplace "bool" par "char" ... ça devrait aller mieux ...
Il est pas sympa ton compilo ... les msg d'erreurs sont hyper clairs !
Dernière modification par Seb.26 ; 27/04/2008 à 23h18.
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
bon, si je mets char ça ne mets plus cette erreur,
mais ai je le droit apres d'appeler la fct ainsi:Code:void revolt1(char val1);
Code:revolt1(0);
à part ça, il me reste deux erreurs:
il semble que le compilo ne reconnait pas RE0 (me dit qu'il n'est pas declaré)
et j'ai une indication d'une erreur dans "18F2520.h" alors que moi j'utilise un 4520.
Code:#include <p18f4520.h> #include <delays.h> #include <math.h> #include "uchar.h" uChar_Bits _sens; #define sens (_sens.value) #define s1 (_sens.b0) #define s2 (_sens.b1) #define R 6371 // R Rayon de la terre int pos1,pos2;//a changer en char //je sais pas comment faire pour l'instant //juste ecrire char à la place de int? // je sais pas int posr1,posr2;//a changer en char unsigned long X, Y, Z; /* Prototype des fonctions */ void init_pic(void); void init_var(void); void recupercoord(void); void convertionsoul(unsigned long X,unsigned long Y,unsigned long Z,char pos1,char pos2); void revolt1(char val1); void revolt2(char val2); void init(void); void track(void); /***************************/ /* initialisation du Pic */ void init_pic(){ INTCON=0b11001000; INTCON2=0x01; INTCON3=0x00; RCON=0x00; PORTA=0b00000000; TRISA=0b00000000;//on peut ajouter 5 LEDs eventuelles de RA0 à RA4 PORTB=0b00000000; TRISB=0b11111111;//RB4 à RB7 sont es entrées des codeurs eventuels PORTC=0b00000000; TRISC=0b10001111;//RC0: 1er fin de course / RC1: eme fin de course / RC2: bouton d'init / RC3 entree force de signal XBEE / RC6: sortie PC / RC7: entree signal XBEE PORTD=0b11111111; TRISD=0b00000000;//sorties commande des moteurs PORTEbits.RE0=0; TRISEbits.TRISE0=0;//LED } /*************************/ /* initialisation des variables globales */ void init_var(void){ X=0; Y=0; Z=0; pos1=0; pos2=0; posr1=0; posr2=0; } /*****************************************/ /* Fonction recupercoord *///recuperer longitude, latitude et altitude void recupercoord(){ [...] } /*************************/ /* Fonction convertionsoul *///transformer X, Y, et Z en 2 positions angulaires à donner à chacun des deux moteurs void convertionsoul(unsigned long X, unsigned long Y, unsigned long Z, char pos1, char pos2){ [...] } /***************************/ /* Fonction revolt1 *///tourner le moteur 1 dans le sens s1 void revolt1(char val1){ PORTDbits.RD1=val1;//sens de rotation while(1){//Step PORTDbits.RD2 = 1; Delay10KTCYx(0); PORTDbits.RD2 = 0; Delay10KTCYx(0); posr1=posr1+1;//incrementation de la position du moteur 1 } } /********************/ /* Fonction revolt1 *///tourner le moteur 2 dans le sens s2 void revolt2(char val2){ PORTDbits.RD5=val2;//sens de rotation while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(0); PORTDbits.RD6 = 0; Delay10KTCYx(0); posr2=posr2+1;//incrementation de la position du moteur 2 } } /********************/ /* Fonction init *///initialisation des positions des moteurs void init(){ if(PORTCbits.RC2){// action sur le bouton init while(PORTCbits.RC0!=1){//tant que le moteur 1 ne rencontre pas le fin de course revolt1(1);//tourner M1 } while(PORTCbits.RC1!=1){//tant que le moteur 2 ne rencontre pas le fin de course revolt2(1);//tourner M2 } } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 2 } /*****************/ /* Fonction track*///suivi de trajectoire void track(){ while(1){ if(posr1<pos1){//pos reelle < pos voulue revolt1(1);//tourner M1 snes direct } else if(posr1>pos1){//pos reelle > pos voulue revolt1(0);//tourner M1 sens inverse } if(posr2<pos2){//pos reelle < pos voulue revolt2(1);//tourner M2 sens direct } else if(posr2>pos2){//pos reelle > pos voulue revolt2(0);//tourner M2 sens inverse } } } /*****************/ /* Fonction Main */ void main(){ init_pic();//initialisation du PIC init_var();//initialisation des variables while(1){ init();//debut de cycle recupercoord();//recuperation des coordonnees GPS convertionsoul(X,Y,Z,pos1,pos2);//conversion des coordonnées GPS en positions moteurs track();//suivi de trajectoire } } /*****************/Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\mcc18\bin\mcc18.exe" -p=18F2520 "main.c" -fo="main.o" /i"C:\mcc18\h" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
MPLAB C18 v2.40 (demo)
Copyright 1999-2004 Microchip Technology Inc.
Days remaining until demo becomes feature limited: 12
C:\mcc18\h\p18f2520.h:140:Error [1109] type mismatch in redeclaration of 'PORTEbits'
c:\mpap\mpap\main.c:52:Error [1205] unknown member 'RE0' in '__tag_132'
c:\mpap\mpap\main.c:52:Error [1131] type mismatch in assignment
c:\mpap\mpap\main.c:112:Error [1205] unknown member 'RE0' in '__tag_132'
c:\mpap\mpap\main.c:112:Error [1131] type mismatch in assignment
c:\mpap\mpap\main.c:134:Error [1205] unknown member 'RE0' in '__tag_132'
c:\mpap\mpap\main.c:134:Error [1131] type mismatch in assignment
c:\mpap\mpap\main.c:250:Warnin g [2058] call of function without prototype
c:\mpap\mpap\main.c:253:Warnin g [2058] call of function without prototype
c:\mpap\mpap\main.c:254:Warnin g [2058] call of function without prototype
c:\mpap\mpap\main.c:256:Warnin g [2058] call of function without prototype
Halting build on first failure as requested.
BUILD FAILED: Sun Apr 27 23:28:21 2008
OK, c'etait donc le "bool" qui n'était pas défini ...
( le type bool n'est pas standard en C ... )
Oui, tu peux parfaitement appelé une fonction qui prend un char en lui passant un bool ... de toute façon, passer en paramètre un bool n'a pas de sens, on ne peut pas empiler 1 bit ... c'est forcement un octet au moins ...
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Verifie tes paramètres de projet ( la cible est bien le bon PIC ? )
Recherche dans tes .c et .h si par hasard l'un d'eux n'incluerait pas le .h du 4520 ...
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Oui bien sûr, val1 est l'argument que tu passes à la fonction revolt1.
Elle va donc positionner val1 à 0 donc RD1=0.
Edit: je passe la main à Seb.26 on se télescope comme d'hab...
En plus C18 n'est pas mon compilo.
@+
ce qui me derange (du point de vue du raisonnement) c'est que val1 est un char alors que RD1 est un bit
je suppose que tu voulais dire 2520.Recherche dans tes .c et .h si par hasard l'un d'eux n'incluerait pas le .h du 4520 ...
dans mon projet j'ai mis le p18f4520.h et y a aucun p18f2520.h
Hum ... HULK28 ... Mais qu'est-ce qui nous arrive ? ... grand fou va ...
Désolé, craquage du dimanche soir ...
Oui, je comprends, mais alors petit rappel : les paramètres des fonctions sont placés sur la pile, hors l'unité de la pile, c'est l'octet ... donc impossible d'empiller un bit ... donc en fait, le compilo va traiter ton char comme un char qui ne peut avoir que 2 valeurs : ==0 ( false ) ou pas ( true ) ...ce qui me derange (du point de vue du raisonnement) c'est que val1 est un char alors que RD1 est un bit
Oui, peut être ... je t'avoues que j'ai pas vraiment ton projet en tête ...je suppose que tu voulais dire 2520.
dans mon projet j'ai mis le p18f4520.h et y a aucun p18f2520.h
Tu utilise un 4520, c'est ça ? ( tu #include bien le bon .h dans ton main.c )
Par contre, Mplab lui essaye de compiler un 2520 on dirait :
Ou alors c'est voulu, je sais pas trop ... jète un oeil vite fais dans MPlab pour voir si tu as bien choisi le 4520 ...Code:Executing: "C:\mcc18\bin\mcc18.exe" -p=18F2520 "main.c" -fo="main.o" /i"C:\mcc18\h" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
c'est ça.Tu utilise un 4520, c'est ça ?
ce que j'ai fait, c'est que j'ai mis #include <p18f4520.h> dans le main, et dans la definition du projet j'ai mis les header, linker et lib du 4520. y a un autre truc à quoi il faut faire attention?
Ah, oui ça me rappelle l'histoire du int utilisé comme boolean. je l'ai completement oublié celle là.un char qui ne peut avoir que 2 valeurs : ==0 ( false ) ou pas ( true ) ...
et pour le truc du RE0? ou c'est lié au probleme du 2520?
Dans "Mplab > Configure > Select device" ... verifie le Device ...
PS: il a déjà compilé ton programme ???
Je crois que c'est là ton problème : il y a des redéfinitions à cause du double .h
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
YEEHAAAA!!!BUILD SUCCEEDED: Mon Apr 28 00:17:32 2008
en effet c'etait bien ça.Dans "Mplab > Configure > Select device" ... verifie le Device ...
merci à vous deux.