#include <16f876.h>
#fuses XT, NOWDT
#use delay(clock = 4000000)
#use standard_io(B)
#use standard_io(C)
int16 i,j,k,l;
int1 parar = 0 , inversion = 0 , CW = 1 ;
enum {PARADA,ACEL,MARCHA,DESAC} ;
int16 duty = 0 ;
int8 estado = PARADA ;
#define PULS_marcha input(pin_b0)
#define PULS_parada input(pin_b1)
#define PULS_invert input(pin_b2)
#define LED_DETENIDO pin_c5
#define LED_AH pin_c6
#define LED_H pin_c7
#BYTE portc = getenv("SFR:PORTC")
#define LEDS_MARCHA {portc&=0b00011111 ; output_high(CW ? LED_H : LED_AH) ;}
#define LEDS_DETENIDO {portc&=0b00011111 ; output_high(LED_DETENIDO) ;}
void main()
{
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);
set_pwm1_duty(0);
set_pwm2_duty(0);
output_high(pin_c3);
LEDS_DETENIDO ;
for(;;){
switch(estado){
case PARADA:
if(PULS_marcha){ LEDS_MARCHA ;
parar = 0 ;
estado = ACEL ;
}
if(PULS_invert){ CW = !CW ; delay_ms(250) ; }
break ;
case ACEL:
if(duty<999){
duty++ ;
CW ? set_pwm1_duty(duty) : set_pwm2_duty(duty) ;
}
else // terminó el ciclo de aceleracion
estado = (inversion || parar) ? DESAC : MARCHA ;
if(PULS_parada) parar = 1 ;
if(PULS_invert) inversion = 1 ;
break ;
case MARCHA:
if(PULS_invert){ inversion = 1 ; estado = DESAC ;}
if(PULS_parada){ parar = 1 ; estado = DESAC ;}
break ;
case DESAC:
if(duty>0){
duty-- ;
CW ? set_pwm1_duty(duty) : set_pwm2_duty(duty) ;
}
else { // terminó el ciclo de desaceleracion
if(inversion){
CW=!CW ;
inversion=0 ;
LEDS_MARCHA
estado = ACEL ;
}
else {
LEDS_DETENIDO ;
estado = PARADA ;
}
}
}
delay_ms(5) ;
}
}