hola gracias por corregirme, modifique el codigo cambie el cristalexterno por el inerno del micro de 8MHz y ahora tomo elvalor del adc en el flanco de subida, solo que ahora el pulsito de disparo esta dado por un intervalo, hice la simulacion y elpulsito se "mueve solito"y no realiza un buen disparo en el triac no se si sea un error de sincronia o este utilizando mal el timer0 el calculo para cargar el timer0 lo hice asi
x = 256 - 32*10^-6*8*10^6 / 4 * 1
x = 192
el 32*10^-6 sale de dividir 120^-1/256 que seria el periodo del cruce por cero (la frecuencia de la linea es de 60Hz) entre los 256 valores del adc y un prescaler de 1, para que el timer0 realice una interrupcion cada 32usegundos, no se si de esta manera de cargar el timer0 es buena o hay otra forma de ajustarlo, porque yo creo que no hay sincronia.
#include <16F886.H> //LIbreria del PIC Implementado.
#device ADC = 8
#fuses INTRC_IO, MCLR, NOWDT, PUT, NOIESO, NOFCMEN //Deshabilita el Doggy, Oscilador Interno.
#use delay( clock = 8000000 )
#use standard_io( B )
#use standard_io( C ) //Direccion del Puerto B.
#define LCD_E PIN_C0
#define LCD_CK PIN_C1
#define LCD_DAT PIN_C2
#include <flex_lcd_3pins.c>
int f = 0, Cont0 = 0, leer;
#INT_EXT
void ext( void )
{
if( f == 0 ) //Deteccion de Flanco de Subida.208
{
leer = read_adc();
set_timer0( 192 ); //carga el timer0
f = 1; //Cambio de Bandera de FLag.
ext_int_edge( 0, H_TO_L ); //Cambio a Flag de Bajada.
}
else //Deteccion de Flanco de Bajada.
{
set_timer0( 192 );
f = 0; //Cambio de Bandera de FLag.
ext_int_edge( 0, L_TO_H ); //Cambio a Flag de Subida.
}
}
#INT_TIMER0
void timer0 ( void )
{
Cont0++;
set_timer0( 192 );
if( Cont0 == 256 )
{
Cont0 = 0;
}
if( Cont0 < leer )
{
output_low( PIN_B1 );
}
if( Cont0 >= leer && Cont0 <= leer + 5 )
{
output_high( PIN_B1 );
}
if( Cont0 > leer + 5 )
{
output_low( PIN_B1 );
}
}
void main( void )
{
setup_oscillator( OSC_8MHZ );
lcd_init();
ext_int_edge( 0, L_TO_H ); //Inicia en Flag de Subida.
enable_interrupts( INT_EXT ); //Habilita la Interrupcion Externa.
setup_adc_ports( SAN0 ); //Seleccion del Canal 0 Analogico.
setup_adc( ADC_CLOCK_INTERNAL ); //Reloj Interno RC.
set_adc_channel( 0 ); //Habilita el Canal 0;
setup_timer_0( RTCC_INTERNAL | RTCC_DIV_1 ); //Prescaler de 1.
enable_interrupts( INT_TIMER0 ); //habilita la Interrupcion del Timer0.
enable_interrupts( GLOBAL ); //Habilita la Interrupcion Global.
while( 1 )
{
printf( lcd_putc, "\fADC = %4u\n", leer ); //Muestra el Valor del Dato Leido por el ADC.
printf( lcd_putc, "Cont0 = %4u", Cont0 );
delay_ms( 500 );
}
}