bon, le programme est compilé mais la simu ne marche pas comme prevu, ce qui veut dire que je vais vous importuner demain aussi.
mais là
bonne nuit
@+
-----
bon, le programme est compilé mais la simu ne marche pas comme prevu, ce qui veut dire que je vais vous importuner demain aussi.
mais là
bonne nuit
@+
bonjour,
Remoi,
donc je disais, en faisant la simu j'ai des resultats bizarres.
comme j'ai mis:
normalement sur les 8 pins RD je devrais avoir un niveau logique haut, or lors de la simu j'ai un niveau indeterminé.Code:PORTD=0b11111111; TRISD=0b00000000;
ce qui me parait bizarre aussi c'est:
alors que RA6 et RA7 correspondent en realité à OSC2 et OSC1. il faudrait pas faire une sorte de configuration pour ces deux pins?Code:PORTA=0b00000000; TRISA=0b00000000;//
merci
... [Edited] ... grosse bétise
Pour répondre à ce genre de question, la Datasheet !!! ... Tout est dedans ...ce qui me parait bizarre aussi c'est:
alors que RA6 et RA7 correspondent en realité à OSC2 et OSC1. il faudrait pas faire une sorte de configuration pour ces deux pins?Code:PORTA=0b00000000; TRISA=0b00000000;//
merci
Dernière modification par Seb.26 ; 28/04/2008 à 12h58.
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
rien du tout.Inverse l'ordre des instructions ... peut être que le simu aimera plus ?
la phrase qui tue!la Datasheet !!!
bon, j'ai cherché un peu et j'ai trouvé qu'effectivement, comme il s'ajit de quartz externe, il doit etre configuré.
alors m'inspirant de ceci:
j'ai fait ceci:Code:#include <p18f2455.h> #include <delays.h> // Configuration de l'horloge. // Ce programme suppose qu'un quartz de 20 MHz est branché sur OSC1/2. // 1) Nous voulons utiliser le quartz. Nous choisissons donc : // mode oscillateur extérieur HS, PLL activée, HS utilisé pour l'USB. #pragma config FOSC = HSPLL_HS // 2) En entrée de la PLL, il FAUT TOUJOURS du 4 MHz. // Le quartz étant à 20 MHz, il faut diviser par 5 la fréquence d'entrée. // Cette opération effectuée par le prescaler. #pragma config PLLDIV = 5 // 3) En sortie de la PLL, le postscaler divise la fréquence par 6. // (C'est un choix arbitraire, nous pourrions prendre autre chose...) // Donc la fréquence Fosc de l'oscillateur est Fosc = 96/6 = 16 MHz. // Un cycle durant 4 temps, cela fait 4 millions de cycles par seconde. // (4 millions d'instructions par seconde pour les instructions qui // durent 1 cycle.) #pragma config CPUDIV = OSC4_PLL6 // Désactivons le reset sur la pin 1. Sinon, il faudrait une résistance de // pull-up sur la pin 1, sans quoi le PIC subit des redémarrages aléatoires. #pragma config MCLRE = OFF // Désactivons le watchdog, sans quoi le PIC redémarrera au bout d'un // certain temps si le watchdog n'est pas réinitialisé. #pragma config WDT = OFF // Désactivons la programmation en faible tension pour éviter tout problème. #pragma config LVP = OFF
et oh, miracle! ça marche pasCode:#include <p18f4520.h> #include <delays.h> #include <math.h> #define R 6371 // R Rayon de la terre #pragma config FOSC = HSPLL_HS #pragma config PLLDIV = 3 #pragma config CPUDIV = OSC4_PLL6 #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFF
bonsoir,
certes, mais tu peux chager le mot simu par essai réel et ce serait aussi valable.Désolé, je vais pas pouvoir t'aider sur ce coup : << le simu j'connais pô !!! >>
quand je fais:
mplab crie:Code:#include <p18f4520.h> #include <delays.h> #include <math.h> #define R 6371 // R Rayon de la terre #pragma config FOSC = HSPLL_HS #pragma config PLLDIV = 3 #pragma config CPUDIV = OSC4_PLL6 #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFF
merciC:\mpap\mpap\main.c:7:Error [1224] configuration setting 'FOSC' not recognized
C:\mpap\mpap\main.c:8:Error [1224] configuration setting 'PLLDIV' not recognized
C:\mpap\mpap\main.c:9:Error [1224] configuration setting 'CPUDIV' not recognized
Normalement la PLL x4 la fréquence du quartz externe, je doute qu'avec un quartz sélectionné en HS et de surcroit à 20MHz tu puisses activer celle-ci ce qui te donnerai théoriquement 80MHz de fréquence interne...
Il faut en effet bien lire la datasheet.
bonjour,
je croyais que je divisais la frequence!non?Normalement la PLL x4 la fréquence du quartz externe, je doute qu'avec un quartz sélectionné en HS et de surcroit à 20MHz tu puisses activer celle-ci ce qui te donnerai théoriquement 80MHz de fréquence interne...
12Mhz/3 ça me donne 4MHz.
j'ai corrigé une des erreurs et il m'en reste deux:
Code:#pragma config OSC = HS #pragma config PLLDIV = 3 #pragma config CPUDIV = OSC1_PLL2 #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFFil semble qu'il ne reconnait pas PLL et CPUC:\mpap\mpap\main.c:8:Error [1224] configuration setting 'PLLDIV' not recognized
C:\mpap\mpap\main.c:9:Error [1224] configuration setting 'CPUDIV' not recognized
merci
bonjour,
Cliquez pour afficherCode:#include <p18f4520.h> #include <delays.h> #include <math.h> #define R 6371 // R Rayon de la terre #pragma config OSC = HS #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFF unsigned short int pos1,pos2; unsigned short int posr1,posr2; 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, unsigned short int pos1,unsigned short int pos2); void revolt1(char s1); void revolt2(char s2); void init(void); void track(void); /***************************/ /* initialisation du Pic */ void init_pic(){ INTCON=0b11001000; INTCON2=0x01; INTCON3=0x00; RCON=0x00; TRISA=0b00000000;//on peut ajouter 5 LEDs eventuelles de RA0 à RA4 PORTA=0b00000000; TRISB=0b11111111;//RB4 à RB7 sont es entrées des codeurs eventuels 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 PORTC=0b00000000; PORTCbits.RC4=0; PORTCbits.RC5=0; PORTCbits.RC6=0; TRISD=0b00000000;//sorties commande des moteurs PORTD=0b11111111; TRISEbits.TRISE0=0;//LED PORTEbits.RE0=0; } /*************************/ /* 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(){ int i; RCSTA=0b10010000; while(1){ if(PIR1bits.RCIF){ //on vérifie que le registre RCREG est plein if(RCREG==0x88) break; //on veut écouter l'entree jusqu'à ce que le caractère X apparaisse dans la trame reçue, X=88 en caractère ASCII } } //RCREG est maintenant égal à 'X' while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet car on ne veut pas récupérer 'X', un octet équivaut à un caractère ASCII } X=0; //initialisation X=X+RCREG; //on ajoute l'octet que contient le registre X=X<<8; //on le décalle vers la gauche while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet, un octet équivaut à un caractère ASCII } X=X+RCREG; //on recommence X=X<<8; while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet } X=X+RCREG; //X contient maintenant les trois octets de la valeur de la coordonnées EST du GPS par rapport à la station au sol=longitude/station //récupération de Y : while(1){ if(PIR1bits.RCIF) break; } if(RCREG!=0x89){ PORTEbits.RE0=1; return; } while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet car on ne veut pas récupérer 'Y', un octet équivaut à un caractère ASCII } Y=0; //initialisation Y=Y+RCREG; //on ajoute l'octet que contient le registre Y=Y<<8; //on le décalle vers la gauche while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet, un octet équivaut à un caractère ASCII } Y=Y+RCREG; //on recommence Y=Y<<8; while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet } // Y=Y+RCREG; //X contient maintenant les trois octets de la valeur de la latitude GPS /station au sol //récupération de l'altitude Z : while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet, un octet équivaut à un caractère ASCII } if(RCREG!=0x90){ //Z en caractère ASCII est 90 PORTEbits.RE0=1; return; } while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet car on ne veut pas récupérer 'Z', un octet équivaut à un caractère ASCII } Z=0; //initialisation Z=Z+RCREG; //on ajoute l'octet que contient le registre Z=Z<<8; //on le décalle vers la gauche while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet, un octet équivaut à un caractère ASCII } Z=Z+RCREG; //on recommence Z=Z<<8; while(PIR1bits.RCIF==0){ //on attend que RCREG reçoive à nouveau un octet } Z=Z+RCREG; //X contient maintenant les trois octets de la valeur de l'altitude /station au sol }*/ /*************************/ /* 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, unsigned short int pos1, unsigned short int pos2){ //X : longitude pris p/r à la station au sol //Y : latitude pris p/r à la station au sol //Z : altitude par r/p à la surface de la terre while(1){ unsigned long x, y, z; // x, y, z coordonnées cartésiennes du done p/r à la station au sol // conversion en coordonnées cartésiennes x=R*X; // hypothèse de calcul : x=R*tanX, R>>X d'où x=R*X y=R*Y; //même hypothèse pour le calcul de x z=Z; //Conversion en position angulaire pos1=(atan(x/y))/1.8; pos2=atan(z/sqrt(x*x + y*y))/1.8; } }*/ /***************************/ /* Fonction revolt1 *///tourner le moteur 1 dans le sens s1 /*void revolt1(char s1){ PORTDbits.RD1=s1;//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 s2){ PORTDbits.RD5=s2;//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 PORTDbits.RD1=1;//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 } } /*while(PORTCbits.RC1!=1){//tant que le moteur 2 ne rencontre pas le fin de course PORTDbits.RD5=1;//sens de rotation while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(10); PORTDbits.RD6 = 0; Delay10KTCYx(10); posr2=posr2+1;//incrementation de la position du moteur 2 } }*/ } 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 sens 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*/ } } /*****************/
j'ai resolu le probleme de l'horloge (pas vraiment j'ai supprimé le diviseur ), bref l'important c'est que ça marche.
mais ça n'a pas resolu mon probleme de sorties RD indeterminées.
j'ai donc tout mis en commentaire ne laissant que init_pic et init_var et là les sorties RD etaient niveau haut.
j'ai donc commencé à enlevé les commentaires un à un et ai trouvé l'origine du probleme:
j'utilise la fonction:dans deux fonctions differentes (c'est le probleme de gestion des interruptions ou qqch comme ça non? enfin c'est ce que j'ai cru comprendre).Code:Delay10KTCYx(0);
ce qui fait que ce programme marche:
Cliquez pour afficherCode:#include <p18f4520.h> #include <delays.h> #include <math.h> #define R 6371 // R Rayon de la terre #pragma config OSC = HS #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFF unsigned short int pos1,pos2; unsigned short int posr1,posr2; 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, unsigned short int pos1,unsigned short int pos2); void revolt1(char s1); void revolt2(char s2); void init(void); void track(void); /***************************/ /* initialisation du Pic */ void init_pic(){ INTCON=0b11001000; INTCON2=0x01; INTCON3=0x00; RCON=0x00; TRISA=0b00000000;//on peut ajouter 5 LEDs eventuelles de RA0 à RA4 PORTA=0b00000000; TRISB=0b11111111;//RB4 à RB7 sont es entrées des codeurs eventuels 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 PORTC=0b00000000; PORTCbits.RC4=0; PORTCbits.RC5=0; PORTCbits.RC6=0; TRISD=0b00000000;//sorties commande des moteurs PORTD=0b11111111; TRISEbits.TRISE0=0;//LED PORTEbits.RE0=0; } /*************************/ /* initialisation des variables globales */ void init_var(void){ X=0; Y=0; Z=0; pos1=0; pos2=0; posr1=0; posr2=0; } /* 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 PORTDbits.RD1=1;//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 } } /*while(PORTCbits.RC1!=1){//tant que le moteur 2 ne rencontre pas le fin de course PORTDbits.RD5=1;//sens de rotation while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(10); PORTDbits.RD6 = 0; Delay10KTCYx(10); posr2=posr2+1;//incrementation de la position du moteur 2 } }*/ } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 2 } /*****************/ /* 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*/ } } /*****************/
mais pas celui-ci:
Cliquez pour afficherCode:Code:#include <p18f4520.h> #include <delays.h> #include <math.h> #define R 6371 // R Rayon de la terre #pragma config OSC = HS #pragma config MCLRE = OFF #pragma config WDT = OFF #pragma config LVP = OFF unsigned short int pos1,pos2; unsigned short int posr1,posr2; 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, unsigned short int pos1,unsigned short int pos2); void revolt1(char s1); void revolt2(char s2); void init(void); void track(void); /***************************/ /* initialisation du Pic */ void init_pic(){ INTCON=0b11001000; INTCON2=0x01; INTCON3=0x00; RCON=0x00; TRISA=0b00000000;//on peut ajouter 5 LEDs eventuelles de RA0 à RA4 PORTA=0b00000000; TRISB=0b11111111;//RB4 à RB7 sont es entrées des codeurs eventuels 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 PORTC=0b00000000; PORTCbits.RC4=0; PORTCbits.RC5=0; PORTCbits.RC6=0; TRISD=0b00000000;//sorties commande des moteurs PORTD=0b11111111; TRISEbits.TRISE0=0;//LED PORTEbits.RE0=0; } /*************************/ /* initialisation des variables globales */ void init_var(void){ X=0; Y=0; Z=0; pos1=0; pos2=0; posr1=0; posr2=0; } /* 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 PORTDbits.RD1=1;//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 } } while(PORTCbits.RC1!=1){//tant que le moteur 2 ne rencontre pas le fin de course PORTDbits.RD5=1;//sens de rotation while(1){//Step PORTDbits.RD6 = 1; Delay10KTCYx(10); PORTDbits.RD6 = 0; Delay10KTCYx(10); posr2=posr2+1;//incrementation de la position du moteur 2 } } } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 2 } /*****************/ /* 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*/ } } /*****************/
donc si j'essaie de commander un moteur ça va mais deux non.
comment resoudre ça? (ça equivaut à faire clignoter deux LEDs endependemment l'une de l'autre).
**************
deuxieme probleme:
meme pour un seul moteur, je n'obtiens pas le fonctionnement voulu. certe il tourne mas pas de la facon que je veux:
à RC0 et RC2 j'ai connecté deux boutons poussoirs avec des resistances de pull-down.Code:/* 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 PORTDbits.RD1=1;//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 } } posr1=0;//initialiser la position du moteur 1 posr2=0;//initialiser la position du moteur 2 } /*****************/
donc au demarrage du pic RC0 et RC2 sont à niveau bas. et tout le port BD est à niveau haut.
je veux avoir le fonctionnement suivant:
une impulsion sur le BP de RC2 fait osciller RD2.
meme en lachant le BP, RD2 continue à osciller.
une impulsion sur RC0 (RC2 n'est plus appuié) arrete l'oscillation de RD2 qui garde le niveau de sa derniere oscillation.
avec le bout de code ci-dessus, j'arrives à respecter les deux premiers points mais pas le 3eme: une implusion sur RC0 laisse le PIC indifferent.
merci
Seb, hulk, vous etes ou?