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
}
}