Consejos o ayudas con codigo...

saludos a tod@s, quisiera pedirles ayuda con un proyecto algo sencillo pero que de momento me esta sacando dolores de cabeza...

en resumidas cuentas el proyecto es un control de un motor paso a paso... con ciertas condiciones, la primera es que se deben tener unos parametros, como por ejemplo escoger entre 1 y 999 pasos, escoger la velocidad de giro y escoger el sentido del giro...

hace rato termine el codigo fuente pero al momento de implementarlo en la protoboard, el pic no realiza nada, el montaje en la protoboard es totalmente igual a como lo tengo en proteus, obviamente con el cristal de 20Mhz y la resistencia del PIN 1 para que no haga Master Clear...
aca os dejo una imagen del proyecto en proteus... y el code:

agradeceria muchisimo a alguien que me puede colaborar...
gracias!

code:
PHP:
/////////////////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: [email]elprofe1988@msn.com[/email]
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses HS,NOPROTECT,NOPUT,NOWDT
#use delay (crystal=20000000)          
#include <lcd.c>

int ayudadegiro=1; 
int unidades=0, decenas=0, centenas=0, enter=0;
int ejecutar=0,referencia=0;
int16 conteo=1;
int16 velocida=100;

void botones(void){
//subrrutina usada para conocer el estado de los botones...
if(input(PIN_A0)==0&&input(PIN_A1)==1&&input(PIN_A2)==1&&input(PIN_A3)==1){
unidades=1;
}
if(input(PIN_A0)==1&&input(PIN_A1)==0&&input(PIN_A2)==1&&input(PIN_A3)==1){
decenas=1;
}
if(input(PIN_A0)==1&&input(PIN_A1)==1&&input(PIN_A2)==0&&input(PIN_A3)==1){
centenas=1;
}
if(input(PIN_A0)==1&&input(PIN_A0)==1&&input(PIN_A2)==1&&input(PIN_A3)==0){
enter=1;
}
delay_ms(30);
}

void clear(void){unidades=0;decenas=0;centenas=0;enter=0;//a fin de enviar todas las variables de pines a 0
}

void stop(void){
//evalua en que momento he presionado el pin del stop
botones();
if(centenas==1){reset_cpu();}
}

void giro1(void){
//hace un sentido de giro a la velocidad determinada
for(ejecutar=0;ejecutar<conteo;ejecutar++){
stop();
lcd_gotoxy(14,1);
printf(lcd_putc,"%d",referencia);//imprimir entero
output_B(0x6);
delay_ms(velocida);
output_B(0x5);
delay_ms(velocida);
output_B(0x9);
delay_ms(velocida);
output_B(0xa);
delay_ms(velocida);
referencia++;
}
}

void giro(void){
//segundo sentido de giro segun la variable asignada
for(ejecutar=0;ejecutar<conteo;ejecutar++){
stop();
lcd_gotoxy(14,1);
printf(lcd_putc,"%d",referencia);//imprimir entero
output_B(0xa);
delay_ms(velocida);
output_B(0x9);
delay_ms(velocida);
output_B(0x5);
delay_ms(velocida);
output_B(0x6);
delay_ms(velocida);
referencia++;
}
}



void inicializar(void){
//entrada del programa del PIC...
lcd_init();//Inicializamos el LCD
lcd_gotoxy(1,1);
lcd_putc("Future Engineers");//Borra la pantalla
delay_ms(500);
}

