2017-07-22 12 views
-5

Die folgenden Codeschnipsel stammen vom Hersteller. Ich bin völlig verwirrt darüber, was sie zu tun versuchen. Insbesondere etwas, was mit InterruptHandler zu tun hat.C-Code-Interrupt-Setup vom Hersteller

Bitte kommentieren Sie den Code im globalen Bereich. Sieht das richtig aus?

Auch die verschiedenen APIs enthalten alle Probleme für mich. Versuchen sie einen leeren Zeiger zu verwenden? ... Viel zu fragen, bitte kommentieren Sie hauptsächlich, wie sie vorschlagen, dass der Timer2 funktionieren würde.

... 

/** 
    Section: Global Variables Definitions 
*/ 

void (*TMR2_InterruptHandler)(void); 

... 

/** 
    Section: TMR2 APIs 
*/ 

void TMR2_Initialize(void) 
{ 
    // Set TMR2 to the options selected in the User Interface 

    // T2CKPS 1:2; T2OUTPS 1:2; TMR2ON off; 
    T2CON = 0x11; 

    // T2CS LFINTOSC; 
    T2CLKCON = 0x04; 

    // T2PSYNC Not Synchronized; T2MODE Software control One shot; T2CKPOL Rising Edge; T2CKSYNC Not Synchronized; 
    T2HLT = 0x08; 

    // T2RSEL TMR4_postscaled; 
    T2RST = 0x02; 

    // PR2 8; 
    T2PR = 0x08; 

    // TMR2 0; 
    T2TMR = 0x00; 

    // Clearing IF flag before enabling the interrupt. 
    PIR4bits.TMR2IF = 0; 

    // Enabling TMR2 interrupt. 
    PIE4bits.TMR2IE = 1; 

    // Set Default Interrupt Handler 
    TMR2_SetInterruptHandler(TMR2_DefaultInterruptHandler); 

    // Start TMR2 
    TMR2_Start(); 
} 

void TMR2_ISR(void) 
{ 

    // clear the TMR2 interrupt flag 
    PIR4bits.TMR2IF = 0; 

    if(TMR2_InterruptHandler) 
    { 
     TMR2_InterruptHandler(); 
    } 
} 


void TMR2_SetInterruptHandler(void* InterruptHandler) 
{ 
    TMR2_InterruptHandler = InterruptHandler; 
} 

void TMR2_DefaultInterruptHandler(void) 
{ 
    // add your TMR2 interrupt custom code 
    // or set custom function using TMR2_SetInterruptHandler() 
} 

/** 
    End of File 
*/ 

Danke, Steve

edit: Der Hersteller-Code enthält eine Routine (ich kann nicht scheinen, hier zu hinzufügen) für High-Level-Interrupts verwalten, die TMR2_ISR if (PIE4bits.TMR2IE ruft = = 1 & & PIR4bits.TMR2IF == 1) Dies würde jeden TMR2_DefaultInterruptHandler negieren, nicht wahr?

Nochmals vielen Dank für Ihre Hilfe.

+0

Haben Sie im Allgemeinen kennen Wie funktionieren Interrupts und wofür sind sie gut? Was löst den Interrupt-Handler aus? (Es ist möglich, dass ein Interrupt-Handler für jeden Interrupt aufgerufen wird. In diesem Fall muss eine Art Spezifikation (z. B. eine globale Variable) angegeben werden, die den Interrupt ausgelöst hat.) – Scheff

+0

Verwenden Sie den bereitgestellten Code und setzen Sie Ihren Code in TMR2_DefaultInterruptHandler –

+1

Dies ist nur ein Skelett. Was für ein Bit verstehst du nicht, denn dieser Code macht nichts Sinnvolles.Einzelheiten zu den Hardwareregistern finden Sie in Ihrem Benutzerhandbuch. Informationen zu Interrupt-Kommunikation und Signalisierung finden Sie im Handbuch Ihres Betriebssystems. –

Antwort

2

Die Kommentare von Garr Godfrey und Martin James gaben hilfreiche Hinweise. So werde ich versuchen, die möglichen Lücken zu füllen:

  1. void (*TMR2_InterruptHandler)(void); eine globale Variable mit einem Funktionszeiger ist den aktuellen Interrupt-Handler bereitstellt.

  2. Ich würde als "Interrupt Service Routine" lesen. Aus dem vorgestellten Code ist nicht ersichtlich, woher er stammt. Wenn man von seinem Namen spekuliert, ist es vernünftig anzunehmen, dass es aufgerufen wird, wenn der Interrupt ausgelöst wird. Es prüft, ob der globale Interrupt-Handler-Funktionszeiger TMR2_InterruptHandler nicht NULL ist und ruft im Erfolgsfall die angegebene Funktion auf.

  3. Wenn TMR2_Initialize() zuvor aufgerufen wurde, dann zeigt TMR2_InterruptHandler auf die Funktion TMR2_DefaultInterruptHandler(). In diesem Fall wird das letztere von aufgerufen.

  4. void TMR2_SetInterruptHandler(void* InterruptHandler) wird in TMR2_Initialize() verwendet. Es setzt den aktuellen Interrupt-Handler. (Überraschung).
    ich ein bisschen bin verwirrt, weil ich es machen würde:
    void TMR2_SetInterruptHandler(void (*InterruptHandler)())
    Dies liegt daran, meine tägliche Arbeit mit C++ mich gebohrt für „sauberes typing“ aber ich erinnere mich, dass C viel mehr lax über dies ist, . (void* ist kompatibel zu jedem Zeiger.)

  5. Wie Garr Godfrey schon gesagt: "Ihr Code in TMR2_DefaultInterruptHandler setzen"
    wo es durch den Kommentar zu empfehlen
    // add your TMR2 interrupt custom code

+0

* Es ist nicht klar, woher es aufgerufen wird, sondern gehe davon aus, dass es aufgerufen wird, wenn der Interrupt ausgelöst wird * Dies ist der Zweck von Interrupt-Routinen. Sie werden nicht vom Anwenderprogramm aufgerufen. – tilz0R

+0

@ tilz0R Natürlich. Ich versuche meine Formulierungen zu verbessern. – Scheff

+0

Danke für die Antworten. Ja, es handelt sich um automatisch generierten Code aus dem MCC innerhalb der MPLAB-Software für die PIC-Programmierung. Ich bin immer noch völlig verwirrt über die Kreisverkehre, auf die in C verwiesen wird. Ich versuche, TMR2 in einem One-Shot-Modus zu verwenden. Nach dem ersten Post habe ich versucht, Code in den Abschnitt TMR2_ISR zu schreiben, aber es passiert nichts. Ich werde stattdessen die TMR2_DefaultInterruptHandler-Routine ausprobieren. Nochmals vielen Dank für Ihre Antworten. – Clancy

Verwandte Themen