#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,topbr,cero,ciclo_util=0;
float Ai,Ad,Bi,Bd;
//***********************************************************
void main()
{
int i;
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);
//**************Recupero Valores************************
//Aqui sis se reinicio tomo los valores , los calculo para lo que esta guardado en el EEPROM
toper=read_int16_eeprom(0x120);
delay_ms(15);
topbr=read_int16_eeprom(0x122);
delay_ms(15);
cero=read_int16_eeprom(0x124);
Ai = (float)511 / (cero-toper); // Valores recta izquierda y derecha:
Bi = ((float)-511*toper)/(cero-toper); // Yi = Ai*X +Bi
Ad = (float)512 / (topbr-cero); // Yd = Ad*x +Bd
Bd = 511 - (((float)512*cero)/(topbr-cero));
WHILE (1)
{
set_adc_channel (0);
delay_us (20);
for(i=0;i<8;i++) //Promediado del ADC
{
cursor = read_adc ();
}
cursor /= 8;
//*********************************************
// Programacion
//*********************************************
if (input(pin_b4)==0) // switch que habilita la configuracion de parametros
{
if (input(pin_b1)==1) // switch que habilita para establecer
{ // el limite izquierdo ( toper)
delay_ms(20); // Antirebote
while(input(pin_b1)); // Espero hasta que suelte
if(cursor!=toper && cero>toper)
{
// Introducir comprobacion de rangos
write_int16_eeprom(0x120, cursor); // escribe en la memoria
Ai = (float)511 / (cero-toper); // Calcula los nuevos coeficientes de la izquierda
Bi = ((float)-511*toper)/(cero-toper);
}
}
if (input(pin_b2)==1) //switch que habilita para establecer
{ // el limite derecho ( topbr)
delay_ms(20); // Antirebote
while(input(pin_b2)); // Espero hasta que suelte
if(cursor!=topbr && cero<topbr)
{
// Introducir comprobacion de rangos
write_int16_eeprom(0x122, cursor); // escribe en la memoria
Ad = (float)512 / (topbr-cero); // Calcula los coeficientes de la derecha
Bd = 511 - (((float)512*cero)/(topbr-cero));
}
if (input(pin_b3)==1) // switch que habilita para establecer
{ // el centro (cero)
delay_ms(20); // Antirebote
while(input(pin_b3)); // Espero hasta que suelte
if(cursor!=cero)
{
// Introducir comprobacion de rangos
write_int16_eeprom(0x124, cursor); // escribe en la memoria
Ai = (float)511 / (cero-toper); // Calcula ambos coeficientes ya que
Bi = ((float)-511*toper)/(cero-toper); // cambia el centro y cambian ambas rectas
Ad = (float)512 / (topbr-cero);
Bd = 511 - (((float)512*cero)/(topbr-cero));
}
}
}
//********************************************
// Funcionamiento normal
//********************************************
if (input(pin_b4)==1)//switch que habilita el funcionamiemto
{
if(cursor<topbr){cursor=topbr;} // Fijo los limites de la entrada
if(cursor>toper){cursor=toper;}
if(cursor>cero) // Caso que Cursor sea mayor a cero
{ // Es decir lado derecho
a = (Ad*cursor) + Bd;
}
else if (cursor<cero) // Caso Cursor sea menor a 0
{ // Es decir lado izquierdo
a = (Ai*cursor) + Bi;
}
else // Caso que cursor este al medio
{
a=511;
}
if(a!=ciclo_util) // Luego de los calculos
{ // Si cambia lo actualizo al duty
set_pwm1_duty(a);
ciclo_util=a;
}
}
}
}