#include <16f877a.h>
#fuses xt,nowdt,noprotect,nolvp
#use delay (clock = 4000000)
#include <stdlib.h>
#include <kbd.c>
#include <lcd.c>
#include <stdio.h>
signed int32 prodx=0,prodx2=0,divisionx=0,divisionx2=0,moverx=0,moverz=0,cont_x=0
,totalx=0,cont_z=0,totalz=0,cont_y=0;
char PWMH=0, PWML=0, k;
int i,j,cuenta;
char x[3];//matrices p guardar las coord
int16 pos_ingrx,pos_ingrz;
void home (void)
{
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C1);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C1);//pulso bajo
lcd_putc( "\fPuesta a cero");
output_low(PIN_C0);//cero en la otra entrada del puente H
output_low(PIN_C2);//cero en los otros H
output_low(PIN_C3);
output_low(PIN_C4);
output_low(PIN_C5);
}while(input(PIN_A0)!=0);// mientras sensor x final es !=1 mover motor
output_low(PIN_C0);//apaga el motor una vez q llego al final
output_low(PIN_C1);
lcd_putc( "\fListo");
delay_ms(500);
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C3);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C3);//pulso bajo
lcd_putc( "\fPuesta a cero");
output_low(PIN_C2);//cero en la otra entrada del puente H
output_low(PIN_C4);//cero en el otro H
output_low(PIN_C5);
}while(input(PIN_A2)!=0);
output_low(PIN_C2);
output_low(PIN_C3);
lcd_putc( "\fListo");
delay_ms(500);
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C5);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C5);//pulso bajo
lcd_putc( "\fPuesta a cero");
output_low(PIN_C4);//cero en la otra entrada del puente H
}while(input(PIN_A4)!=0);
output_low(PIN_C4);
output_low(PIN_C5);
lcd_putc( "\fListo");
delay_ms(500);
}
void escanear_recorrido (void)
{
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C0);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C0);//pulso bajo
cont_x=cont_x+1;// contar pulsos de x
lcd_putc( "\fEscaneando");
output_low(PIN_C1);//cero en la otra entrada del puente H
}while(input(PIN_A1)!=0);// mientras sensor x final es !=1 mover motor
output_low(PIN_C0);//apaga el motor una vez q llego al final
output_low(PIN_C1);
printf(lcd_putc
,"\fx=%ld y=%ld z=%ld",cont_x
,cont_y
,cont_z
); delay_ms(4000);
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C2);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C2);//pulso bajo
cont_y=cont_y+1;
lcd_putc( "\fEscaneando");
output_low(PIN_C3);//cero en la otra entrada del puente H
}while(input(PIN_A3)!=0);
output_low(PIN_C2);
output_low(PIN_C3);
printf(lcd_putc
,"\fx=%ld y=%ld",cont_x
,cont_y
); lcd_gotoxy(1,2);
printf(lcd_putc
,"z=%ld",cont_z
); delay_ms(4000);
do
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C4);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C4);//pulso bajo
cont_z=cont_z+1;
lcd_putc( "\fEscaneando");
output_low(PIN_C5);//cero en la otra entrada del puente H
}while(input(PIN_A5)!=0);
output_low(PIN_C4);
output_low(PIN_C5);
printf(lcd_putc
,"\fx=%ld y=%ld",cont_x
,cont_y
); lcd_gotoxy(1,2);
printf(lcd_putc
,"z=%ld",cont_z
); delay_ms(4000);
}
//Escalas de X
void escala (void)
{
prodx=cont_x*100;//conversion a otra escala 0-100
divisionx=prodx/totalx;
}
void escala2(void)
{
prodx2=moverx*totalx;
divisionx2=prodx2/100;
}
//Escalas de Z
void escala_z (void)
{
prodx=cont_z*100;//conversion a otra escala 0-100
divisionx=prodx/totalz;
}
void escala2_z(void)
{
prodx2=moverz*totalz;
divisionx2=prodx2/100;
}
void motor_y(void)
{
//*** MOVER MOTOR Y***
lcd_gotoxy(1,1);
lcd_putc("\fManeje altura(Y) ");
lcd_gotoxy(1,2);
lcd_putc("manualmente ");
delay_ms(5000);
lcd_putc("\f");
evaluar:
do
{
lcd_gotoxy(1,1);
lcd_putc("ARRIBA=1 ABAJO=3");
lcd_gotoxy(1,2);
lcd_putc("TERMINAR=0");
k=kbd_getc();
}while(k=='\0');
do{//hacer esto mientras no se presione cero
printf(lcd_putc
,"\fy=%ld",cont_y
); while(k =='1') //girar hacia la derecha
{
if(input(PIN_A3)==0){
output_low(PIN_C2);
output_low(PIN_C3);
lcd_gotoxy(1,1);
lcd_putc("\fFin de carrera");
delay_ms(1000);
goto evaluar;
}
for(j=11;j>0;j--)
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C2);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C2);//pulso bajo
cont_y=cont_y+1;
printf(lcd_putc
,"\fy=%ld",cont_y
); }
k=kbd_getc();
while(k=='\0')//apago motor y
{
output_low(PIN_C2);
output_low(PIN_C3);
k=kbd_getc();
}
goto evaluar;
}
while(k =='3') //girar hacia la izquierda
{
if(input(PIN_A2)==0){
output_low(PIN_C2);
output_low(PIN_C3);
lcd_gotoxy(1,1);
lcd_putc("\fInicio d carrera");
delay_ms(1000);
goto evaluar;
}
for(j=11;j>0;j--)
{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C3);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C3);//pulso bajo
cont_y=cont_y-1;
printf(lcd_putc
,"\fy=%ld",cont_y
); }
k=kbd_getc();
while(k=='\0')//apago motor y
{
output_low(PIN_C2);
output_low(PIN_C3);
k=kbd_getc();
}
goto evaluar;
}
}while(k !='0');
delay_ms(500);
}
void main()
{
lcd_init();
kbd_init();
PORT_B_PULLUPS(TRUE);
home ();
escanear_recorrido ();
totalx=cont_x;
totalz=cont_z;
loop00:
escala();
printf(lcd_putc
,"\fx=%ld",divisionx
);//muestro posiciones actuales lcd_gotoxy(6,1);
printf(lcd_putc
,"y=%ld",cont_y
); lcd_gotoxy(1,2);
escala_z();
printf(lcd_putc
,"z=%ld",divisionx
); lcd_gotoxy(8,2);
lcd_putc("mover?[s/n]:");//pregunto si kiere mover motores
loop://**MOVER MOTOR X**
do
{
lcd_gotoxy(13,2);
lcd_putc("S/N");
k=kbd_getc();
}while(k=='\0');//hacer esto mientras no se presiona teclado
if(k!='*')
{
if(k!='#')
{
lcd_gotoxy(1,1);
lcd_putc("\finvalido");
goto loop;
}else{
goto loop;
}
}
else
{
loop0:
lcd_gotoxy(1,1);
lcd_putc("\fIngrese tres dig");
lcd_gotoxy(1,2);
lcd_putc("entre 0-100");
delay_ms(4000);
lcd_putc("\fpor cada coord");
delay_ms(4000);
}
lcd_putc("\f");// borrado de la pantalla
lcd_gotoxy(1,1);//nos posicionamos en (1,1)
loop2:
lcd_putc("\fx=");
i=0; //posicion de la matriz
while(i<=2){ //para tres datos
k=kbd_getc();//leer teclado
if(k!='\0') // si se ha pulsado alguna tecla
{
switch(i)
{
case 0:
lcd_gotoxy(3,1);
break;
case 1:
lcd_gotoxy(4,1);
break;
case 2:
lcd_gotoxy(5,1);
delay_ms(4000);
break;
}
x[i]=k;//se guarda en la posicion correspondiente
i++;//de la matriz
}
}
if(pos_ingrx>100){
lcd_putc("\fNumero invalido");
delay_ms(600);
goto loop0;
}
loop3:
do
{
lcd_gotoxy(1,2);
lcd_putc("Confirmar?:S/N");
k=kbd_getc();//leer teclado}
}while(k=='\0');
lcd_gotoxy(2,1);
if(k!='*')
{
if(k!='#')
{
lcd_gotoxy(1,1);
lcd_putc("\finvalido");
goto loop3;
}else{
goto loop2;
}
}
else
{
lcd_putc("\fconfirmado");
delay_ms(500);
}
escala();//convierte cont_x a divisionx(pulsos)
moverx=pos_ingrx-divisionx;
delay_ms(4000);
if(moverx==0)
{
output_low(PIN_C0);//pulso bajo
output_low(PIN_C1);
lcd_gotoxy(1,1);
printf(lcd_putc
,"\fx=%ld",divisionx
); }else
{
if(moverx>0)//girar hacia la derecha(avanza)
{
if(input(PIN_A1)==0){
output_low(PIN_C0);
output_low(PIN_C1);
lcd_gotoxy(1,1);
lcd_putc("\fFin de carrera");
delay_ms(1000);
goto loop0;
}
escala2();//convierte moverx a pulsos
output_low(PIN_C1);
do{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C0);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C0);//pulso bajo
divisionx2=divisionx2-1;
cont_x=cont_x+1;
escala();
cuenta=divisionx;
printf(lcd_putc
,"\fx=%d",cuenta
); }while(divisionx2!=0);
output_low(PIN_C0);
output_low(PIN_C1);
}else//sino mover a la izq (retrocede)
{
if(input(PIN_A0)==0){
output_low(PIN_C0);
output_low(PIN_C1);
lcd_gotoxy(1,1);
lcd_putc("\fInicio Carrera");
delay_ms(1000);
goto loop0;
}
escala2();//convierte moverx a pulsos
output_low(PIN_C0);
do{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C1);
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C1);
divisionx2=divisionx2+1;//divisionx2 es vble moverx pasada a pulsos
cont_x=cont_x-1;
escala();
cuenta=divisionx;
printf(lcd_putc
,"\fx=%d",cuenta
); }while(divisionx2!=0);
output_low(PIN_C0);
output_low(PIN_C1);//detiene motor
}
}
delay_ms(1000);
//**MOVER MOTOR Z**
loop2z:
lcd_putc("\fz=");
i=0; //posicion de la matriz
while(i<=2){ //para tres datos
k=kbd_getc();//leer teclado
if(k!='\0') // si se ha pulsado alguna tecla
{
switch(i)
{
case 0:
lcd_gotoxy(3,1);
break;
case 1:
lcd_gotoxy(4,1);
break;
case 2:
lcd_gotoxy(5,1);
delay_ms(4000);
break;
}
x[i]=k;//se guarda en la posicion correspondiente
i++;//de la matriz
}
}
if(pos_ingrz>100){
lcd_putc("\fNumero invalido");
delay_ms(600);
goto loop2z;
}
loop3z:
do
{
lcd_gotoxy(1,2);
lcd_putc("Confirmar?:S/N");
k=kbd_getc();//leer teclado}
}while(k=='\0');
lcd_gotoxy(2,1);
if(k!='*')
{
if(k!='#')
{
lcd_gotoxy(1,1);
lcd_putc("\finvalido");
goto loop3z;
}else{
goto loop2z;
}
}
else
{
lcd_putc("\fconfirmado");
delay_ms(500);
}
escala_z();
moverz=pos_ingrz-divisionx;
if(moverz==0)
{
output_low(PIN_C4);//pulso bajo
output_low(PIN_C5);
lcd_gotoxy(1,1);
printf(lcd_putc
,"\fz=%ld",divisionx
); delay_ms(500);
}else
{
if(moverz>0)//girar hacia la derecha
{
if(input(PIN_A5)==0){
output_low(PIN_C4);
output_low(PIN_C5);
lcd_gotoxy(1,1);
lcd_putc("\fFin de carrera");
delay_ms(1000);
goto loop2z;
}
escala2_z();//convierte moverz a pulsos
output_low(PIN_C5);
do{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C4);//pulso alto
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C4);//pulso bajo
divisionx2=divisionx2-1;
cont_z=cont_z+1;
escala_z();
cuenta=divisionx;
printf(lcd_putc
,"\fz=%d",cuenta
); }while(divisionx2!=0);
output_low(PIN_C4);
output_low(PIN_C5);//detiene motor
}else//sino mover a la izq
{
if(input(PIN_A4)==0){
output_low(PIN_C4);
output_low(PIN_C5);
lcd_gotoxy(1,1);
lcd_putc("\fInicio carrera");
delay_ms(1000);
goto loop2z;
}
escala2_z();//convierte moverz a pulsos
output_low(PIN_C4);
do{
for(PWMH=175;PWMH>0;PWMH--)
output_high (PIN_C5);
for(PWML=325;PWML>0;PWML--)
output_low(PIN_C5);
divisionx2=divisionx2+1;//divisionx2 es vble moverx pasada a pulsos
cont_z=cont_z-1;
escala_z();
cuenta=divisionx;
printf(lcd_putc
,"\fz=%d",cuenta
); }while(divisionx2!=0);
output_low(PIN_C4);
output_low(PIN_C5);//detiene motor
}
delay_ms(500);
}
motor_y();
loop4: // electroiman
do
{
lcd_gotoxy(1,1);
lcd_putc("Tomar pieza *");
lcd_gotoxy(1,2);
lcd_putc("soltar pieza #");
k=kbd_getc();
}while(k=='\0');//hacer esto mientras no se presiona teclado
if(k!='*')
{
if(k!='#')
{
lcd_gotoxy(1,1);
lcd_putc("\finvalido");
delay_ms(1000);
goto loop4;
}else{
output_low (PIN_C6);
lcd_putc("\fIman desactivado");
delay_ms(1000);
goto loop00;
}
}
else
{
output_high (PIN_C6);
lcd_putc("\fIman Activado");
delay_ms(5000);
goto loop00;
}
}