Hola..
Yo lo haria por PWM, el problema es que empezaria aproximadamente desde 300Hz y hay para arriba no tendras problema, mas o menos sería algo de este estilo
Codigo:
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_PWM); // asigno el PWM al modulo ccp1
setup_timer_2(T2_DIV_BY_1, 48, 1); // configuración frecuencia
set_pwm1_duty(25); // Ancho de pulso
while(TRUE){}
}
Este es para 425Hz.. con un cristal de 4Mhz, el calculo es de esta forma..
Frecuencia = 1 / ((frec_cristal^-1)*4*t2div*(periodo+1))
setup_timer_2(t2div,periodo,postscale)
Pues de hay conoces todo menos el periodo.. lo despejas y ya lo reemplazas en la función setup.. cuadras el duty.. y asignas el PWM al ccp1 o ccp2