Estoy intentando hacer parpadear un LED con la interrupción de desbordamiento del Temporizador 1 en un PIC12F629, pero todo lo que obtengo es un valor BAJO constante en el pin GPIO. Estoy usando un oscilador de cristal de 32.768kHz con tapas de carga de 82pF y una tapa de filtro de 0.1uF en Vdd y Vss. El pin GPIO para el LED está configurado para hundirse (ánodo atado alto, cátodo a GPIO a través de la resistencia).
Lo tenía todo funcionando cuando utilizaba el oscilador interno (4MHz) pero no tuve suerte con el cristal LP. Estoy bastante seguro de que no es un problema de hardware, ya que pude hacer que funcionara (con la configuración de cristal LP) usando la función __delay_ms () integrada de MPLAB. También verifiqué el pin LED GPIO con un analizador lógico para asegurarme de que el LED no estaba parpadeando más rápido de lo que podía percibir. Aquí están mis fragmentos de código de varios archivos .h y .c:
#include <xc.h>
// CONFIG register
#pragma config WDTE = OFF // turn off WDT
#pragma config FOSC = 0b000 // LP crystal
// Set up LP crystal GPIO
TRISIObits.TRISIO4 = 1;
TRISIObits.TRISIO5 = 1;
WPUbits.WPU4 = 0;
WPUbits.WPU5 = 0;
// Set up interrupts
TMR1H = 0;
TMR1L = 0;
PIR1bits.TMR1IF = 0;
PIE1bits.TMR1IE = 1;
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
// Set up Timer1
T1CONbits.TMR1GE = 0;
T1CONbits.T1CKPS = 0b00; // prescaler = 1
T1CONbits.T1OSCEN = 0;
T1CONbits.nT1SYNC = 0;
T1CONbits.TMR1CS = 1;
T1CONbits.TMR1ON = 1;
// Set up GP2 (LED)
TRISIObits.TRISIO2 = 0;
WPUbits.WPU2 = 0;
GPIObits.GP2 = 0;
// Interrupt service routine
void interrupt isr(void)
{
if(PIR1bits.TMR1IF)
{
PIR1bits.TMR1IF = 0;
GPIObits.GP2 ^= 1;
}
}
De la hoja de datos , aquí está el flujo de señales de Timer1:
Enmiscálculos,conelpreescaladoconfiguradoen1,utilizandountemporizadorde16bitsyuncristalde32.768kHz,eltemporizadordebedesbordarsecada2segundos.¿Algunaideadedóndevoymal?
EDITAR:Oh,oh,hayuna
EDIT2: Se corrigieron los cálculos en el párrafo anterior (olvidé invertir los 0.5Hz para obtener 2 segundos).