Hola a todos!
Estoy haciendo un proyecto en el cual utilizo este microcontrolador, pero voy paso a paso intentando entender cada una de las cosas que hago.
A la hora de utilizar el Timer1 como temporizador, deseo generar una onda cuadrada con un pulso de 1.5ms por ejemplo, y lo que obtengo siempre es el doble, en este caso 3ms.
Utilizo un cristal de 20MHz, pero como más adelante he de añadir al proyecto comunicación por USB, utilizo los siguientes fuses:
#fuses HSPLL
#fuses NOWDT
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
Por lo tanto, la frecuencia que llega a la CPU es de 48MHz al igual que al USB.
El cálculo que realizo es el siguiente para obtener la cuenta necesaria para hacer que desborde el timer:
1.5ms=(4/48000000)*8*(65536-X) => X=63286
Y el programa os lo pongo a continuación:
#include <18f4550.h>
#fuses HSPLL
#fuses NOWDT
#fuses NOPROTECT
#fuses NOLVP
#fuses NODEBUG
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
#use delay (clock=48000000)
#use standard_io(B)
int1 cont=0;
#int_TIMER1 //Interrupción timer1
void temp1s(void) //función
{
if (cont==1)
output_toggle(PIN_B1);
set_timer1(64411); //Recarga el timer1 para generar un semiperiodo de 1.5ms 63286
cont++;
}
main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
set_timer1(64411); //recarga el timer1
enable_interrupts(INT_TIMER1); //habilita interrupción timer1
enable_interrupts(global); //habilita interrupción general
while(1);
}
No soy capaz de ver por qué me sale el doble de tiempo del que configuro, seguro que es alguna tontería pero no la veo
A ver quién me echa una mano y le invito a una cervecilla
Estoy haciendo un proyecto en el cual utilizo este microcontrolador, pero voy paso a paso intentando entender cada una de las cosas que hago.
A la hora de utilizar el Timer1 como temporizador, deseo generar una onda cuadrada con un pulso de 1.5ms por ejemplo, y lo que obtengo siempre es el doble, en este caso 3ms.
Utilizo un cristal de 20MHz, pero como más adelante he de añadir al proyecto comunicación por USB, utilizo los siguientes fuses:
#fuses HSPLL
#fuses NOWDT
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
Por lo tanto, la frecuencia que llega a la CPU es de 48MHz al igual que al USB.
El cálculo que realizo es el siguiente para obtener la cuenta necesaria para hacer que desborde el timer:
1.5ms=(4/48000000)*8*(65536-X) => X=63286
Y el programa os lo pongo a continuación:
#include <18f4550.h>
#fuses HSPLL
#fuses NOWDT
#fuses NOPROTECT
#fuses NOLVP
#fuses NODEBUG
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
#use delay (clock=48000000)
#use standard_io(B)
int1 cont=0;
#int_TIMER1 //Interrupción timer1
void temp1s(void) //función
{
if (cont==1)
output_toggle(PIN_B1);
set_timer1(64411); //Recarga el timer1 para generar un semiperiodo de 1.5ms 63286
cont++;
}
main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
set_timer1(64411); //recarga el timer1
enable_interrupts(INT_TIMER1); //habilita interrupción timer1
enable_interrupts(global); //habilita interrupción general
while(1);
}
No soy capaz de ver por qué me sale el doble de tiempo del que configuro, seguro que es alguna tontería pero no la veo
A ver quién me echa una mano y le invito a una cervecilla