2017-03-06 7 views
1

Je ne fais que commencer avec un PIC32MX340F12 et un MPLABX. Ma première tentative a été d'écrire une interruption de minuterie, donc j'ai travaillé avec la feuille de données, le manuel du compilateur, et des exemples et est venu avec le ci-dessous. Mais ça ne marche pas ... l'interruption ne se déclenche jamais, et en fait si je laisse à la fois l'activation de l'interruption timer (T1IE = 1) et l'activation générale d'interruption active ("ei"), elle court pendant quelques secondes puis se bloque (dit "cible arrêtée" en mode debug). Si je supprime l'un de ceux-ci, il fonctionne simplement indéfiniment mais toujours pas d'interruption de minuterie. Donc, je semble avoir un assez mauvais problème quelque part dans ma syntaxe ISR. Est-ce que ça saute à n'importe qui?Mon premier ISR PIC32MX ne se déclenche pas, le code est suspendu

Comme je l'ai dit je commence tout juste alors je suis sûr que c'est un oubli assez bête. Et comme vous pouvez le constater, j'aime travailler aussi directement que possible avec les registres et les directives du compilateur (plutôt qu'avec les fonctions fournies par le fabricant), j'ai l'impression d'apprendre le plus de cette façon.

Merci!

#include <stdio.h> 
#include <stdlib.h> 
#include "p32mx340f512h.h" 
#include <stdint.h> 

int x = 0; 

int main(int argc, char** argv) 
{ 
    INTCONbits.MVEC = 1; // turn on multi-vector interrupts 
    T1CON = 0;   // set timer control to 0 
    T1CONbits.TCKPS = 1; // set T1 prescaler to 8 
    PR1 = 62499;   // set t1 period 
    TMR1 = 0;    // initialize the timer 
    T1CONbits.ON = 1;  // activate the timer 

    IPC1bits.T1IP = 5; // T1 priority to 5 
    IPC1bits.T1IS = 0; // T1 secondary priority to 
    IFS0bits.T1IF = 0; // clear the T1 flag 
    IEC0bits.T1IE = 1; // enable the T1 interrupts 

    asm volatile("ei"); // enable interrupts 

    while (1) 
    { 
     x++; 

     if (x > 10000) 
     { 
      x = 0; 
     } 
    } 
    return (EXIT_SUCCESS); 
} 

bool zzz = false; 

void __attribute__((interrupt(IPL5AUTO))) T1Handler(void) 
{ 
    IFS0bits.T1IF = 0; 
    zzz = true; 
} 

Répondre

0

Question de suivi: quel est le problème avec ce site? Je fournis un code source complet pour une simple tâche de type "hello world" pour une puce extrêmement populaire, pas de réponse. Assigner une prime, pas de réponses. Je pense que je renonce à stackoverflow.

1

Les systèmes embarqués sont quelque peu spécialisés, et il s'agit d'un système spécifique que je ne connais pas. Cependant, en travaillant avec d'autres systèmes, vous devrez peut-être associer l'adresse de la fonction Int Handler (T1Handler) à l'interruption qu'il est en train de gérer. (Sauf si le cadre que vous utilisez le fait pour vous sous les couvertures lors de la construction?)

Tous les noms que vous utilisez sont-ils automatiquement mappés pour vous par le système de construction? Si ce n'est pas le cas, vous devrez peut-être appeler un init HW ou un init de type kind en haut de main, avant de les utiliser.

Il se peut qu'un certain HW init/reset soit également nécessaire avant que le HW puisse être programmé.

Espérons que cela aide.