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?
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:
Ein kurzer Blick auf dieses Register im Datenblatt zeigt, dass dies 1
standardmäßig der Fall ist, was den analogen Eingangsmodus bedeutet:
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.INT1IF
auf 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.
David
David