Lo que mencione es para que tengan una idea de lo que quiero hacer. pero en realidad estoy enfocado desde hace un tiempo en generar solo la frecuencia cuadrada de 250 khz pero no lo he logrado, allí muestro el código, lo he intentado pero nada.
Solo he podido llegar hasta un máximo de 30 khz y de paso el tiempo en alto que me da la señal en alto es menor que el tiempo en bajo.
Estás haciendo una programación millenial, donde los procesadores tienen velocidades infinitas. Te estás olvidando que para atender una interrupción el micro necesita unos cuantos ciclos de máquina y otros mas para volver al programa.
Cuando ejecutás set_timer1(65526) dentro de la interrupción no tenés en cuenta que el contador ya tuvo incrementos --> estás alargando el período.
Además, como en 10 ciclos de máquina probablemente no haya vuelto al programa principal, se disparará otra interrupción o la perderás según donde te agarre.
En el cálculo del período tenés que tener en cuenta estos retardos, podés hacerlo a mano (tarea ingrata) o medir la frecuencia real y estimar 2 constantes.
Copypasteando tu código y colgando un frecuencímetro en PIN_A0 mido que el retardo promedio para atender la interrupción.
Me sale:
#define Tint1 43 // Tics medio para atender la interrupción
#define Tint2 23 // Tics medio para salir de la interrupción
Por lo tanto debés escribir en la interrupción: set_timer1(65536+Tint1-N) ; // N: numero de tics
Y ojo que debe ser N > Tint1+Tint2
Lástima que con estas demoras ni por casualidad vas a llegar a 250kHz, como máximo a 75kHz (37.5kHz la onda cuadrada)
Va a mejorar, aunque poco, usando #use fast_io(all), pero el cambio drástico es usando #INT_GLOBAL porque te evitás toda la parte de identificación de la fuente de interrupción, pero como igual vas a tener que hacer vos el salvar/recuperar el estado --> dudo que llegues a 250kHz.
El problema está en que 250kHz es una frecuencia muy alta para el 12F675 y la unica manera práctica es con un micro cuyo hardware incluya PWM.