La interrupción externa no establece el bit de marca

1

Mi objetivo es medir los pulsos de PWM. Pero para lograrlo, estoy dando pasos de bebé, por lo que mi primer objetivo es establecer un pin cuando se detecta un borde de la señal PWM. La señal PWM ingresa al microcontrolador (pic18f25k80, Hoja de datos ) en el pin INT1 (RB1). Escribí el código para inicializar la interrupción externa:

#include <stdio.h>
#include <stdlib.h>
#include <pic18f25k80.h>
#include "config.h"


void main() {
        TRISB1 = 1;                 // INT1 as input
        LATB1 = 0;                  // Clear INT1
        TRISC6 = 0;                 // RC6 as output
        LATC6 = 0;                  // Clear RC6

        //Setup of INT1
        RCONbits.IPEN = 0;          //Disable priorities
        INTCONbits.GIE_GIEH = 1;    //Enable Global interrupt
        INTCONbits.PEIE_GIEL = 1;   //Enable peripheral interrupts
        INTCON2bits.INTEDG1 = 1;    // Edge select for INT1
        INTCON3bits.INT1IE = 1;     // Enable the INT1 external interrupt
        //INTCON3bits.INT1IP = 0;     // Low priority
        INTCON3bits.INT1IF = 0;        //Clear external interrupt flag bit

        while(1) {
        }
    }
    //Interrupt Service Routine

    #pragma code isr=0x08
    #pragma interrupt isr

    void isr(void)
    {
        if(INTCON3bits.INT1IF){
            LATC6 = 1;
        }
    }

    #pragma code

Parece que el indicador de interrupción no sube, porque el pin RC6 está bajo. Lo he medido con un osciloscopio. ¿Qué estoy haciendo mal?

BTW es la forma correcta de llamar a un ISR?

    
pregunta PlatonInc.

1 respuesta

3

Probablemente esto se deba a que hay otras funciones en el pin B1 que deben desactivarse antes de poder usarlas como entrada digital.

En la hoja de datos encontramos la tabla 11-4, que se muestra a continuación:

Unvistazorápidoaeseregistroenlahojadedatosmuestraquees1pordefecto,loquesignificaqueelmododeentradaanalógica:

Deberá borrar este bit antes de poder usarlo como entrada digital.

También necesitarás restablecer INTCON3bits.INT1IF a 0 en tu rutina de servicio de interrupción o el controlador continuará disparando y nunca escaparás.

Si está intentando medir PWM, le gustaría leer la sección 20.2 "Modo de captura" en la hoja de datos. Esto utiliza la captura mejorada y la comparación de periféricos. Actúa como la interrupción de la selección de borde, pero también almacenará el valor de TMR1 o TMR3, lo que le permite realizar mediciones del período o ciclo de trabajo (o ambos).

    
respondido por el David

Lea otras preguntas en las etiquetas