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;
}