No uso CCS, por lo tanto el código que voy a pasar es "tentativo" queda en vos revisar y modificar la parte del CCP y Timer 1 para que sea correcto.
Ademas considero que hay varias cosas sin calcular:
- El valor de Timer0 me parece algo ilógico. Si quisiera variar el brillo, por que comenzar desde 160 a 250, ademas es inverso, si se dispara antes el TRIAC es mas brillo la lampara, es decir que mientras mas cerca del 0 mas brillo, y mientras mas cerca del valor a calcular (maximo 8ms aprox en el Timer para 50Hz y dar un margen ) es minimo brillo. Tu logica esta al reves y lo deje asi. Ni siquiera se si es correcto el tiempo, no lo calcule, ya que eso es un deber tuyo.
- El CCP se maneja con el Timer1 para el modo Compare, el Timer 2 es para el PWM, fue un error mio, hay que corregirlo en el codigo para que sea el Timer1, poner bien el tiempo, y ademas cargar correctamente los registros del CCP.
- La formula de calculo de lux es absurdamente grande ( me parece ).....
VD1= ((5.0*VA1)/1024.0)*0.232;
luxw= ((2500/VD1)-500)/5;
Estas ecuaciones quedaria de la misma forma asi:
VD1= 0.0011328125*VA1;
luxw= ((500/VD1)-100);
Si la reemplazo en la de abajo me queda:
luxw= ((500/0.0011328125*VA1)-100);
Lo que es igual a:
luxw= 441379.3103 * VA1 - 100;
Si uno considera los valores entremos que puede obtener del ADC son: 0 y 1024....
Para 0 tendrias
-100 lux (Observar que es un numero negativo)
Y para 1024 tendrias
451.972.313,7931 lux.... Parece un poquito exagerado... seguramente las ecuaciones estén mal.
Código de guía:
#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>
volatile int16 resultadoADC=0,recargaTimer=0;
#INT_EXT //CRUCE POR CERO
void EXT_isr(void)
{
if(!recargaTimer){
set_timer0(recargaTimer);
enable_interrupts(INT_TIMER0);
}
}
#INT_TIMER0
void TIMER0(void)
{
output_high(PIN_B7);
delay_us(10);
output_low(PIN_B7);
disable_interrupts(INT_TIMER0);
}
#INT_AD
void ADC(){
resultadoADC = read_adc(ADC_READ_ONLY);
}
void main(){
set_tris_C(0b00001000);//0como salidas
set_tris_D(0b00000000);//0como salidas
lcd_init();
kbd_init();
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_1(T1_DIV_BY_4,124,1);
setup_ccp1(CCP_COMPARE_RESET_TIMER);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
enable_interrupts(int_ad);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
set_adc_channel(0);
while(True){
int16 lectura;
lectura=lee_Num16b();
if (lectura < 136)
{
recargaTimer = 0;
output_low(PIN_B7);
} else if( lectura > 250) {
recargaTimer = 0;
output_high(PIN_B7);
} else {
recargaTimer = lectura;
}
float luxw;
disable_interrupts(INT_AD); // Desactivo por posibles problemas
luxw = 441379.3103 * resultadoADC - 100;
enable_interrupts(INT_AD);
lcd_gotoxy
(2,10); printf(lcd_putc
,"%3.2g",luxw
);
delay_ms(1000);
}
}