#include <16f876a.h>
#device adc=10
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NODEBUG,BROWNOUT,NOCPD,NOWRT
#include <lcd.c>
#define CRISTAL 4000000
#define FRECUENCIA_TIMER1 CRISTAL/4
#use fast_io(B)
#use fast_io(c)
#use fast_io(a)
int16 contador=0,RPM;
float ajuste;
int32 Ticker;
int8 Segundos=0,Hora=0,Minuto=0;
void LCD_CEROS(void)
{
char CEROS[16]=" 00000:00:00"; //HORA INICIAL
lcd_init();
printf(lcd_putc," \f");
lcd_putc(" CUENTA HORAS");
lcd_gotoxy(4,2);
printf(lcd_putc,"%s",CEROS);
}
void DISPLAY_LCD(void)
{char wob[16];
lcd_gotoxy(1,2);
sprintf(wob," %05d:%02d:%02d",Hora,Minuto,Segundos);
printf(lcd_putc,"%s", wob);
}
void Inicializa_RTC(void)
{
Ticker = FRECUENCIA_TIMER1; // 1 Tick = 1 us.
setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 ); // initializa TIMER1 para interrupción
// cada 65536 us.
enable_interrupts( INT_TIMER1 ); // habilita interrupción TIMER1
}
#int_TIMER1
void TIMER1_isr() //subrutina de interrupción.
{
Ticker -= 65536; // Decrementa ticker
if ( Ticker < 65536 ) // Si ya pasó 1 segundo
{
contador=get_timer0(); // esto es lo que yo le agregé
set_timer0(0); //
Ticker += FRECUENCIA_TIMER1; // Incrementa ticker
Segundos++ ; // Incrementa seg
}
if(Segundos == 60)
{
Minuto++;
Segundos=0;
if(Minuto == 60)
{
Hora++;
Minuto=0;
}
}
}
//
void main()
{
int8 segundo_previo;
set_tris_a(0b00010001);
output_a (0b00000000);
Inicializa_RTC();
setup_timer_0(rtcc_ext_h_to_l | rtcc_div_1);
enable_interrupts(GLOBAL);
LCD_CEROS();
lcd_init();
//****************ADC**************************
setup_adc_ports(AN0);
setup_adc (ADC_CLOCK_INTERNAL);
//********************************************************
while(1)
{
if (Segundos != segundo_previo)
{
segundo_previo=Segundos;
}
if (input(pin_c4)==1 )
{
DISPLAY_LCD();
lcd_gotoxy(1,1);
lcd_putc(" CUENTA HORAS");
}
set_adc_channel(0);
delay_ms(10);
ajuste=(float)read_adc()*0.029;
RPM= contador*ajuste;
if (input(pin_c4)==0 )
{
lcd_gotoxy(1,1);
printf(lcd_putc," RPM %lu " ,RPM);
lcd_gotoxy(1,2);
printf(lcd_putc,"Contador %lu " ,contador);
}
}
}