Hola !
Estoy haciendo un driver para un motor a pasos unipolar. Uso 2 micros, uno emulando al PLC (ahi le dices que velocidad quieres, tipo, direccion y cantidad de pasos. El otro recibe los datos y hace la secuencia de giro del motor.
Tengo el problema de que... no pasa nada. El primer micro funciona perfecto, envia los datos bien y muestra todo en la pantalla LCD. Estoy seguro de que el error esta en la llegada de los datos al segundo micro. Lo sé porque puse un if con para el valor que envio, y PORTB deberia cambiar de estado pero no lo hace. Sé que si cambia entre bucles while, porque ya habia puesto un 'PORTB=0xXX' entre ellos y lo hacia.
No se como hacerlo correctamente, ya que he intentado muchas formas distintas.
La cantidad de pasos la envio al primer micro mediante serial con la computadora.
RA1 de ambos micros están unidos y van a un push.
Uso dos PIC18f4550 y compilador mikroc. Adjunto los códigos.
CODIGO TRANSMISOR (uC 1)
CODIGO RECEPTOR (uC 2)
...
Estoy haciendo un driver para un motor a pasos unipolar. Uso 2 micros, uno emulando al PLC (ahi le dices que velocidad quieres, tipo, direccion y cantidad de pasos. El otro recibe los datos y hace la secuencia de giro del motor.
Tengo el problema de que... no pasa nada. El primer micro funciona perfecto, envia los datos bien y muestra todo en la pantalla LCD. Estoy seguro de que el error esta en la llegada de los datos al segundo micro. Lo sé porque puse un if con para el valor que envio, y PORTB deberia cambiar de estado pero no lo hace. Sé que si cambia entre bucles while, porque ya habia puesto un 'PORTB=0xXX' entre ellos y lo hacia.
No se como hacerlo correctamente, ya que he intentado muchas formas distintas.
La cantidad de pasos la envio al primer micro mediante serial con la computadora.
RA1 de ambos micros están unidos y van a un push.
Uso dos PIC18f4550 y compilador mikroc. Adjunto los códigos.
CODIGO TRANSMISOR (uC 1)
Código:
while(1)
{
i=0;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Driver Stepper");
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
while((PORTA.RA1)==0) //Velocidad
{
if((PORTE.RE0)==1)
{vel++; Delay_ms(500); Lcd_Cmd(_LCD_CLEAR);}
if((PORTE.RE1)==1)
{vel--; Delay_ms(500); Lcd_Cmd(_LCD_CLEAR);}
memset(Vel1, \'\\0\', 10);
sprintf(Vel1,"%d",vel);
strcpy(Vel2,Vel1);
Lcd_Out(1,4,"Velocidad:");
Lcd_Out(2,5,Vel2);
Lcd_Out(2,7," p/seg");
}
UART1_Write(vel);
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
//UART1_Write(0xFF);
while((PORTA.RA1)==0) //Direccion
{
if((PORTE.RE2)==1)
{
switch(dir)
{
case 1: dir=0; break;
case 0: dir=1; break;
}
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
}
sprintf(Dir1,"%d",dir);
memset(Dir2, \'\\0\', 10);
if(dir==1){strcpy(Dir2,"Reloj");}
if(dir==0){strcpy(Dir2,"Contra");}
Lcd_Out(1,4,"Direccion:");
Lcd_Out(2,5,Dir2);
}
UART1_Write(dir);
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
//UART1_Write(0xFF);
while((PORTA.RA1)==0) //Tipo de paso
{
if((PORTA.RA2)==1)
{
tipo+=1;
if(tipo>3){tipo=1;}
memset(T,\'\\0\',10);
sprintf(T,"%d",tipo);
strcpy(Tipo1,T);
switch(tipo)
{
case 1: strcpy(NMW,"Normal");break;
case 2: strcpy(NMW,"Medio");break;
case 3: strcpy(NMW,"Wave");break;
}
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
}
Lcd_Out(1,1," Tipo de paso: ");
Lcd_Out(2,5,NMW);
}
UART1_Write(tipo);
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
//UART1_Write(0xFF);
while((PORTA.RA1)==0) //Cantidad de pasos
{
if (UART1_Data_Ready()) // If data is received,
{
UART1_Read_Text(&uart_rd, "OK", 255); // reads text until \'OK\' is found
strcpy(tum,&uart_rd);
paaso=atoi(tum);
Lcd_Cmd(_LCD_CLEAR);
}
Lcd_Out(1,1," Pasos: ");
Lcd_Out(2,7,tum);
}
UART1_Write(paaso);
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
//UART1_Write(0xFF);
while((PORTA.RA1)==0)
{
Lcd_Out(1,1,"Al finalizar");
Lcd_Out(2,1,"Presiona RA1");
}
}
CODIGO RECEPTOR (uC 2)
Código:
while(1)
{
Delay_ms(500);
while((PORTA.RA1)==0) //Recibe Velocidad
{
if (UART1_Data_Ready()) // If data is received,
{
recibe=UART1_Read(); // reads UART
vel=recibe;
}
}
recibe=0;
Delay_ms(500);
if(vel==2){PORTB=0x90;}
while((PORTA.RA1)==0) //Recibe direccion
{
if (UART1_Data_Ready()) // If data is received,
{
recibe=UART1_Read(); // reads UART
dir=recibe;
}
}
recibe=0;
Delay_ms(500);
if(dir==1){PORTB=0x60;}
while((PORTA.RA1)==0) //Recibe tipo de paso
{
if (UART1_Data_Ready()) // If data is received,
{
recibe=UART1_Read(); // reads UART
T=recibe;
}
}
recibe=0;
Delay_ms(500);
if(T==3){PORTB=0x30;}
while((PORTA.RA1)==0) //Recibe pasos
{
if (UART1_Data_Ready()) // If data is received,
{
recibe=UART1_Read(); // reads UART
pasos=recibe;
}
}
recibe=0;
flg2=0;
Delay_ms(500);
if(pasos==40){PORTB=0x90;}
Última edición: