Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/03/2011 #1


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:
Código 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=0decenas=0centenas=0enter=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_A0x0F );
SET_TRIS_B0xF0 );
SET_TRIS_D0x00 );

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



de nuevo gracias!
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.