void tercermenu(void){
//menu # 3
//donde se selecciona el sentido de giro
clear();
lcd_putc('\f');//Borra la pantalla
for(;;){
lcd_gotoxy(1,1);
printf(lcd_putc,"Select Turn   ");//imprimir entero
delay_ms(10);
botones();
if(unidades==1){
lcd_gotoxy(1,2);
printf(lcd_putc,"Rigth Turn   ");//imprimir entero
ayudadegiro=1;clear();
}
if(decenas==1){
lcd_gotoxy(1,2);
printf(lcd_putc,"Left Turn    ");//imprimir entero
ayudadegiro=2;clear();
}

if(enter==1&&ayudadegiro==1){
if(enter==1&&ayudadegiro==1){
clear();
lcd_putc('\f');//Borra la pantalla
delay_ms(10);
lcd_gotoxy(1,1);
printf(lcd_putc,"Rigth Turn    ");//imprimir entero
delay_ms(10);
lcd_gotoxy(1,2);
printf(lcd_putc,"%ld",velocida);//imprimir entero
delay_ms(5);
lcd_gotoxy(4,2);
printf(lcd_putc,"(ms),");//imprimir entero
delay_ms(5);
lcd_gotoxy(9,2);
printf(lcd_putc,"%ld",conteo);//imprimir entero
giro();
reset_cpu();
//giro a la derecha
}
}

if(enter==1&&ayudadegiro==2){
if(enter==1&&ayudadegiro==2){
clear();
lcd_putc('\f');//Borra la pantalla
delay_ms(10);
lcd_gotoxy(1,1);
printf(lcd_putc,"Left Turn  ");//imprimir entero
delay_ms(10);
lcd_gotoxy(1,2);
printf(lcd_putc,"%ld",velocida);//imprimir entero
delay_ms(5);
lcd_gotoxy(4,2);
printf(lcd_putc,"(ms),");//imprimir entero
delay_ms(5);
lcd_gotoxy(14,2);
printf(lcd_putc,"%ld",conteo);//imprimir entero
giro1();
reset_cpu();
//giro a la izquierda
}
}

}
}

void segundapantalla(void){
//segunda pantalla donde se selecciona 
//la velocidad del motor
clear();
lcd_putc('\f');//Borra la pantalla
for(;;){
lcd_gotoxy(1,1);
printf(lcd_putc,"Steps=");//imprimir entero
lcd_gotoxy(8,1);
printf(lcd_putc,"%ld",conteo);//imprimir entero

delay_ms(5);

lcd_gotoxy(12,2);
printf(lcd_putc,"%ld",velocida);//imprimir entero
delay_ms(5);
lcd_gotoxy(1,2);
lcd_putc("Speed(ms)=");//Borra la pantalla
botones();

if(unidades==1){clear();
velocida = velocida+20;if(velocida>=2000){velocida=2000;}
}
if(decenas==1){clear();
lcd_putc('\f');//Borra la pantalla
velocida = velocida-20;
if(velocida<=0){velocida=1;}
}
if(centenas==1){clear();
velocida = 100;
}

if(enter==1){clear();
enter=0;//tercer menu
tercermenu();
//de esta forma se ejecuta el programa
}

delay_ms(20);

if(conteo>=999){conteo=999;}


}
lcd_putc('\f');//Borra la pantalla}
}

void velocidad(void){clear();
//pantalla donde se selecciona la 
//cantidad de pasos a dar...
lcd_putc('\f');//Borra la pantalla
for(;;){
lcd_gotoxy(1,1);
printf(lcd_putc,"Steps ");//imprimir entero
lcd_gotoxy(1,2);
delay_ms(10);
//printf(lcd_putc,"%u",retardo);//imprimir entero
printf(lcd_putc,"%ld",conteo);//imprimir entero

botones();
if(unidades==1){clear();
conteo++;
}
if(decenas==1){clear();
conteo=conteo+10;
}
if(centenas==1){clear();
conteo=conteo+100;
}


if(enter==1){clear();
enter=0;//funcion del primer enter...
segundapantalla();
//de esta forma se llama el segundo menu...
}

delay_ms(10);

if(conteo>=999){conteo=1;}
}
}


void main()
{
//funcion principal...
/*
asignacion de TRIS, inicializacion de la LCD
y el ciclo for inicial que hace lo q dice en velocidad...->
velocidad es donde se seleccionan los pasos
*/
clear();
SET_TRIS_A( 0x0F );
SET_TRIS_B( 0xF0 );
SET_TRIS_D( 0x00 );

inicializar();
lcd_init();
 
for(;;)
 {
velocidad();
 }
 
}



de nuevo gracias!
 

Adjuntos

  • paso a paso.rar
    71.8 KB · Visitas: 14
Última edición por un moderador:
Atrás
Arriba