Control de un motor

hola necesito controlar el giro de un motor con 18f4550
el programa que tengo que haces es que con una interrupcion de rb0 active la cantidad de vueltas que quiero que de el el motor,
con una interrupcion rb1 active la velocidad ala que quiero que valla el motor , y con una interrupcion rb2 sea el stars o cuando el motor empieza su marcha. gracias... ...
MI CODIGO QUE TENGO HASTA HORA ES EL SIGUIENTE:


Código:
#INCLUDE <18F4550.h>           // LIBRERIA PARA EL 4550
//********************************************************************************
//OSCILADOR INTERNO
//#FUSES INTRC_IO,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN 
//#USE DELAY (INTERNAL=4M) 

//OSCILADOR EXTERNO
#FUSES XT,CPUDIV1,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN //OSCILADOR EXTERNO
#USE DELAY (CLOCK=4M)          

#BYTE PORTA=0xf80
#BYTE PORTB=0xf81
#BYTE PORTC=0xf82
#BYTE PORTD=0xf83
#BYTE PORTE=0xf84

#USE FAST_IO(A)   
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#USE FAST_IO(E)

INT t=100,N=0,i=0,N1=0;





#INT_EXT
VOID CONTROL_RB0()   //FUNCIÓN CANTIDAD DE GIROS
{

N++;
FOR(i=0;i<=N;i++)
{
PORTA=i;
PORTC=PORTA;

delay_ms(t);
}

}
#INT_EXT1
VOID CONTROL_RB1()   //FUNCIÓN VELOCIDAD
{
N1++;
IF(N1==1)
{

}
delay_ms(t);
}
#INT_EXT2
VOID CONTROL_RB2()   //FUNCION EJECUTAR
{

delay_ms(t);
}

////////////////////////FUNCION PRINCIPAL (MAIN)/////////////////////////////////////////
VOID MAIN (VOID)
{
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_ADC(ADC_OFF);

SET_TRIS_A(0);
SET_TRIS_B(0B11110111);
SET_TRIS_C(0);
SET_TRIS_D(0);
SET_TRIS_E(0);

PORT_B_PULLUPS(TRUE);
ENABLE_INTERRUPTS(INT_EXT);
ENABLE_INTERRUPTS(INT_EXT1);
ENABLE_INTERRUPTS(INT_EXT2);
EXT_INT_EDGE(H_TO_L);
EXT_INT_EDGE(1,H_TO_L);
EXT_INT_EDGE(2,H_TO_L);
ENABLE_INTERRUPTS(GLOBAL);
DELAY_MS(500);

WHILE(1)
{


}
} ...
 
Última edición por un moderador:
hijoles hermano no tienes nada :/

usaste el picwizard?

por que no es muy necesario poner esto:
#BYTE PORTA=0xf80
#BYTE PORTB=0xf81
#BYTE PORTC=0xf82
#BYTE PORTD=0xf83
#BYTE PORTE=0xf84

#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#USE FAST_IO(E)

y poner un delay de 500ms
eso es inecesario despues de declarar interrupciones simplemente no lo pongas


ni esto es muy necesario

