Я только начинаю работать с PIC32MX340F12 и MPLABX. Моей первой попыткой было написать прерывание по таймеру, поэтому я работал с таблицей данных, руководством по компилятору и примерами и пришел к следующему. Но это не работает ... прерывание никогда не срабатывает, и на самом деле, если я оставлю активными и разрешение прерывания по таймеру (T1IE = 1), и общее разрешение прерывания («ei»), оно работает в течение нескольких секунд, а затем зависает (говорит «цель остановлена» в режиме отладки). Если я удаляю любой из них, он просто работает бесконечно, но все равно не прерывается по таймеру. Итак, у меня, похоже, есть довольно серьезная проблема где-то в синтаксисе ISR. Оно у кого-нибудь выскакивает?
Как я уже сказал, я только начинаю, поэтому я уверен, что это довольно глупая оплошность. И, как вы могли заметить, мне нравится работать как можно более непосредственно с регистрами и директивами компилятора (а не с функциями, предоставленными производителем), я чувствую, что так я учусь больше всего.
Спасибо!
#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;
}