Timer1 como temporizador en 18F4550

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 ;)
 
si quieres un retardo de 1.5mS para cada ciclo... esta mal...ya que cada vez que es togglado el led dura aprox 1.5mS esto quiere decir que el pulso alto dura 1.5ms e igual el pulso bajo. si quieres que todo el ciclo dure 1.5ms tienes que sacar la mitad del tiempo 1.5ms/2 = 750us es el tiempo que debes de sacar para el timer..para que cada ciclo dure 1.5ms = 666 Hz...yo digo que es eso...
 
mmmm, no es eso, no quiero un retardo de 1.5ms por ciclo, sino por semiciclo

Lo que quiero es que el Ton (nivel alto) dure 1.5ms y para hacerlo sencillo, hago que cambie de estado obteniendo un dutycicle del 50%

La cuestión es que monto el circuito en la proto y mido con el osciloscopio a la salida B1 y el Ton es de 3ms en lugar de 1.5ms.

:) no se si me explico.

Ah, muchas gracias por contestar tan rápido.
 
Atrás
Arriba