Полная версия этой страницы:
Настройка прерываний в PIC24
Написал программу для проверки работы прерываний таймера TMR1,
почему то прерывание не работает
вот листинг
#include <p24fj128ga010.h>
void __attribute__((__interrupt__, auto_psv)) _T1Interrupt(void) {
if (IFS0bits.T1IF) {
IFS0bits.T1IF = 0;
PORTA++;
}
}
int main (void) {
PORTA = 0;
LATA = 0;
TRISA = 0;
T1CON = 0b0000000001010000;
PR1 = 0;
TMR1 = 0;
T1CONbits.TON=1;
IEC0bits.T1IE = 1;
IFS0bits.T1IF = 0;
IPC0bits.T1IP0 = 1;
IPC0bits.T1IP1 = 1;
IPC0bits.T1IP2 = 1;
while(1);
return 0;
}
Программа должна при каждом прерывании добавлять единичку в регистр PORTA;
Ни на плате ни на симуляторе не работает.
Может быть надо как то глобально разрешить прерывания ? хотя как я понял в 24х это стоит по умолчанию
У кого есть опыт работы с пик24 подскажите подалуйста, в чем тут дело.
Epikur
Sep 17 2007, 13:59
Да, нужно разрешить прерывания глобально. Как это делать в PIC24 не знаю - не работал.
И ещё - добавлять единицу нужно в регистр LATA, а не PORTA.
Alex B._
Sep 18 2007, 08:17
1) флаг можно не проверять
2) писать можно и в PORTA и LATA
3) регистр периода PR1 установите в 0xFFFF - все заработает
Epikur
Sep 18 2007, 08:26
Писать-то можно и в PORTA, но в данном случае имеет место быть чтение и запись. В зависимости от того, что навешено на контроллер аппаратно, инструкция incf PORTA может сделать не совсем то, что ожидается.
Alex B._
Sep 18 2007, 11:51
>> инструкция incf PORTA может сделать не совсем то, что ожидается
имхо человеку рано еще объяснять, что такое RMW, и как могут повлиять на работу емкости на портах =)
инструкция incf PORTA сама ничего плохого не сделает, она сделает именно то, чего от нее хотят - считает порт после выходных буферов, модифицирует и запишет обратно в защелку ДО буферов. Тут я думаю, проблем не будет, вы только запутаете камрада =)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.