commande PIC
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

commande PIC



  1. #1
    invitec35bc9ea

    commande PIC


    ------

    bonsoir,
    à un 16F877, je dois connecter deux moteurs pas à pas (portD), deux fins de courses (RC0 et RC1) et un bouton d'initialisation(RC2).
    je voudrais avoir le fonctionnement suivant:
    si j'appuies sur le bouton d'initialisation, les deux moteurs se mettent à tourner jusqu'à atteindre les fin de courses. et une fois la fin de course atteinte, la variable m'informant sur la position du moteur sera egale à 0 (cette variable peut prendre des valeurs entre 0 et 200).
    voici ce que j'ai fait:
    Code:
    #include "p16F877.h"
    
    void delay_ms(char millisec)
    {
    	OPTION=2;
    	do
    	{
    		TMR0=0;
    		clrwdt();
    		while(TMR0<125);
    	}
    	while(--millisec>0);
    }
    
    void step_dir(int a,int b,int c,int d,int pos){
    	int a,b,c,d,pos;
    	if(a==0&b==1&c==0&d==1){a==0;b==1;c==1;d==0;}
    	else if(a==0&b==1&c==1&d==0){a==1;b==0;c==1;d==0;}
    	else if(a==1&b==0&c==1&d==0){a==1;b==0;c==0;d==1;}
    	else if(a==1&b==0&c==0&d==1){a==0;b==1;c==0;d==1;}
    	pos=pos+1;
    }
    
    void step_inv(int a,int b,int c,int d,int pos){
    	int a,b,c,d,pos;
    	if(a==0&b==1&c==0&d==1){a==1;b==0;c==0;d==1;}
    	else if(a==0&b==1&c==1&d==0){a==0;b==1;c==0;d==1;}
    	else if(a==1&b==0&c==1&d==0){a==0;b==1;c==1;d==0;}
    	else if(a==1&b==0&c==0&d==1){a==1;b==0;c==1;d==0;}
    	pos=pos-1;
    }
    
    void init(int a,int b,int c,int d,int e,int f,int g,int h,int pos1,int pos2){
    	int a,b,c,d,e,f,g,h,pos1,pos2;
        while(RC0!=1){step_dir(a,b,c,d,pos1)}
        while(RC1!=1){step_dir(e,f,g,h,pos2)}
        pos1=0;
        pos2=0;
    }
    
    void main(void)
    {
         TRISD=0b00000000;
         TRISC=0b11100000;
         while(1){
            PORTA=0b01010101;
            if(RC2==1){init(RD0,RD1,RD2,RD3,RD4,RD5,RD6,RD7,RC3,RC4);}
    
         }
    
    	/*PORTA.0=0;
    	TRISA = 0b00000000;
    	
    	while(1)
    	{
    		PORTA=0b00000101;
    		delay_ms(500);
    		PORTA=0b00000110;
    		delay_ms(500);
    		PORTA=0b00001010;
    		delay_ms(500);
    		PORTA=0b00001001;
    		delay_ms(500);
    		}*/
    }
    vous en pensez quoi? est ce que ça a des chances de marcher?
    merci

    -----

  2. #2
    invitec35bc9ea

    Re : commande PIC

    personne?

  3. #3
    invitec35bc9ea

    Re : commande PIC

    bonjour,
    qu'en est il de cette ecriture svp:
    Code:
    //#include "p16F877.h"
    
    void delay_ms(char millisec)
    {
    	OPTION=2;
    	do
    	{
    		TMR0=0;
    		clrwdt();
    		while(TMR0<125);
    	}
    	while(--millisec>0);
    }
    
    //fonction pas sens direct
    void step_dir(int *a,int *b,int *c,int *d,int *pos){
    	if(*a==0&*b==1&*c==0&*d==1){*a=0;*b=1;*c=1;*d=0;}
    	else if(*a==0&*b==1&*c==1&*d==0){*a=1;*b=0;*c=1;*d=0;}
    	else if(*a==1&*b==0&*c==1&*d==0){*a=1;*b=0;*c=0;*d=1;}
    	else if(*a==1&*b==0&*c==0&*d==1){*a=0;*b=1;*c=0;*d=1;}
    	*pos=*pos+1;
    }
    //s'appelle ainsi: step_dir(RD0,RD1,RD2,RD3,position);
    
    //fonction pas sens inverse
    void step_inv(int *a,int *b,int *c,int *d,int *pos){
    	if(*a==0&*b==1&*c==0&*d==1){*a=1;*b=0;*c=0*;d=1;}
    	else if(*a==0&*b==1&*c==1&*d==0){*a=0;*b=1;*c=0;*d=1;}
    	else if(*a==1&*b==0&*c==1&*d==0){*a=0;*b=1;*c=1;*d=0;}
    	else if(*a==1&*b==0&*c==0&*d==1){*a=1;*b=0;*c=1;*d=0;}
    	*pos=*pos-1;
    }                    
    //s'appelle ainsi: step_inv(RD0,RD1,RD2,RD3,position);
    
    //fonction initialisation
    void init(int *a,int *b,int *c,int *d,int *e,int *f,int *g,int *h,int *capt1,int *capt2,int *pos1,int *pos2){
        while(*capt1!=1){
            step_dir(*a,*b,*c,*d,*pos1);
            delay_ms(100);
        }
        while(*capt2=1){
            step_dir(*e,*f,*g,*h,*pos2)
            delay_ms(100);
        }
        *pos1=0;
        *pos2=0;
    }
    //s'appelle ainsi: init(RD0,RD1,RD2,RD3,RD4,RD5,RD6,RD7,RC0,RC1,position1,position2);
    
    
    //fonction main
    void main(void)
    {
         TRISD=0b00000000;
         TRISC=0b11100000;
         int position1,position2;
         while(1){
            if(RC2==1){init(RD0,RD1,RD2,RD3,RD4,RD5,RD6,RD7,RC0,RC1,position1,position2);}
    
    
         }
    
    	/*PORTA.0=0;
    	TRISA = 0b00000000;
    	
    	while(1)
    	{
    		PORTA=0b00000101;
    		delay_ms(500);
    		PORTA=0b00000110;
    		delay_ms(500);
    		PORTA=0b00001010;
    		delay_ms(500);
    		PORTA=0b00001001;
    		delay_ms(500);
    		}*/
    }
    merci

Discussions similaires

  1. Commande de LED bicolore par un PIC
    Par invitebedc7106 dans le forum Électronique
    Réponses: 6
    Dernier message: 29/04/2013, 22h21
  2. commande d'électrovanne avec un pic
    Par invite4a8ccabd dans le forum Électronique
    Réponses: 4
    Dernier message: 08/04/2008, 16h22
  3. commande de temperature+pic 16F877
    Par invitecb6e8f92 dans le forum Électronique
    Réponses: 3
    Dernier message: 27/02/2008, 22h24
  4. Projet redresseur commandé à PIC
    Par invite3bc834ff dans le forum Électronique
    Réponses: 4
    Dernier message: 05/04/2007, 22h49
  5. PIC et commande au volant
    Par invite1df46b08 dans le forum Électronique
    Réponses: 0
    Dernier message: 09/01/2006, 18h30
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...