VOID MAIN (VOID)
{
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_ADC(ADC_OFF);

SET_TRIS_A(0);

SET_TRIS_B(0B11110111);
SET_TRIS_C(0);
SET_TRIS_D(0);
SET_TRIS_E(0);


PORT_B_PULLUPS(TRUE);
ENABLE_INTERRUPTS(INT_EXT);
ENABLE_INTERRUPTS(INT_EXT1);
ENABLE_INTERRUPTS(INT_EXT2);
EXT_INT_EDGE(H_TO_L);
EXT_INT_EDGE(1,H_TO_L);
EXT_INT_EDGE(2,H_TO_L);
ENABLE_INTERRUPTS(GLOBAL);
DELAY_MS(500);



bueno eso solo para empezar debes hacer un algoritmo que mueva el motor a pasos

no recomiendo que lo hagas moviendo el motor yo te sugiero que pongas la secuencia y que veas que unos leds siguen perfectamente la secuencia

por que si pones directamente el puente H puedes hacer destrosos

cuando lo tengas me dices para decir como calcular el motor y que hacer para no quemar el puente H
 
Última edición:
Hola. Volviendo con mi trabajo, acá tengo mi programa casi completo.
Lo único que no me funciona es la interrupción 3, que es la me da inicio de arranque al motor.
No sé que tendré mal.
Código:
#INCLUDE <18F4550.H>  // LIBRERIA DEL DISPOSITIVO 
#FUSES XTPLL,PLL1,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN,CPUDIV3  // PALABRA DE CONFIGURACIÓN CON UN CRSITAL DE 4MHZ
#USE DELAY (CLOCK=24M)  // CONFIGURACIÓN DEL DELAY CON UNA VELOCIDAD DE 4MHZ

///////////////////////ASIGNACION DE NOMBRES A LOS RESPECTIVOS PUERTOS//////////////////////
#BYTE PORTA=0xf80
#BYTE PORTB=0xf81
#BYTE PORTC=0xf82
#BYTE PORTD=0xf83
#BYTE PORTE=0xf84
//*****************************************************************************************

////LAS FUNC. FAST_IO EVITAN RECONFIGURAR LOS PUERTOS CON LAS FUNCIONES OUTPUT E INPUT/////
#USE FAST_IO(A)                  
#USE FAST_IO(B)                  
#USE FAST_IO(C)  
#USE FAST_IO(D) 
#USE FAST_IO(E)

                                             //DEFINICION DE VARIABLES//
INT UNI=0,CONT=0,CONT1=0,CONTROL=0,VELOCIDAD=100,UNI1=0,CONT_P=0,D=0;
CONST CHAR DISPLAY[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x98};

                                       /////VECTOR DE SECUENCIA DE MOTORES DE 1/2 PASO/////////////
CONST INT8 PASOS [9]={0B00000001,0B00000010,0B00000100,0B00001000,0B00000001,0B00000010,0B00000100,0B00001000,0B00000001};
CONST INT8 PASOS2 [9]={0B00000011,0B00000110,0B00001100,0B00001001,0B00000011,0B00000110,0B00001100,0B00001001,0B00000011};
INT8 VECT[10]={0B11000000,0B11111001,0B10100100,0B10110000,0B10011001,0B10010010,0B10000010,0B11111000,0B10000000,0B10011000};
                                 
VOID NUMERO_EXT();
VOID VELOCIDAD_EXT1();
VOID ACTIVAR_EXT2();

#INT_EXT   
VOID NUMERO_EXT(VOID)
{
   
   DISABLE_INTERRUPTS (GLOBAL);
   UNI++; 
      IF (UNI==10) 
   {
      UNI=0;
      D++;
      IF(D==10)
      {
      D=0;
     
      }
   
   }
   DELAY_MS(200);
   ENABLE_INTERRUPTS(GLOBAL);
}

#INT_EXT1
VOID VELOCIDAD_EXT1 ()
{
  DELAY_MS(200);
  DISABLE_INTERRUPTS (GLOBAL);
CONT++;
  UNI=CONT;
  IF(UNI==4)
  {
  UNI=0;
  }
  IF (CONT==1)//SECUENCIA NORMAL//
  {
  DELAY_MS(1000);
  PORTA=(0B00000001);
  DELAY_MS(1000);  
  PORTA=(0B00000010);
  DELAY_MS(1000);  
  PORTA=(0B00000100);
  DELAY_MS(1000);  
  PORTA=(0B00001000);
  DELAY_MS(1000);
  
  }
  
  IF (CONT==2)//SECUENCIA WAVE DRIVE//
  {
   DELAY_MS(1000);
  PORTA=(0B00000011);
  DELAY_MS(1000);  
  PORTA=(0B00000110);
  DELAY_MS(100);  
  PORTA=(0B00001100);
  DELAY_MS(1000);  
  PORTA=(0B00001001);
  DELAY_MS(1000);
  }
  IF (CONT==3)//SECUANCIA MEDIO PASO//
  {
    DELAY_MS(1000);
  PORTA=(0B00000001);
  DELAY_MS(500);  
  PORTA=(0B00000011);
  DELAY_MS(1000);  
  PORTA=(0B00000010);
  DELAY_MS(1000);  
  PORTA=(0B00000110);
  DELAY_MS(1000);
  PORTA=(0B00000100);
  DELAY_MS(1000);  
  PORTA=(0B00001100);
  DELAY_MS(1000);  
  PORTA=(0B00001000);
  DELAY_MS(1000);  
  PORTA=(0B00001001);
  DELAY_MS(1000);
  }
  IF (CONT==4)
  {
  
    CONT=0;
  }
   ENABLE_INTERRUPTS(INT_EXT);
}

#INT_EXT2
VOID ACTIVAR_EXT2 ()
{
   DELAY_MS(200);
   DISABLE_INTERRUPTS (GLOBAL);
   CONT1++;
   IF(CONT1==1)
   {
      CONTROL=1;
   }
   IF(CONT1==2)
   {
      CONTROL=0;
      UNI=0;
      UNI1=0;
      CONT=0;
   }
   
   
   DELAY_MS(200);
   ENABLE_INTERRUPTS(INT_EXT2);
}

//!////////////////////////FUNCION PRINCIPAL (MAIN)/////////////////////////////////////////

VOID MAIN (VOID)
{
   SET_TRIS_B(0B00000111);                     //SE CONFIGURA RB0 RB1 RB2 COMO ENTRADA
   SET_TRIS_D(0);                                     //SE CONFIGURA EL PUERTO D COMO SALIDA PARA LOS LEDS
   SET_TRIS_E(0);
   SET_TRIS_C(0);
   SET_TRIS_A(0);
   PORTD=0;
   PORTE=0;
   PORTC=0;
   PORTA=0;
   SETUP_ADC_PORTS(NO_ANALOGS);     //NO CANALES ANALOGOS TODOS DIGITALES
   ENABLE_INTERRUPTS(INT_EXT);            //INT_EXT HABILITADA
   ENABLE_INTERRUPTS(INT_EXT1);          //INT_EXT1 HABILITADA
   ENABLE_INTERRUPTS(INT_EXT2);          //INT_EXT2 HABILITADA
   ENABLE_INTERRUPTS(GLOBAL);           //INT GLOBALES HABILITADAS                    
   EXT_INT_EDGE(H_TO_L);                        //FLANCO DE BAJADA PARA INT EXT
   EXT_INT_EDGE(1,H_TO_L);                     //FLANCO DE BAJADA PARA INT EXT1
   EXT_INT_EDGE(2,H_TO_L);                     //FLANCO DE BAJADA PARA INT EXT2
   PORT_B_PULLUPS(TRUE);//RESISTENCIAS DE PULL-UP HABILITADAS
   WHILE(TRUE)
   {
     PORTD = VECT[UNI]; // asigna  al por D el vaor  
     PORTE = 0B001; //ende el primer display //
     DELAY_MS(10);
     PORTD = VECT[D];
     PORTE = 0B010;
     DELAY_MS(10);
     
     IF (CONTROL==1)
     {
       DELAY_MS(50);
       CONT_P++;
//!       IF(CONT_P==UNI1)
//!       {
//!         CONT_P=0;
//!         UNI1=0;
//!       }
       IF(CONT_P<=UNI1)
       {
         PORTA=PASOS[CONT_P];
         PORTC=PASOS[CONT_P];
         DELAY_MS(200);
       }
     }
     IF (CONTROL==0)
     {
       PORTA=0;
       PORTC=0; 
     }
   }  
}
 
Última edición por un moderador:
yo veo estas fallas

#INT_EXT2
VOID ACTIVAR_EXT2 ()
{
DELAY_MS(200);
DISABLE_INTERRUPTS (GLOBAL);
CONT1++;
//IF(CONT1==1)//esta linea daria problemas
if(CONT1>=1)
{
CONTROL=1;
}
//IF(CONT1==2) //esta linea daria problemas
IF(CONT1>=2)
{
CONTROL=0;
UNI=0;
UNI1=0;
CONT=0;
CONT1==0; //agregaria este pedazo para que regrese a 0
}


DELAY_MS(200); // no es necesario
ENABLE_INTERRUPTS(INT_EXT2);
}
 
Atrás
Arriba