Hola!
A ver si alguien puede echarme una mano. Estoy realizando un programa en c con el compilador picc de hi-tech. El problema es que quiero obtener un cambio de nivel en una de las salidas cuando pase cierto tiempo y para ello he utilizado el timer0. Quiero que genere una señal cuadrada de unos 38 KHz por lo que la mitad del periodo será cada 13us aproximadamente. Tengo el siguiente código:
#include <htc.h>
/*
* Example code for using timer0 on a 16F628A
* Just sets up a 13 us second interrupt and change the output RB5
*/
#define PERIOD 1000000 // period in uS - one second here
#define XTAL 4000000 // crystal frequency - 4MHz
#define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in uSeconds
#define RELOADS 242 // 255-13
/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
// effect a change on PORTB whenever our desired period is reached.
// Note this timing will contain a margin of error.
TMR0 = RELOADS;
RB5 = !RB5; // effect a change on RB5
T0IF = 0;
}
main()
{
// initialize timer 0;
OPTION = 0b1000; // prescale by 1:1
T0CS = 0; // select internal clock
T0IE = 1; // enable timer interrupt
GIE = 1; // enable global interrupts
TRISB = 0; // output port
RB5 = 0;
OSCF = 1;
for(;
continue; // let interrupt do its job
}
El problema es que me genera una señal de 1.97 KHz en lugar de una de aproximadamente 38 KHz y no se porque. No se si cargo el valor correcto así que he probado con RELOADS valiendo 13 y 242 pero da igual porque da la señal de 1.97 KHz.
Alguien me puede decir que estoy haciendo mal? Se lo agradecería en el alma ya que no consigo encontrar la solución.
Gracias por adelantado.
A ver si alguien puede echarme una mano. Estoy realizando un programa en c con el compilador picc de hi-tech. El problema es que quiero obtener un cambio de nivel en una de las salidas cuando pase cierto tiempo y para ello he utilizado el timer0. Quiero que genere una señal cuadrada de unos 38 KHz por lo que la mitad del periodo será cada 13us aproximadamente. Tengo el siguiente código:
#include <htc.h>
/*
* Example code for using timer0 on a 16F628A
* Just sets up a 13 us second interrupt and change the output RB5
*/
#define PERIOD 1000000 // period in uS - one second here
#define XTAL 4000000 // crystal frequency - 4MHz
#define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in uSeconds
#define RELOADS 242 // 255-13
/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
// effect a change on PORTB whenever our desired period is reached.
// Note this timing will contain a margin of error.
TMR0 = RELOADS;
RB5 = !RB5; // effect a change on RB5
T0IF = 0;
}
main()
{
// initialize timer 0;
OPTION = 0b1000; // prescale by 1:1
T0CS = 0; // select internal clock
T0IE = 1; // enable timer interrupt
GIE = 1; // enable global interrupts
TRISB = 0; // output port
RB5 = 0;
OSCF = 1;
for(;
continue; // let interrupt do its job
}
El problema es que me genera una señal de 1.97 KHz en lugar de una de aproximadamente 38 KHz y no se porque. No se si cargo el valor correcto así que he probado con RELOADS valiendo 13 y 242 pero da igual porque da la señal de 1.97 KHz.
Alguien me puede decir que estoy haciendo mal? Se lo agradecería en el alma ya que no consigo encontrar la solución.
Gracias por adelantado.