Muchas gracias a todos por las ideas, experiencias y comentarios sobre este proyecto.
Bueno por fín el Autodimmer está funcionando, después de leer mucha documentación, leer las respuestas de este maravilloso foro hice el código en ASM, voy a dar una breve explicación para que todos puedan hacerlo más fácil en el lenguaje que mejor sepan.
Lo primero que hay que determinar es el tiempo del periodo de la onda senosoidal, tanto para los 60Hz como para los 50Hz:
Para los 50Hz :
1/50 = 20ms
Para los 60Hz:
1/60 = 16.666 ms
Para el caso de los 60Hz podemos dejar el periodo en 16.6ms
Nuestro dimmer no debe superar este periodo y para eso debemos tener nuestro detector de cruce por cero, que es el que informa a nuestro microcontrolador cuando comienza el periodo y tambien en que semiciclo nos encontramos; para este detector use solo una resistencia de 1Mohm para los 115Vac (para los 220Vac recomiendo 5Mohms(, entre la entrada de AC y uno de los puertos que no sea el GP3; tal y como recomienda Microchip en su documento
AN521; no se preocupen o no tengan temor, he hecho pruebas desde el viernes dejando encendido el autodimmer por más de 13 horas continuas y no he tenido ningún problema
...
Bueno, luego que nuestro detector nos informe de que ha pasado por cero y que comienza el semiciclo positivo,llamamos a una rutina de tiempo que no debe superar los 8.3ms para los 60HZ y de 10ms para 50Hz; este tiempo es el que determina el brillo de nuestra bombilla; luego de que pase el tiempo encendemos nuestra lámpara o activamos el puerto que controla el triac. En este punto tuve varios altercados con el triac, las primeras pruebas hechas daban malos resultados, no encendía la bombilla, o si lo hacía era al 100% de su brillo en fín...luego investigue un poco y mirando datasheets encontré que la mejor opción era el BT137 que tiene un gate muy sensible y responde en 1us y la corriente que puede controlar era más que suficiente para una bombilla de 100W. Bueno luego de que pase el tiempo activamos el puerto por 1us osea una instrucción:
BSF GPIO,4
BCF GPIO,4
Esto hizo encender nuestra bombilla por un microsegundo en el semiccilo positivo luego de que pasara el tiempo que nos dará la intensidad de nuestra bombilla; ahora debemos hacer lo mismo para el semicilo negativo con el mismo tiempo, quedando asi en nuestro código:
btfss GPIO,Sync ;Detecta cruce por cero antes de comenzar el semiciclo positivo
goto $-1
call tiempo ;llamamos el tiempo que no sobre pase los 8.3ms(60Hz) o 10ms(50Hz)
bsf GPIO,Out ;encendemos el triac
bcf GPIO,Out ;después de 1us apagamos
btfsc GPIO,Sync ;De nuevo esperamos el cruce por cero y el semiciclo negativo
goto $-1
call tiempo ;llamamos el tiempo que no sobre pase los 8.3ms(60Hz) o 10ms(50Hz)
bsf GPIO,Out ;encendemos el triac
bcf GPIO,Out ;después de 1us apagamos
Esta es la base del funcionamiento de un dimmer microcontrolado, para que se vuelva autoDimmer debemos crear una rutina que haga incrementar y disminuir el tiempo y para que sea más prolongado el tiempo le sumamos otra rutina que haga repetir más de una vez el tiempo, osea si en ese momento el tiempo es de 3ms hacer que lo repita unas 10 veces esto nos servirá para el pesebre o belen simule el cambio de dia a la noche.
Tambien pueden servir otro tipo de triac por ejemplo el Q4015, el tiempo para este debe ser superior a los 4us osea hacer 4 veces el BSF GPIO,Out antes de apagarlo.
Otro detalle es que use una resistencia y un transistor para controlar el triac, debo suponer que para usar un optoacoplador debemos tener encuanta el tiempo que necesita este para funcionar.
Espero que esto sea de mucha ayuda y de guía para los novatos como yo y que si existe otra forma de hacerlo pues sería bueno conocerla.
Dejo un video en este caso controlo una manguera de luces de 2 canales:
Saludos