2017-07-22 5 views
-5

Les extraits de code ci-dessous proviennent du fabricant. Je suis complètement confus quant à ce qu'ils essaient de faire. En particulier, tout ce qui a trait à InterruptHandler.Configuration d'interruption de code C par le fabricant

Veuillez commenter le code dans la section globale. Cela semble-t-il correct?

Les différentes API incluses ont toutes des points de blocage. Est-ce qu'ils essaient d'utiliser un pointeur vide? ... Beaucoup à demander, s'il vous plaît commenter principalement sur la façon dont ils suggèrent le timer2 fonctionnerait.

... 

/** 
    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 
*/ 

Merci, Steve

modifier: Le code fabricant inclut une routine (je ne peux pas sembler ajouter ici) pour gérer les interruptions de haut niveau qui appelle TMR2_ISR si (PIE4bits.TMR2IE = = 1 & & PIR4bits.TMR2IF == 1) Cela semblerait annuler tout TMR2_DefaultInterruptHandler, n'est-ce pas?

Merci encore pour votre aide.

+0

connaissez-vous en général comment fonctionnent les interruptions et à quoi elles servent? Qu'est-ce qui déclenche le gestionnaire d'interruption? (Il est possible qu'un gestionnaire d'interruption soit appelé pour une interruption, dans ce cas, il doit y avoir une sorte de spécification (par exemple une variable globale) indiquant le déclencheur.) – Scheff

+0

utilisez le code fourni et placez votre code dans TMR2_DefaultInterruptHandler –

+1

Ceci est juste un squelette. Qu'est-ce que vous ne comprenez pas, parce que ce code ne fait rien d'utile.Veuillez vous référer à votre manuel d'utilisation pour les détails du registre du matériel. Reportez-vous au manuel de votre système d'exploitation pour les communications d'interruption et la signalisation. –

Répondre

2

Les commentaires de Garr Godfrey et Martin James ont fourni des conseils utiles. Ainsi, je vais essayer de combler les lacunes possibles:

  1. void (*TMR2_InterruptHandler)(void); est une variable globale avec un pointeur de fonction fournissant le gestionnaire d'interruption en cours. Je voudrais lire TMR2_ISR() comme "routine de service d'interruption". À partir du code présenté, il n'est pas clair d'où il s'appelle. Suspectant de son nom, il est raisonnable de supposer qu'il est appelé quand l'interruption est déclenchée. Il vérifie si le pointeur de la fonction de gestionnaire d'interruption globale TMR2_InterruptHandler n'est pas NULL et appelle la fonction pointée en cas de succès.

  2. Si TMR2_Initialize() a été appelée auparavant TMR2_InterruptHandler points pour fonctionner TMR2_DefaultInterruptHandler(). Ainsi, dans ce cas, ce dernier est appelé à partir de TMR2_ISR().

  3. void TMR2_SetInterruptHandler(void* InterruptHandler) est utilisé dans TMR2_Initialize(). Il définit le gestionnaire d'interruption en cours. (Surprise).
    Je suis un peu perplexe parce que je le ferais:
    void TMR2_SetInterruptHandler(void (*InterruptHandler)())
    Ceci est parce que mon travail quotidien avec C++ m'a percé pour « taper propre » mais je me souviens que C est beaucoup plus laxiste sur ce . (void* est compatible avec tout pointeur.)

  4. Comme Garr Godfrey déjà dit: "mettre votre code dans TMR2_DefaultInterruptHandler"
    où il est recommandé par le commentaire
    // add your TMR2 interrupt custom code

+0

* On ne sait pas d'où il est appelé, mais laissez supposer qu'il est appelé lorsque l'interruption est déclenchée * Ceci est le but des routines d'interruption, elles ne sont pas appelées par le programme utilisateur – tilz0R

+0

@ tilz0R Bien sûr. J'essaie d'améliorer ma formulation. – Scheff

+0

Merci pour les réponses. Oui, il s'agit d'un code généré automatiquement par le MCC dans le logiciel MPLAB pour la programmation PIC. Je suis encore complètement confus aux ronds-points où les choses sont référencées et appelées à l'intérieur de C. Ce que j'essaie de faire, c'est d'utiliser TMR2 en mode One-shot. Ce que j'ai fait après la publication initiale était d'essayer de mettre du code dans la section TMR2_ISR mais rien ne se passe donc j'irai essayer la routine TMR2_DefaultInterruptHandler à la place. Merci encore pour vos réponses. – Clancy