#include <16f877.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOWRT,PUT
#use delay(clock=4MHz)
#include <lcd_c.c>
#include <kbd_d 4x4.c>
#include <lee_Num16b.c>
#define VALOR_T1 0 //carga a 0 es 524.288ms
volatile int16 resultadoADC=0,recargaTimer=0;
volatile float luxw;
#INT_EXT //CRUCE POR CERO
void EXT(void)
{
set_timer0(recargaTimer);
}
#INT_TIMER0
void TIMER0(void)
{
output_high(PIN_B7);
delay_us(20);
output_low(PIN_B7);
}
#INT_AD
void ADC(){
luxw= ((500/(0.0011328125*resultadoADC))-100); // esta formula la deje asi ya que el resultadoADC
//primero debe multiplicarse
//y luego la division y despues la resta
// por eso te da un valor muy grande.
lcd_gotoxy(2,10); printf(lcd_putc,"%3.2g",luxw); // si imprimo en int_AD o en timer1 el foco parpadea leve
//y logro que se imprima constante el valor LUXW
//y no logro saber donde colocarlo para que no parpade
// solo asi logre que funcionara.
//si activo el CCP_COMPARE_RESET_TIMER ya no me hace el muestreo.
}
#INT_TIMER1
void TIMER1(void) //aqui me hace un muestreo cada 524ms
{
resultadoADC = read_adc();
delay_us(20);
set_timer1(VALOR_T1);
}
void main(){
set_tris_C(0b00001000);//0como salidas
set_tris_D(0b00000000);//0como salidas
lcd_init();
kbd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0);
setup_timer_1(T1_INTERNAL| T1_DIV_BY_8); //prescaler de 8
//setup_ccp1(CCP_COMPARE_RESET_TIMER); //si lo activo ya no funciona el ADC y el timer1
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT); // prescaler de 64 y 16ms, sercas casi lo que es el ciclo completo
//ccp_1=20000; // 20ms a 4MHz //si lo activo ya no funciona el ADC y el timer1
enable_interrupts(int_ad);
ext_int_edge(L_TO_H);
enable_interrupts(INT_TIMER1);
set_timer1(VALOR_T1); //carga a 0 es 524.288ms
enable_interrupts(GLOBAL);
while(True){
int16 lectura;
printf(lcd_putc,"\fLuxes: ");
lectura=lee_Num16b();
if (lectura < 136)
{
recargaTimer = 0;
output_low(PIN_B7);
printf(lcd_putc,"\fOFF");
} else if( lectura > 250) {
recargaTimer = 0;
output_high(PIN_B7);
printf(lcd_putc,"\fON");
} else {
recargaTimer = lectura;
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
}
}
}