Buenos días,
Estoy intentando configurar el reloj interno del PIC12F683 a 8Mhz pero no lo consigo... El caso es que estoy probando en generar una señal cuadrada con el timer1 ( sé que puedo generar el PWM tambien por el módulo CCP ).
El caso es que quiero generar una señal cuadrada de frecuencia 2Khz y un duty cicle del 50%:
T = 1/2000 = 0,5 ms
Al querer un duty cicle de 50%, había pensado en ir cambiando de nivel de salida cada 0,25 ms que lo usaria mediante interrupción por el Timer1 de 16 bits.
Para calcular el TMR1, con frecuencia interna de 8Mhz i 8 de prescale:
0,25 ms= 4/8000000Hz * 8 * (2^16 - TMR1) -> TMR1 = 65437 ( 0xFF9D )
y el codigo programa ( en CCS) es el siguiente:
Y la sorpresa es que al probarlo en la protoboard y mirando por el osciloscopio, observo una señal cuadrada de 1Khz ( la mitad de lo que necesito ).
Hay algún error de configuración de reloj interno a 8Mhz o el codigo esta mal?
Edit:
Bueno despues de muchas pruebas he arrastrado todos los decimales del cálculo y me da un TMR1 de 65473, consiguiendo una señal cuadrada de 1,94 Khz. Lo que cambia el calculo redondeando y arrastrando los decimales... Redondeando conseguia 1,1Khz y arrastrando 1,94Khz, 700Hz de diferencia.
Estoy intentando configurar el reloj interno del PIC12F683 a 8Mhz pero no lo consigo... El caso es que estoy probando en generar una señal cuadrada con el timer1 ( sé que puedo generar el PWM tambien por el módulo CCP ).
El caso es que quiero generar una señal cuadrada de frecuencia 2Khz y un duty cicle del 50%:
T = 1/2000 = 0,5 ms
Al querer un duty cicle de 50%, había pensado en ir cambiando de nivel de salida cada 0,25 ms que lo usaria mediante interrupción por el Timer1 de 16 bits.
Para calcular el TMR1, con frecuencia interna de 8Mhz i 8 de prescale:
0,25 ms= 4/8000000Hz * 8 * (2^16 - TMR1) -> TMR1 = 65437 ( 0xFF9D )
y el codigo programa ( en CCS) es el siguiente:
Código:
#include <12F683.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin enabled
#use delay(clock=8000000) // Configuración reloj interno
#byte porta=0x05 // Asignación bytes del puerto GPIO
#define oscilador PIN_A0
#INT_TIMER1
void oscilacion(void)
{
output_toggle(oscilador);
set_timer1(0xFF9D);
}
void main()
{
disable_interrupts(GLOBAL);
set_tris_a(0b001000); // Configuramos salidas y entradas
porta=0; // salidas porta a nivel bajo
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // Configuración timer1
setup_oscillator(OSC_8MHZ);
enable_interrupts(INT_TIMER1); // habilitar interrupcion timer 1
enable_interrupts(GLOBAL); // habilitar interrupciones
output_low(oscilador);
set_timer1(0xFF9D); // tiempo desborde 0.25ms
while(1)
{
}
}
Y la sorpresa es que al probarlo en la protoboard y mirando por el osciloscopio, observo una señal cuadrada de 1Khz ( la mitad de lo que necesito ).
Hay algún error de configuración de reloj interno a 8Mhz o el codigo esta mal?
Edit:
Bueno despues de muchas pruebas he arrastrado todos los decimales del cálculo y me da un TMR1 de 65473, consiguiendo una señal cuadrada de 1,94 Khz. Lo que cambia el calculo redondeando y arrastrando los decimales... Redondeando conseguia 1,1Khz y arrastrando 1,94Khz, 700Hz de diferencia.
Última edición por un moderador: