#include <16f876a.h>
#device adc=10
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NODEBUG,BROWNOUT,NOCPD,NOWRT
#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,i;
float ajuste=10,e;
//****variables del cuneta horas***//
int8 Segundos=0,SegundosParcial=0,Minuto=0,MinutoParcial=0;
int menu=0;
int16 b,service=1,corte, Hora=0,cont=0, HoraParcial=0,mantenimiento=0;
//*********Funciones**************************
int menus(void)
{ return (menu+'1');
}
void corte_alimentacion(void) // si la alimentacion es menor que 4,5 Volt
{
write_int16_eeprom(100, Hora);
delay_ms(15);
write_int16_eeprom(110, HoraParcial);
delay_ms(15);
write_eeprom(120, Minuto);
delay_ms(15);
write_eeprom(130, MinutoParcial);
delay_ms(15);
}
#int_timer1
void timer1_isr(void)
{ cont++;
if (cont==2)
{
contador=get_timer0();
set_timer0(0);
set_timer1(3036);
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;
}
}
}
}
//***************************************************
void main()
{
set_tris_a(0b00010001);
output_a (0b00000000);
set_tris_c(0b01111110);
output_c (0b00000000);
setup_timer_0(rtcc_ext_h_to_l | rtcc_div_2);
setup_timer_1(t1_internal | t1_div_by_8);
set_timer0(0);
set_timer1(3036);
enable_interrupts(int_timer1);
enable_interrupts(global);
//****************ADC**************************
setup_adc_ports(AN0_AN1_AN3);
setup_adc (ADC_CLOCK_INTERNAL);
//*************Lectura de eeprom *****************************
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);
e=read_float_eeprom(140);
delay_ms(15);
service=read_int16_eeprom(150);
delay_ms(15);
mantenimiento=read_int16_eeprom(160);
delay_ms(15);
//*************************************************************
lcd_init();
NumGran_Init();
lcd_gotoxy(1,1);
lcd_putc(" PROYECTO \n RPM Y HORIMETRO ");
delay_ms(2000);
lcd_gotoxy(1,1);
lcd_putc(" GRACIAS TODOPIC \n SALUDOS!!! ");
delay_ms(2000);
lcd_putc("\f");
while(1)
{
set_adc_channel(0); //Lee la tension de alimentacion
delay_ms(10); // del pic ,si baja de 4,5volt
corte=read_adc(); //
if (corte<920) // Guarda valores en eeprom
{
corte_alimentacion();// actua esta funcion
}
mantenimiento=read_int16_eeprom(160);
delay_ms(15);
service=read_int16_eeprom(150);
delay_ms(15);
e=read_float_eeprom(140);
delay_ms(15);
RPM= contador*e;
if (input(pin_c2)==0) // Funcionamiento normal
{
menu=0; // vuelve a cero el menu
if ( Minuto<mantenimiento)// ATENCION: cambiar Minuto por horas
{
output_low(pin_c7);
i =RPM;
lcd_send_byte(0,1);delay_us(2);
NumGran(i);
printf(lcd_putc,"RPM");
delay_ms(80);
i = RPM;
delay_ms(300);
printf(lcd_putc," %04lu ",i);
if(input(pin_c6))
{
delay_ms(50);
while(input(pin_c6));
lcd_gotoxy(1,1);
printf(lcd_putc," RPM %lu " ,RPM);
lcd_gotoxy(1,2);
printf(lcd_putc,"Par %05lu:%02u:%02u",HoraParcial,MinutoParcial,SegundosParcial);
delay_ms(3000);
lcd_gotoxy(1,2);
printf(lcd_putc,"Tot %05lu:%02u:%02u",Hora,Minuto,Segundos);
delay_ms(3000);
}
}
//********************************************************************************
if ( Minuto>=mantenimiento&&mantenimiento>0)//ATENCION cambiar Minuto por horas
{
output_high(pin_c7); // Aviso luminoso de mantenimiento
lcd_gotoxy(1,1); //
lcd_putc(" ATENCION \n MANTENIMIENTO ");
if (input(pin_c6))
{ delay_ms(50);
while(input(pin_c6));//hasta q no suelta no graba
mantenimiento=mantenimiento+1;
write_int16_eeprom(160,mantenimiento); // escribe en la memoria
delay_ms(15); // tiempo para escritura
lcd_gotoxy(1,1); //
lcd_putc(" SE POSPUSO \n + 1 HORA ");
delay_ms(2000);
lcd_gotoxy(1,1); //
lcd_putc("INGRESE AL MENU \n PARA CAMBIARLO ");
delay_ms(2000);
}
}
}//cierra funcionamiento normal
/***********************ENTRA AL MENU*************************************/
if (input(pin_c2))//si es igual a 1
{ menus();
if (input(pin_c3))
{ delay_ms(100);
while(input(pin_c3));
{
menu++;
if (menu>7)
menu=0;
}
}
switch (menu+1)
{
case 1:
lcd_gotoxy(1,1);
printf(lcd_putc," Uds A INGRESADO \n AL MENU ");
delay_ms(1000);
menu++;
break;
case 2 :
service=read_int16_eeprom(150);
delay_ms(15);
lcd_gotoxy(1,1);
printf(lcd_putc,"Proximo Service \n %4lu Horas ",service);
break;
case 3 : //Service
lcd_gotoxy(1,1);
printf(lcd_putc,"Programe Service");
if (input(pin_c4))
{
delay_ms(300); // antirebote
b+=1;
}
if (input(pin_c5)) // Boton que decrementa
{
delay_ms(300);
b-=1;
}
lcd_gotoxy(1,2);
printf(lcd_putc," Horas %4lu ",b);
if (input(pin_c6))
{ delay_ms(50);
while(input(pin_c6));
write_int16_eeprom(150, b); // escribe en la memoria
delay_ms(25);
service=read_int16_eeprom(150);
delay_ms(15);
mantenimiento=Minuto+service;//ATENCION cambiar Minuto por hora
write_int16_eeprom(160,mantenimiento); // escribe en la memoria
delay_ms(15);
mantenimiento=read_int16_eeprom(160);
delay_ms(15);
lcd_gotoxy(1,1);
printf(lcd_putc," PROXIMO \nMANT:%05lu Horas ",mantenimiento ) ;
delay_ms(2000);
}
break;
case 4 : //CALIBRA RPM
e=read_float_eeprom(140);
delay_ms(15);
RPM= contador*e;
lcd_gotoxy(1,1);
printf(lcd_putc,"Actual RPM %lu ",RPM);
if (input(pin_c4))
{
delay_ms(300);
ajuste+=0.02; // Incremento
}
if (input(pin_c5))
{
delay_ms(300);
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 %lu ",RPM);
break;
case 5 :
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 6 :
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;
case 7 :
menu=1;
break;
}
}
}
}