Hola estoy haciendo un programa para el control de fase para un scr, sincronizado con la linea, pero este programa falla en la sincronia y es que el pulso a mover de la fase no coincide con un cruce por cero ( tiempo en alto de 8.33ms ) que entra a la interrupcion externa , lo que estoy haciendo es mediante la interrupcion externa se detectan flancos de subida ( que porvienen de un cruce por cero de 8.33ms ) y cuando este se presenta se lee el ADC, y lo que hise aqui no se si este bien hise una regla de tres para asignar cada valor del ADC ( 1024 ) un tiempo
8.33ms----->1023
ADCT------->ADC = read_adc();
en esto tengo duda si este correcto, de pues pongo en alto el RB1 a 100useg pero no hay sincronia, dejo mi codigo para ver si me puden ayudar a corregir mi error. GRACIAS.
#include <16F886.H> //Libreria del PIC Implementado.
#device ADC = 10 //Resolucion del ADC.
#fuses HS, NOWDT, NOLVP, PUT, MCLR //Oscilador Externo, Deshabilita el Doggy.
#use delay( clock = 20M ) //Crystal de 20MHz.
#include <LCD_PORTC.C> //Libreria del LCD.
int Cambiar;
int16 ADC, PWML; //Variables.
float ADCT, ADCI, ADCS;
#INT_EXT
void ext_isr( void )
{
ADC = read_adc(); //Lee el ADC.
delay_us( 10 ); //Espera 10useg.
ADCT = ADC * 0.0083 / 1023.0;
printf( lcd_putc, "\fADC = %4ld", ADC );
printf( lcd_putc, "\nPuMo = %4ld", PuMo );
delay_ms( 1000 );
printf( lcd_putc, "\nADCT = %01.7fv", ADCT );
delay_ms( 1000 );
if( Cambiar == 0 )
{
if( ADC == 0 )
{
ADCI = 0;
ADCS = 0.00000814;
printf( lcd_putc, "\fADCI = %01.7fv", ADCI );
printf( lcd_putc, "\nADCS = %01.7fv", ADCS );
delay_ms( 1000 );
output_high( PIN_B1 );
delay_us( 100 );
output_low( PIN_B1 );
delay_ms( 8.23 );
}
else if( ADC > 0 & ADC < 1023 )
{
ADCI = ADCT;
ADCS = ADCT + 0.00000814;
printf( lcd_putc, "\fADCI = %01.7fv", ADCI );
printf( lcd_putc, "\nADCS = %01.7fv", ADCS );
delay_ms( 1000 );
output_high( PIN_B1 );
delay_us( 100 );
output_low( PIN_B1 );
delay_ms( 8.23 );
}
else if( ADC == 1023 )
{
ADCS = ADCT;
ADCI = ADCT - 0.00000814;
printf( lcd_putc, "\fADCI = %01.7fv", ADCI );
printf( lcd_putc, "\nADCS = %01.7fv", ADCS );
delay_ms( 1000 );
output_high( PIN_B1 );
delay_us( 100 );
output_low( PIN_B1 );
delay_Ms( 8.23 );
}
else
{
output_low( PIN_B1 );
}
}
else if( Cambiar == 1 )
{
output_low( PIN_B1 );
ext_int_edge( 0, L_TO_H );
Cambiar = 0;
}
}
void main( void )
{
lcd_init();
setup_adc_ports( SAN0 ); //AN0 como Cana Analogico.
setup_adc( ADC_CLOCK_INTERNAL ); //Oscilador Interno.
set_adc_channel( 0 ); //Habilita el Canal 0.
Cambiar = 0; //Inicializa el Cambio.
ext_int_edge( 0, L_TO_H ); //Inicia con Flanco de Subida.
enable_interrupts( INT_EXT ); //Habilita la Interrupcion Externa.
enable_interrupts( GLOBAL ); //Habilita la Interrupcion Global.
while( 1 )
{
}
}