¿Cómo se usan las interrupciones con los temporizadores PIC? - PIC12F683

0

Estoy aprendiendo a programar microcontroladores y temporizadores PIC que me han dejado perplejo. Estoy usando un sencillo 8pin PIC12F683 Hoja de datos . Estoy intentando cambiar un led en el pin 4 de GPIO usando una interrupción y un timer1 configurado a 2hz. El código de abajo no parece producir ninguna salida en el pin 4, lo probé con un analizador lógico y solo permanece en el nivel lógico alto. No estoy seguro de si mi falta de comprensión está en la configuración del temporizador o la interrupción o la configuración de frecuencia, todo es nuevo para mí. Estoy usando mplab X y Entorno de programación integrado v3.5 con un pickit3. Cualquier ayuda es muy apreciada. Gracias

Este es mi código hasta ahora:

// PIC12F683 Configuration Bit Settings

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO                                           
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select bit (MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Detect (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 4000000
#include <xc.h>


void main(void) {
    TMR1H = 0;            
    TMR1L = 0;
    PIR1bits.TMR1IF = 0;    //Setting interrupt flag to zero
    T1CONbits.T1CKPS0 = 1;  //Setting T1CKPS0(and T1CKPS1) to 1 to set prescaler to 1:8. 
    T1CONbits.T1CKPS1 = 1;   
    T1CONbits.T1OSCEN = 1;  //Enables Oscillator   
    T1CONbits.TMR1CS = 0;   //Sets timer clock source to internal clock. 
    PIE1bits.TMR1IE = 1;    //Timer 1 Interrupt enable
    T1CONbits.TMR1ON = 1;   //Turns timer on

    TRISIO4 = 0;            //Confugures GPIO4 as output

    INTCONbits.PEIE = 1;    //Enabling Interrupt
    INTCONbits.GIE = 1;
    GPIObits.GP4 = 1; 
    return;
}

void interrupt ISR(void){
    if(PIR1bits.TMR1IF == 1){   //Checks if timer1 interrupt flag is 1
        GPIObits.GP4 ^= 1;      //Toggles GPIO4
        PIR1bits.TMR1IF = 0;    //Resets timer1 interrupt flag to 0
    }
}
    
pregunta Isaac Morton

0 respuestas

Lea otras preguntas en las etiquetas