Externer Interrupt setzt Flag-Bit nicht

Mein Ziel ist es, PWM-Impulse zu messen. Aber um das zu erreichen, mache ich kleine Schritte, also ist mein erstes Ziel, einen Pin zu setzen, wenn eine Flanke des PWM-Signals erkannt wird. Das PWM-Signal gelangt über den INT1-Pin (RB1) in den Mikrocontroller (pic18f25k80, Datenblatt ). Ich habe den Code geschrieben, um den externen Interrupt zu initialisieren:

#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

Es scheint, dass das Interrupt-Flag nicht hoch geht, weil der RC6-Pin niedrig ist. Ich habe das mit einem Oszilloskop gemessen. Was mache ich falsch?

Übrigens ist das die richtige Art, eine ISR anzurufen?

Welchen Compiler verwendest du?
Auch dieser Prozessor verfügt über ein CCP-Modul, das für das, was Sie versuchen, geeignet sein könnte.

Antworten (1)

Dies liegt wahrscheinlich daran, dass es andere Funktionen auf Pin B1 gibt, die deaktiviert werden müssen, bevor Sie ihn als digitalen Eingang verwenden können.

Im Datenblatt finden wir die unten gezeigte Tabelle 11-4:

Geben Sie hier die Bildbeschreibung ein

Ein kurzer Blick auf dieses Register im Datenblatt zeigt, dass dies 1standardmäßig der Fall ist, was den analogen Eingangsmodus bedeutet:

Geben Sie hier die Bildbeschreibung ein

Sie müssen dieses Bit löschen, bevor Sie es als digitalen Eingang verwenden können.

Sie müssen auch in Ihrer Interrupt-Service-Routine INTCON3bits.INT1IFauf zurücksetzen 0, oder der Handler wird weiter feuern und Sie werden ihm niemals entkommen.

Wenn Sie versuchen, PWM zu messen, lesen Sie vielleicht Abschnitt 20.2 „Capture Mode“ im Datenblatt. Dies verwendet das Enhanced Capture and Compare Peripheral. Es verhält sich wie Ihr Flankenauswahl-Interrupt, speichert aber auch den Wert von TMR1 oder TMR3, sodass Sie Messungen der Periode oder des Tastverhältnisses (oder beider) vornehmen können.

Die Hervorhebung Ihrer Tabelle 11-4 ist irreführend. Die Spalte "Bit 1" bezieht sich bis auf die ersten drei Zeilen nicht auf Pin B1. Alle anderen Zeilen haben nichts mit B1 in dieser Spalte zu tun. Beispielsweise ist B1 INT1, das von den Bits in den Spalten 0, 3 und 6 gesteuert wird. Es ist AN8, nicht AN9, daher muss das ANSEL8-Bit in Spalte Bit 0 gelöscht werden, nicht ANSEL9. Es wäre besser, die einzelnen Zellen zu markieren, nicht die eine Spalte.
Hoffentlich behoben @Majenko-notGoogle.
Vielleicht möchten Sie auch das Register 23-9-Image aktualisieren ...
Erledigt auch @Majenko-notGoogle - danke!