#include <16f876a.h>
#device adc=10
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NODEBUG,BROWNOUT,NOCPD,NOWRT
#define LCD_ENABLE_PIN PIN_B3 ////
#define LCD_RS_PIN PIN_B1 ////
#define LCD_RW_PIN PIN_B2 ////
#define LCD_DATA4 PIN_B4 ////
#define LCD_DATA5 PIN_B5 ////
#define LCD_DATA6 PIN_B6 ////
#define LCD_DATA7 PIN_B7
#include <lcd.c>
#include <NumGran.C>
#include <internal_eeprom.c>
#use fast_io(B)
#use fast_io(c)
#use fast_io(a)
//****variables del cuneta vueltas***//
int16 contador=0,RPM,duty=0;
float ajuste=10,e;
//****variables del cuneta horas***//
int8 Segundos=0,SegundosParcial=0,Minuto=0,MinutoParcial=0;
int menu=0;
int16 b=0,service=0, Hora=0,cont=0, HoraParcial=0,mantenimiento=0;
short grabar=0,flag=0;
//*********Funciones**************************
#int_ext
void corte()
{
duty=0;
grabar=1;
}
#int_CCP1
void CCP1_isr(void)
{
cont++;
if (cont==2)
{
contador=get_timer0();
set_timer0(0);
cont=0;
// if (rpm>600)
// {
Segundos++;
SegundosParcial++;
// }
//*********Cuenta Horas Total**********************************/
if(Segundos == 60)
{
Minuto++;
Segundos=0;
if(Minuto == 60)
{
Hora++;
Minuto=0;
}
}
/**********Cuenta Horas Parcial*********************************/
if(SegundosParcial == 60)
{
MinutoParcial++;
SegundosParcial=0;
if(MinutoParcial == 60)
{
HoraParcial++;
MinutoParcial=0;
}
}
}
}
int menus(void)
{
return (menu+'1');
}
void leer_memoria()
{
Hora=read_int16_eeprom(100);
delay_ms(15);
HoraParcial=read_int16_eeprom(110);
delay_ms(15);
Minuto=read_eeprom(120);
delay_ms(15);
MinutoParcial=read_eeprom(130);
delay_ms(15);
mantenimiento=read_int16_eeprom(160);
delay_ms(15);
service=read_int16_eeprom(150);
delay_ms(15);
e=read_float_eeprom(140);
delay_ms(15);
}
void cuenta_horas()
{
lcd_gotoxy(1,1);
printf(lcd_putc
,"Par %05lu:%02u:%02u",HoraParcial
,MinutoParcial
,SegundosParcial
);
lcd_gotoxy(1,2);
printf(lcd_putc
,"Tot %05lu:%02u:%02u",Hora
,Minuto
,Segundos
); }
void cuenta_vueltas()
{
RPM= contador*e;
lcd_send_byte(0,1);
delay_us(2);
NumGran(RPM);
delay_ms(300); //aca iban 300ms
printf(lcd_putc
," %04lu ",RPM
); if ( Minuto>=mantenimiento&&mantenimiento>0)//ATENCION cambiar Minuto por horas
{
lcd_gotoxy(13,1);
lcd_putc("Mant ");//
delay_ms(500);
}
}
void back_light()
{
if(input(PIN_c4)) //Regula el backlight del lcd
{ delay_ms(100);
duty +=15;
if (duty >1023){duty = 1023;}
}
if(input(PIN_c5)) //Regula el backlight del lcd
{ delay_ms(100);
duty -=15;
if (duty > 1023){duty = 0;}
}
lcd_gotoxy(1,1);
printf(lcd_putc
," BACK LIGHT \n %04lu ",duty
); set_pwm2_duty(duty);
}
//***************************************************
void main()
{
set_tris_a(0b00010000);
output_a(0b00000000);
set_tris_c(0b01111110);// 0 = salidas
output_c(0b00000000);
set_tris_b(0b00000001);
output_b(0b00000000);
//********************pwm2************************************
setup_ccp2(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,255, 1);
set_pwm2_duty(duty);
//************************************************************
setup_adc_ports(NO_ANALOGS);
setup_timer_0(rtcc_ext_h_to_l | rtcc_div_2);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_ccp1(CCP_COMPARE_RESET_TIMER);
CCP_1 = 62500;
set_timer1(0);
set_timer0(0);
//******************INT EXT***********************************
enable_interrupts(int_ext);
ext_int_edge(h_to_l);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
//************************************************************
leer_memoria(); // Funcion para leer la memoria
lcd_init();
NumGran_Init();
lcd_gotoxy(1,1);
lcd_putc(" RPM Y HORIMETRO ");
delay_ms(2000);
lcd_putc("\f");
while(1)
{
while(grabar==1)
{
write_int16_eeprom(100, Hora);
write_int16_eeprom(110, HoraParcial);
write_eeprom(120, Minuto);
write_eeprom(130, MinutoParcial);
grabar=0;
lcd_putc("\f");
lcd_putc(" APAGANDO ");
delay_ms(500);
}
while(grabar==0)
{
if(flag==0) //Si flag ==0 me desplazo por el menu principal
{
if (input(pin_c3))
{ delay_ms(50);
while(input(pin_c3));
menu++;
if (menu>4)
menu=0;
}
}
if(flag==1) //si pulso C6 dentro del case 5 flag==1
{
if (input(pin_c3)) //Si flag ==1 me desplazo por la configuracion
{ delay_ms(50);
while(input(pin_c3));
menu++;
if (menu>9)
menu=0;
}
}
switch (menu+1)
{
case 1:cuenta_vueltas();
break;
case 2:cuenta_horas();
break;
case 3 :
service=read_int16_eeprom(150);
delay_ms(15);
lcd_gotoxy(1,1);
printf(lcd_putc
,"Proximo Service \nA las: %04lu Hs ",service
);
break;
case 4:
back_light();
break;
case 5 :
lcd_gotoxy(1,1);
printf(lcd_putc
," MENU \n Pulse enter "); if (input(pin_c6))
{ delay_ms(50);
while(input(pin_c6));
flag=1;
menu+=1;
}
break;
case 6 :
lcd_gotoxy(1,1);
printf(lcd_putc
,"Programe Service \nHoras: %04lu ",b
);
if (input(pin_c4))
{ delay_ms(200); // antirebote
b+=1;
if(b>9999)b=9999;
}
if (input(pin_c5)) // Pulsador que decrementa
{ delay_ms(200);
b-=1;
if(b>9999)b=0 ;
}
if (input(pin_c6))
{ delay_ms(50);
while(input(pin_c6));
write_int16_eeprom(150, b);
delay_ms(25);
service=read_int16_eeprom(150);
delay_ms(15);
mantenimiento=Minuto+service;//ATENCION cambiar Minuto por hora
write_int16_eeprom(160,mantenimiento);
delay_ms(15);
mantenimiento=read_int16_eeprom(160);
delay_ms(15);
lcd_gotoxy(1,1);
printf(lcd_putc
,"Proximo Service \nA las: %04lu Hs ",mantenimiento
) ; delay_ms(2000);
}
break;
case 7 : //CALIBRA RPM
e=read_float_eeprom(140);
delay_ms(15);
RPM= contador*e;
lcd_gotoxy(1,1);
printf(lcd_putc
,"Actual RPM %04lu ",RPM
); if (input(pin_c4))
{
delay_ms(200);
ajuste+=0.02; // Incremento
}
if (input(pin_c5))
{
delay_ms(200);
ajuste-=0.02; //Decremento
}
if (input(pin_c6))
{ delay_ms(50);
while(input(pin_c6));
write_float_eeprom(140, ajuste);
delay_ms(15);
}
RPM= contador*ajuste;
lcd_gotoxy(1,2);
printf(lcd_putc
,"Ajuste RPM %04lu ",RPM
); break;
case 8 :
lcd_gotoxy(1,1);
printf(lcd_putc
," RESET TOTAL "); lcd_gotoxy(1,2);
printf(lcd_putc
," %05lu:%02u:%02u ",Hora
,Minuto
,Segundos
); if (input(pin_c6)) // Reset de cuenta horas parcial
{ delay_ms(50);
while(input(pin_c6));
Hora=00000;
write_int16_eeprom(100, Hora);
delay_ms(15);
Minuto=00;
write_eeprom(120, Minuto);
delay_ms(15);
}
break;
case 9 :flag=0;
lcd_gotoxy(1,1);
printf(lcd_putc
," RESET PARCIAL "); lcd_gotoxy(1,2);
printf(lcd_putc
," %05lu:%02u:%02u ",HoraParcial
,MinutoParcial
,Segundos
); if (input(pin_c6)) // Reset de cuenta horasparcial
{ delay_ms(50);
while(input(pin_c6));
HoraParcial=00000;
write_int16_eeprom(110, HoraParcial);
delay_ms(15);
MinutoParcial=00;
write_eeprom(130, MinutoParcial);
delay_ms(15);
}
break;
default :
menu=0;
break;
}
}
}