#include <16f877a.h>
#fuses HS,NOPROTECT,NOWDT,PUT,NOLVP,BROWNOUT
#use delay(clock=20M)
#include <flex_lcd.c>
#byte portb=6
#byte portc=7
#byte portd=8
#use standard_io(b)
#use fast_io(c)
#use fast_io(d)
#define VEL_CRYSTAL 0.000000200
#bit RBIF=0x0B.0
boolean flagOK=FALSE,flagDistancia=FALSE,flagVelocidad=FALSE,flagSentido=FALSE;
int punteroDistancia=0,punteroVelocidad=0,punteroSentido=0,interrupciones=0,last_b,lastb=0b11110001,PUNTERO=0,cm=0;
unsigned long PASOS=300,CARGAT1=45000;
float NEW_PASOS=0,TIEMPO=0,PPS=0;
void secuencia_PCHorario(void);
void secuencia_PCAntihorario(void);
void resetLCD(void);
void calculo_Velocidad(void);
#INT_TIMER1
RSI_tmr1()
{
set_timer1(CARGAT1);
++PUNTERO;
if (PUNTERO==5)
PUNTERO=0;
--PASOS;
}
#INT_EXT
RSI_intext()
{
while(!input(PIN_B0))
{
if(interrupciones==TRUE)
{
resetLCD();
lcd_putc("Ok!");
delay_ms(100);
}
}
if(interrupciones==TRUE)
{
flagOK=TRUE;
interrupciones=FALSE;
resetLCD();
PASOS=NEW_PASOS;
printf(lcd_putc,"PASOS=\n%lu",PASOS);
}
else if(interrupciones==FALSE)
{
flagOK=FALSE;
flagVelocidad=FALSE;
flagDistancia=FALSE;
flagSentido=FALSE;
}
}
#INT_RB
RSI_rb()
{
byte changes;
changes=last_b ^ portb;
if(lastb == portb)
interrupciones=TRUE;
else
{
interrupciones=FALSE;
}
last_b=portb;
lastb=portb;
if ( bit_test(changes,4) && !bit_test(last_b,4) )
{
while(!input(PIN_B4))
{
}
delay_ms(50);
if(interrupciones==FALSE)
{
resetLCD();
lcd_putc("Sentido\nGiro");
}
flagOK=FALSE;
flagVelocidad=FALSE;
flagDistancia=FALSE;
flagSentido=TRUE;
if((++punteroSentido) == 3)
punteroSentido=1;
}
else if( bit_test(changes,5) && !bit_test(last_b,5) )
{
while(!input(PIN_B5))
{
}
delay_ms(50);
}
else if ( bit_test(changes,6) && !bit_test(last_b,6) )
{
while(!input(PIN_B6))
{
}
delay_ms(50);
if(interrupciones==FALSE)
{
resetLCD();
lcd_putc("Ingrese\nPasos");
}
flagOK=FALSE;
flagVelocidad=FALSE;
flagDistancia=TRUE;
flagSentido=FALSE;
if((punteroDistancia++) == 5)
punteroDistancia=1;
}
else if ( bit_test(changes,7) && !bit_test(last_b,7) )
{
while(!input(PIN_B7))
{
}
delay_ms(50);
if(interrupciones==FALSE)
{
resetLCD();
lcd_putc("Ingrese\nVel");
}
flagOK=FALSE;
flagVelocidad=TRUE;
flagDistancia=FALSE;
flagSentido=FALSE;
if((punteroVelocidad++) == 13)
punteroVelocidad=1;
}
set_timer1(CARGAT1);
portb=0b11110001;
}
void main(void)
{
set_tris_b(0b11110001);
port_b_pullups(TRUE);
portb=0b11110001;
ext_int_edge( 0,H_TO_L );
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
set_tris_c(0);
set_tris_d(0);
lcd_init();
portd=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"Ingrese\nParametr");
delay_ms(1000);
enable_interrupts(INT_EXT);
input(PIN_B1); //Aqui se lee el puerto
enable_interrupts(INT_RB);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
last_b=0b11110001;
set_timer1(CARGAT1);
while(1)
{
last_b=portb;
if ((interrupciones==TRUE) && (flagDistancia==TRUE))
{
flagDistancia=0;
switch (punteroDistancia)
{
case 1:
{
cm=1;
}
break;
case 2:
{
cm=10;
}
break;
case 3:
{
cm=15;
}
break;
case 4:
{
cm=20;
}
break;
case 5:
{
cm=25;
}
break;
}
resetLCD();
printf(lcd_putc,"Dis/Mot\n(cm)=%d ",cm);
NEW_PASOS=cm/0.0042;
}
if ((interrupciones==TRUE) && flagVelocidad==TRUE)
{
flagVelocidad=0;
switch (punteroVelocidad)
{
case 1:
{
CARGAT1=35000;
}
break;
case 2:
{
CARGAT1=37500;
}
break;
case 3:
{
CARGAT1=40000;
}
break;
case 4:
{
CARGAT1=42500;
}
break;
case 5:
{
CARGAT1=45000;
}
break;
case 6:
{
CARGAT1=47500;
}
break;
case 7:
{
CARGAT1=50000;
}
break;
case 8:
{
CARGAT1=52500;
}
break;
case 9:
{
CARGAT1=55000;
}
break;
case 10:
{
CARGAT1=57500;
}
break;
case 11:
{
CARGAT1=60000;
}
break;
case 12:
{
CARGAT1=62500;
}
break;
case 13:
{
CARGAT1=63200;
}
break;
}
resetLCD();
calculo_Velocidad();
}
if ((interrupciones==TRUE) && (flagSentido==TRUE))
{
flagSentido=0;
resetLCD();
switch (punteroSentido)
{
case 1:
{
lcd_putc("Giro \nHorario ");
}
break;
case 2:
{
lcd_putc("Giro \nAntiHor.");
}
break;
}
}
if (flagOK)
{
if(punteroSentido==1)
secuencia_PCHorario();
else if(punteroSentido==2)
secuencia_PCAntihorario();
else
secuencia_PCHorario();
if(PASOS==0) //Estos son 5.000 pasos (en 1/2 paso)y un recorrido de 25.1 cm con mi unipolar
{
disable_interrupts(INT_TIMER1);
PASOS=(unsigned long) NEW_PASOS;
portc=0;
delay_ms(1000); //Original 200.
lcd_putc("\f");
printf(lcd_putc,"PASOS=\n%lu",PASOS);
enable_interrupts(INT_TIMER1);
set_timer1(CARGAT1);
}
}
}
}
void secuencia_PCHorario(void)
{
if(PUNTERO==4)
{
PUNTERO=0;
}
switch(PUNTERO)
{
case 0:
{
portc=0b11000000;
}
break;
case 1:
{
portc=0b01100000;
}
break;
case 2:
{
portc=0b00110000;
}
break;
case 3:
{
portc=0b10010000;
}
}
}
void secuencia_PCAntihorario(void)
{
if(PUNTERO==4)
{
PUNTERO=0;
}
switch(PUNTERO)
{
case 0:
{
portc=0b00110000;
}
break;
case 1:
{
portc=0b01100000;
}
break;
case 2:
{
portc=0b11000000;
}
break;
case 3:
{
portc=0b10010000;
}
}
}
void resetLCD(void)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
delay_ms(50);
}
void calculo_Velocidad(void)
{
TIEMPO =(65535 - CARGAT1)/2;
TIEMPO =(TIEMPO * 8)* VEL_CRYSTAL;
PPS = 1/TIEMPO;
printf(lcd_putc,"Vel/Mot\npps=%lu ",(unsigned long)PPS);
}