Gracias a todos por las respuestas.
y porque usa el cruce por cero? para dimmer Led basta con un Transistor Mosfet o un CI , o me imagino que esta dimmando la alimentacion del Led. puede poner el circuito como lo hace ?
en efecto los leds los podríadimear con un pwm, sin embargo, la lampara es comercial y ya esta fabricada, esta se alimenta directamente de la linea de AC, por eso estos haciendo el dimer a la alimentación, para solo poner el circuito entre la linea de AC y la lampara
mas tarde subo el esquematico del circuito que estoy usando
Será que tu circuito para el cruce por cero te esta metiendo pulsos indeseados que hace que la interrupción se ejecute varias veces mientras intenta ejecutar lo que hace en el while.
Ademas, falta la configuración de la frecuencia del oscilador interno a 8Mhz: setup_oscillator.
tambien pensé en eso, pero hice la prueba de poner un led para verificar el cruce por cero, hice que el led parpadeara cada 120 interrupciones, y en efecto se ve que este parpadea cada segundo (la linea de AC tiene una frecuencia de 60 Hz)
Uy! si habré renegado hace unos años con esto...
Te doy una posible respuesta al problema. Si lo soluciona te explico la teoría que me llevó a pensar que puede ser eso.
modificá el segundo código a:
if(zero_c==1)
{
disable_interrupts(global);
zero_c=0;
delay_ms(7);
output_high(moc);//si es menor a 10 entonces el triac nunca se prende
delay_us(150);
output_low(moc);
clear_interrupts(int_ext);
enable_interrupts(global);
}
Aunque puede que te des cuenta en base al código. Los tiempos "muertos" son distintos entre el cambio de flanco de L_TO_H y de H_TO_L. Si marcas en la senoidal los momentos de cambio vas a podés apreciarlo.
GRacias por la sugerencia Bruno, no se me ocurrió esto, lo pruebo mas tarde y comento los resultados
Coloca como configuras el timer porque en el código que colocas.
La interrupción por timer, puede ser que no te este funcionando porque no has activado la interrupción por timer:
enable_interrupts(int_timer0)
ademas de que configuras timer1 y usas el timer0.
En cada interrupción externa por cruce por cero tienes que setear al valor que quieres del timer para que vuelva a contar: set_timer0(...)
y por lo del segundo, seria como dice stk500, que coloques el circuito.
Creo que la rutina del Timer va a implementarla luego. En este momento no está logrando siquiera poder encender de forma pareja la carga lo mas cercana al 100% mediante disparos acertados del MOC, que es el primer paso para luego mover el punto de disparo y poder dimmerizar (ahi sí usando un Timer).
Saludos.
En este código no implemente el timer, de hecho el timer fue lo primero que intenté, pero al ver que no funcionaba fui regresando hasta llegar a lo mas básico, para tratar de encontrar el error, que serian los codigos que puse.
Lo curioso es que este circuito ya lo habia hecho funcionar anteriormente para un motor de AC y para un foco, pero en este diseño cambie el modelo del micro y no me funciona, supongo que es algun detalle en la configuracion o algo que no estoy contemplando.
Mas tarde subo los comentarios de las nuevas pruebas