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

commande PIC



  1. #1
    ABN84

    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

    -----
    "Engineering is the art of making what you want from what you get"

  2. #2
    ABN84

    Re : commande PIC

    personne?
    "Engineering is the art of making what you want from what you get"

  3. #3
    ABN84

    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
    "Engineering is the art of making what you want from what you get"

Discussions similaires

  1. Commande de LED bicolore par un PIC
    Par invitebedc7106 dans le forum Électronique
    Réponses: 6
    Dernier message: 29/04/2013, 21h21
  2. commande d'électrovanne avec un pic
    Par invite4a8ccabd dans le forum Électronique
    Réponses: 4
    Dernier message: 08/04/2008, 15h22
  3. commande de temperature+pic 16F877
    Par invitecb6e8f92 dans le forum Électronique
    Réponses: 3
    Dernier message: 27/02/2008, 21h24
  4. Projet redresseur commandé à PIC
    Par invite3bc834ff dans le forum Électronique
    Réponses: 4
    Dernier message: 05/04/2007, 21h49
  5. PIC et commande au volant
    Par nullos dans le forum Électronique
    Réponses: 0
    Dernier message: 09/01/2006, 17h30
Découvrez nos comparatifs produits sur l'informatique et les technologies.