#include <16f876a.h>
#device adc =10
#use delay (clock=8M)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <internal_eeprom.c>
#use fast_io(B)
#use fast_io(c)
#use fast_io(a)
//******declaracion de variables******************************
unsigned int16 cursor=0,toper=0,topbr=0,cero=0,ciclo_util=0,a=0,b=0;
float Ai,Ad,Bi,Bd;
//***********************************************************
void main()
{
set_tris_c(0b00000000);
output_c(0b00000000);
set_tris_b(0b11111111);
output_b(0b00000000);
//****************ADC**************************
setup_adc_ports(AN0);//* entrada analogica*//
setup_adc (ADC_CLOCK_INTERNAL);
setup_COUNTERS(RTCC_internal.rtcc_div_8);
// *************PWM**************************************
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,255, 1);
set_pwm1_duty(ciclo_util);
//**************Lectura de Valores**********************
toper=read_int16_eeprom(0x120);
delay_ms(15);
topbr=read_int16_eeprom(0x122);
delay_ms(15);
cero=read_int16_eeprom(0x126);
delay_ms(15);
//**************Cuentas************************************
Ai = (float)511 / (cero-topbr);
Bi = ((float)-511*topbr)/(cero-topbr);
Ad = (float)512 / (toper-cero);
Bd = 511 - (((float)512*cero)/(toper-cero));
WHILE (1)
{
set_pwm1_duty(ciclo_util);
set_adc_channel (0);
delay_us (20);
cursor = read_adc ();
//*********************************************
// Programacion
//*********************************************
if (input(pin_b4)==0)//configuracion
{
output_high (PIN_c0);//enciendo led aviso de configuracion
output_low (PIN_c5);// Desactivo ambos limites
output_low(PIN_c6);// de carrera para configuracion
if (input(pin_b1)==1)// configuro limite derecho toper
{
if (input(pin_b0)==1)//boton que graba en la eeprom
{
delay_ms(20);
write_int16_eeprom(0x120,(int16) cursor);// escribe en la memoria toper
toper=read_int16_eeprom(0x120); // lee para hacer las cuentas
delay_ms(15);
Ad = (float)512 / (toper-cero);
Bd = 511 - (((float)512*cero)/(toper-cero));
}
}
if (input(pin_b2)==1)// configuro limite izquierdo topbr
{
if (input(pin_b0)==1)//boton que graba en la eeprom
{
delay_ms(20);
write_int16_eeprom(0x122,(int16) cursor);// escribe en la memoria topbr
topbr=read_int16_eeprom(0x122); // lee para hacer las cuentas
delay_ms(15);
Ai = (float)511 / (cero-topbr);
Bi = ((float)-511*topbr)/(cero-topbr);
}
}
//****************CERO************************
if (input(pin_b3)==1)
{
if (input(pin_b0)==1)//boton que graba en la eeprom
{
delay_ms(20);
write_int16_eeprom(0x126,(int16) cursor);// escribe en la memoria
cero=read_int16_eeprom(0x126); // lee para hacer las cuentas
delay_ms(15);
Ai = (float)511 / (cero-topbr);
Bi = ((float)-511*topbr)/(cero-topbr);
Ad = (float)512 / (toper-cero);
Bd = 511 - (((float)512*cero)/(toper-cero));
}
}
}
//********************************************
// Funcionamiento normal
//********************************************
if (input(pin_b4)==1)//switch que habilita el funcionamiemto
{
if (topbr<cero && cero<toper)// si se cumple entra en funcionamiento
{
output_low (PIN_c0);//apago led de configuracion
if ( cursor < topbr && cursor > 0)
{
output_low(PIN_c6);
output_high (PIN_c5);
ciclo_util=0;
}
if (cursor>toper &&cursor<1023)
{
output_high(PIN_c6);//led************************
output_low (PIN_c5);
ciclo_util=1023;
}
if(cursor>cero && cursor< toper)
{
a = Ad*cursor + Bd;
ciclo_util = a ;
output_low (PIN_c5);
output_low(PIN_c6);
}
if (cursor<cero &&cursor >topbr)
{
b = Ai*cursor + Bi;
ciclo_util = b ;
output_low (PIN_c5);
output_low(PIN_c6);
}
if (cursor == cero)
{
ciclo_util=511;
output_low (PIN_c5);
output_low(PIN_c6);
}
}
else
{
output_toggle (PIN_c0);// si esta mal configurado
}
}
}
}