Hola a todos les tengo una pequeña contribución, acabo d eterminar un control de fase preliminar con pic 16f688 pero en realidad puede ser cualquiera con ADC. Funciona muy bien el codigo, presento los mismo problema de falta de sincronia pero logre hacer las correcciones quitando todos los delay_us() de la interrupción. Espero que os ayude, realmente no explio mucho porque el codigo es muy simple. la idea es tener un trimer que me permita variar el angulo de disparo del triac que uso como elemento de suicheo.
Codigo fuente en CCS
#include <16F688.h>
#device adc=10
#use delay(clock=8000000)
#fuses INTRC_IO,PROTECT,NOBROWNOUT,NOMCLR,NOCPD,NOWDT,NOPUT,NOIESO,NOFCMEN,BROWNOUT_NOSL
//********** Definiciones de la Memoria RAM ************************************
int8 Arranque;
int16 Trimer;
int32 Angulo_Disparo;
//********** Registros Especiales del CPU **************************************
#byte PORTA=0x05
#byte PORTC=0x07
//*********** Definiciones de los Pines del PIC16f684 **************************
#define LED PIN_C0 // Led de Encendido/ Apagado
#define FASE PIN_C4 // Salida de PWM
//******************** Funciones de Utilidades Especiales **********************
//******************** Sistema Global de Interrupciones ************************
#INT_EXT
VOID STAR(){
if (Arranque==0){// Cambio para el 2do semi ciclo de Onda
ext_int_edge(H_TO_L);
Arranque=1;
}
else{ // Cambio para el 1er semi ciclo de Onda
ext_int_edge(L_TO_H);
Arranque=0;
}
}
//******************** Funciones de Uso General ********************************
void main(void){
setup_oscillator(OSC_8MHZ);
set_tris_a(0x05); // ´00 0101´ Ceros=Salidas, Unos=Entradas
set_tris_c(0x00); // ´00 0000´ Ceros=Salidas, Unos=Entradas
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_adc_ports(sAN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
output_low(FASE);// Salida Control de Fase Apagada
output_low(LED);
Arranque=0;
while(true){//bucle infinito
set_adc_channel(0); //Habilitación canal0
delay_us(100); //Retardo para preparar Conversor
Trimer = read_adc(); //Lectura del Potenciometro externo
//Numero que va desde 0 -> 1023
if (Trimer>=30){ // Valor de Offset en 3%
if (Trimer<=850){// Maximo 4Vdc
Angulo_Disparo= (8 * Trimer);//X=1/m * Y, 0->180 Grados
output_high(LED);
ext_int_edge(L_TO_H); // Arranco con el 1er semi ciclo de Onda
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
do{
}while(Arranque==0);
delay_us(Angulo_Disparo);// Angulo 1er semicilo de Onda
output_high(FASE); // Ancho de pulso
delay_us(200);
output_low(FASE);
do{
}while(Arranque==1);
delay_us(Angulo_Disparo+800);// Angulo 2do semiciclo de Onda
output_high(FASE);// Ancho de pulso
delay_us(200);
output_low(FASE);
Arranque=0;
}
else{
disable_interrupts(GLOBAL);
output_low(LED);
}
}
else{
Angulo_Disparo=(8 * 30);
output_high(LED);
ext_int_edge(L_TO_H); // Arranco con el 1er semi ciclo de Onda
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
do{
}while(Arranque==0);
delay_us(Angulo_Disparo);// Angulo 1er semicilo de Onda
output_high(FASE); // Ancho de pulso
delay_us(200);
output_low(FASE);
do{
}while(Arranque==1);
delay_us(Angulo_Disparo);// Angulo 2do semiciclo de Onda
output_high(FASE);// Ancho de pulso
delay_us(200);
output_low(FASE);
Arranque=0;
}
}// While Principal
}//Main