Al referirte de por qué está conectado de esa forma el generador te refieres al 220VAC que esta al lado del triac? Esta mal conectado por qué?
Sí, a ese. Y está mal conectado porque debe haber un solo generador de CA.
Si la referencia de AC se toma de un transformador, no hay problema, pero en tu esquema existen dos fases.
Es más conveniente y simple usar un circuito con optoacopladores, uno para tomar la referencia del cruce por cero y otro para disparar el TRIAC, que en este caso sería un optotriac.
Para el de cruce por cero puedes usar una simple resistencia o un divisor de tensión para alimentar al LED.
Algo así:
El circuito de arriba es un detector de cruce por cero de media onda.
El circuito de arriba es un detector de cruce por cero de onda completa.
Se debe tener en cuenta el tipo de detector a usar porque en el de onda completa se obtendrá el doble de pulsos que en el de media onda.
Y eso se debe tener en cuenta en el programa.
Y este otro es el que mencioné con transformador, también de onda completa:
La librería "CONFIG.h" es una cabecera, dentro de ésta se encuentra las configuraciones de los bits , lo añadí como librería para no tener muchas líneas de programa.
¿De cuáles bits? Si son los de la palabra de configuración únicamente te estás ahorrando una línea para ese PIC. (16F877A)
Al parecer está mal que la variable "angle" vaya sólo dentro del while
. Podrías sugerirme cómo podría mejorar todas las observaciones amigo Dark ?
Está mal si siempre mantiene el mismo valor, o sea: angle = 30;
Por eso te dije que estando con un valor fijo, no tiene sentido que esté dentro del bucle principal.
Y es que mencionas que angle no cambia, obviamente no cambiará porque tiene un valor fijo en 30.
Si esta variable fuera modificada por pulsadores, un potenciómetro u otra cosa, pues sí que debería estar ahí.
Edit:
En dado caso que yo quisiera tratar de compilar tu programa y ver lo que hace, tendría que cambiar algunas cosas.
Ya que por la sintaxis que veo para el servicio de interrupciones, estás usando una versión vieja de XC8
El __delay_ms(); ahora ya no permite variables como parámetro.
Y es que en las versiones actuales han cambiado muchas cosas, y si tratara de compilarlo seguramente obtendría errores.