La interrupción externa no establece el bit de bandera

Mi objetivo es medir pulsos PWM. Pero para lograrlo, estoy dando pequeños pasos, 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?

Por cierto, ¿es esa la forma correcta de llamar a un ISR?

Qué compilador estas usando?
Además, este procesador tiene un módulo CCP que podría ser adecuado para lo que está tratando de hacer.

Respuestas (1)

Esto probablemente se deba a que hay otras funciones en el pin B1 que deben desactivarse antes de poder usarlo como entrada digital.

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

ingrese la descripción de la imagen aquí

Una mirada rápida a ese registro en la hoja de datos muestra que está 1por defecto, lo que significa modo de entrada analógica:

ingrese la descripción de la imagen aquí

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

También deberá restablecer INTCON3bits.INT1IFsu 0rutina de servicio de interrupción o el controlador seguirá disparando y nunca escapará.

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

El resaltado de su tabla 11-4 es engañoso. La columna "Bit 1" no se refiere al pin B1 excepto por las tres primeras filas. Todas las demás filas no tienen nada que ver con B1 en esa columna. Por ejemplo, B1 es INT1, que está controlado por bits en las columnas 0, 3 y 6. Es AN8, no AN9, por lo que el bit ANSEL8 en la columna Bit 0 necesita borrarse, no ANSEL9. Sería mejor resaltar las celdas individuales, no una columna.
Esperemos que se solucione @ Majenko-notGoogle.
Es posible que también desee actualizar la imagen del Registro 23-9...
Hecho esto también @ Majenko-notGoogle - ¡gracias!