![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Добрый день. МК DSPIC33FJ32GP202 при эмуляции прерывание по CN4 это порт RB0 происходит и флаг CNIF в регистре IFS1 принимает значение 1, но по вектору в функцию не переходит
void Int_RB0() iv IVT_ADDR_INTERRUPT4 и соответственно значение в переменной не увеличиваться. Код:
int tmr_1=0; char txt_tmr_1[6]; void main() { /*CLKDIVbits.PLLPRE=0; CLKDIVbits.PLLPOST=0; PLLFBD = 56;*/ AD1PCFGL = 0xFFFF; TRISB=0b0100000011111111; CNPU1.CN4PUE=1; CNEN1.CN4IE=1; IEC1.CNIE=1; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); while(1) { IntToStr(tmr_1, txt_tmr_1); Lcd_Out(1,1,txt_tmr_1); } } void Int_RB0() iv IVT_ADDR_INTERRUPT4 { IFS1.CNIF=0; tmr_1++; } Подскажите пожалуйста. Последний раз редактировалось ATAMAN; 02.12.2020 в 18:30. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
Поставьте приоритет прерыванию выше Вашего уровня исполнения. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Ну и в случае если не будет работать - посмотрите в отладчике, точно ли по адресу вектора расположена Ваша функция обработчика.
Не использовал ничего похожего на Ваши библиотеки - не знаю, что делает этот Ваш макрос в чем Вы там пишете. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
Как Вы понимаете, что у Вас не работает? У Вас по коду надписи на экране по нажатию меняться не должны. Я даже не уверен, что у Вас выйдет из прерывания - насколько я помню, там нужен readout порта и еще что-то. Код:
Это вопли из интернетов по поводу pic24. Здесь думаю -+ тоже самое. Последний раз редактировалось besogon; 02.12.2020 в 19:44. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Состояние бита IFS1.INT1IF не сбрасывается в 0 и переменная tmr_1++; не инкрементируется по нажатию кнопки на порту RB0
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Может входит в прерывание а выйти не может?
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
переменная tmr_1++; не инкрементируется - у Вас код в main должен предположить что tmt_1 константа и не брать в расчет, что Вы модифицируете эту переменную в прерывании. Если Вы хотите, чтобы код в main брал в расчет, что переменная tmr_1 модифицируется в прерывании, то эта переменная должна быть объявлена как volatile int, а не int. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Что то припоминаю похожие на PIC18 прерывание по изменению уровней. Тоже какая то сложность была.
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
не можете в отладке - подключите светодиоды и поставьте, чтобы как зайдет в прерывание чтобы один светодиод начал светить, а второй светодиод менял свое состояние на противоположное при входе и выходе из прерывания. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]() Код:
L_end_Int_RB0: MOV #26, W0 REPEAT #12 POP [W0--] POP W0 POP RCOUNT POP 52 RETFIE ; end of _Int_RB0 |
![]() |
![]() |
![]() |
#14 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Похоже что не попадаю в прерывание.
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Выходит флаг устанавливается IFS1.CNIF=1; и всё.
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Подскажите какой бит отвечает за глобальное включение прерывания?
Похоже не включен. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Дело в том что прерывание внешнее прерывание на INT1 на порту RB14 работает и по переполнению TMR1 работает, а вот по изменению уровня CNIE не работает.
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,685
Вес репутации: 4859/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ATAMAN
Посмотрел, судя по всему в Вашем МК не реализован. Обычно в intcon2 бит 15. В документе описывается, что нужно внезапно использовать IPL для запрета прерываний. У Вас прямо вот вообще нет возможности использовать отладку? Вы можете понять, попадает ли у Вас хоть куда-то? Можете сделать по запуску задержку в 5 секунд, а в суперлупе с задержкой 300 миллисекунд моргать светодиодом? |
![]() |
![]() |
![]() |
#21 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Может нужно сделать ремап на порт RB0 периферию отвечающие за прерывание по изменению уровня но нет там в таблице такого да и если бы нужен был ремап то флаг бы не изменялся IFS1.CNIF при нажатие на кнопку.
|
![]() |
![]() |
![]() |
#22 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
100% не попадаю в прерывание не моргают светодиоды. А как вообще понять возникает ли прерывание не знаю.
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#24 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Мда я не внимательны всё разобрался. Я не ту функцию вектора прерывания определял.
|
![]() |
![]() |
![]() |
#25 |
Senior Member
Регистрация: 09.01.2012
Возраст: 37
Сообщений: 587
Вес репутации: 373/42 ![]() ![]() ![]() ![]() |
![]()
Класс теперь энкодер с кнопкой по человечески налажу для моей программы. Вообще dsPIC33 мне нравиться с ним даже проще чем с PIC18. А гибкость то какая.
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как разрулить прерывания по приоритетам? | phase | Продукция MICROCHIP | 4 | 18.11.2009 11:42 |
Передача аналогового сигнала по радиоканалу | Ученый | Общетехнические вопросы | 6 | 20.03.2008 19:35 |
PIC18F4520 проблемы с UART-ом | AlHakim | Продукция MICROCHIP | 4 | 30.10.2007 07:31 |
Программная симуляция pic16F876 в MPLAB | Timik | Продукция MICROCHIP | 2 | 12.10.2007 15:12 |
CCP2 в PIC18F4520 не поддается укращению :) | AlHakim | Продукция MICROCHIP | 19 | 26.09.2007 08:08 |