|
Low priority interrupts PIC18F4550, Не отключаются LPI |
|
|
|
Feb 11 2010, 07:41
|
Группа: Участник
Сообщений: 8
Регистрация: 10-03-07
Пользователь №: 26 039

|
Здравствуйте! Имеется разделение прерываний по приоритетам. Main и ISRы находятся в одном файле, вспомогательные функции в другом. CODE #pragma interruptlow InterruptHandlerHigh
void InterruptHandlerHigh () { … if( INTCONbits.INT0IF) //Check for INT0 { … WriteConfig(); // INTCONbits.RBIE = 0; //Disbles the RB port change interrupt // INTCON3bits.INT2IE = 0; //Disbles the INT2 external interrupt INTCONbits.GIEL = 0; } }
Функция WriteConfig() обеспечивает запись данных в EEPROM, во время которой на период процедуры записи, отключаются прерывания. Так вот, если прерывания отключаются в WriteConfig(), то затем отключить все низкоуровневые прерывания INTCONbits.GIEL = 0 не удается, а только посредством соответствующих битов IE=0. Если отключение прерываний убрать из WriteConfig(), то INTCONbits.GIEL = 0 работает. Если же вложить WriteConfig() в другую какую-ть подпрограмму (SOUBROTINExx-> WriteConfig),при этом отключение/подключение прерываний остается, то ситуация еще более запутывается. Прошу сообщить, что я делаю не так?
|
|
|
|
|
Feb 11 2010, 16:44
|
Группа: Участник
Сообщений: 8
Регистрация: 10-03-07
Пользователь №: 26 039

|
Цитата(Herz @ Feb 11 2010, 11:54)  А какой это компилятор? MPLAB C18 (mcc18.exe) v3.34
|
|
|
|
|
Feb 11 2010, 22:43
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Роман77 @ Feb 11 2010, 10:41)  CODE #pragma interruptlow InterruptHandlerHigh // эт как??? интерапт среднего рода???
void InterruptHandlerHigh () { … if( INTCONbits.INT0IF) //Check for INT0 { … WriteConfig(); // INTCONbits.RBIE = 0; //Disbles the RB port change interrupt // INTCON3bits.INT2IE = 0; //Disbles the INT2 external interrupt INTCONbits.GIEL = 0; // какой в этом тайный смысл??? } }
Прошу сообщить, что я делаю не так? Всё... апсалютна...
|
|
|
|
|
Feb 12 2010, 15:09
|
Группа: Участник
Сообщений: 8
Регистрация: 10-03-07
Пользователь №: 26 039

|
Цитата(jam @ Feb 11 2010, 21:01)  Насколько я помню в pic18 была ошибка и компилятор нельзя использовать если используются интеррапты с автоматическим спасением регистров (из-за команды movff ) - не слышал, что её уже поправили. Может быть дело в этом. Да в документе "PIC18F2455/2550/4455/4550 Family Silicon Errata and Data Sheet Clarification" есть об этом "If an interrupt occurs during a two-cycle instruction that modifies the STATUS, BSR or WREG register, the unmodified value of the register will be saved to the corresponding Fast Return (Shadow) register and upon a fast return from the interrupt, the unmodified value will be restored to the STATUS, BSR or WREG register. For example, if a high-priority interrupt occurs during the instruction, “MOVFF TEMP, WREG”, the MOVFF instruction will be completed and WREG will be loaded with the value of TEMP before branching to ISR."Но здесь другой случай. В томже документе сказано: "If using the Microchip MPLAB® C18 C Compiler, define both high and low-priority interrupt handler functions as “low priority” by using the pragma interruptlow directive."Для Ххимер выделил любимым цветом, учите матчасть.
Сообщение отредактировал Роман77 - Feb 12 2010, 15:45
|
|
|
|
|
Feb 13 2010, 01:12
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Роман77 @ Feb 12 2010, 19:09)  Для Ххимер выделил любимым цветом... Такой умный, а ничего не работает. interruptlow InterruptHandlerHigh - глаз не режет???( по форме, а не по содержанию) Цитата Функция WriteConfig() обеспечивает запись данных в EEPROM, во время которой на период процедуры записи, отключаются прерывания. Зачем???Прерывания при записи отключают в основной проге, а в прерывании зачем, тем более с высоким приоритетом??? В папке Example MCC18 найдите example3.c ... Цитата Так вот, если прерывания отключаются в WriteConfig(), то затем отключить все низкоуровневые прерывания INTCONbits.GIEL = 0 не удается Пипец... А что, низкоуровневое может прервать высокоуровневое??? К чему весь этот бред??? ...учите матчасть.
Сообщение отредактировал HHIMERA - Feb 13 2010, 01:21
|
|
|
|
|
Feb 13 2010, 16:54
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(jam @ Feb 13 2010, 15:08)  Глаз режет - поэтому отказался от компилятора и для pic18 использую только asm. Но вот не могу понять , если movff занимает 2 cycle , а movf f1,0 movwf f2 тоже 2cycle - то зачем такая команда нужна и почему бы не сделать макрос. pic24 гораздо лучше pic18 , а стоит примерно столько же - советую переходить. А вы бегите за такси, а не за автобусом - больше денег сэкономите.  Может, Вы просто не умеете их готовить? (с) Меня, к примеру, HT-PICC18 вполне устраивает. А PIC32 - пожалуй, ещё лучше, почему сразу не на него?
|
|
|
|
|
Feb 13 2010, 21:17
|

Знающий
   
Группа: Свой
Сообщений: 792
Регистрация: 9-08-05
Из: Транай
Пользователь №: 7 474

|
Цитата(Herz @ Feb 13 2010, 19:54)  А вы бегите за такси, а не за автобусом - больше денег сэкономите.  Может, Вы просто не умеете их готовить? (с) Меня, к примеру, HT-PICC18 вполне устраивает. А PIC32 - пожалуй, ещё лучше, почему сразу не на него? PIC32 только планирую осваивать. А вот PIC24 на асме мне очень понравился - и С30 тоже - пока впечатления только положительные, хотя одну ошибку у них уже нашёл AD1PCFGL = 0x0000; AD2PCFGL = 0x0000; не работает, приходится присваивать через bits
|
|
|
|
|
Feb 15 2010, 00:38
|

Знающий
   
Группа: Свой
Сообщений: 792
Регистрация: 9-08-05
Из: Транай
Пользователь №: 7 474

|
Цитата(Herz @ Feb 14 2010, 13:25)  Круто, наверное. Но мне уже таких подвигов вряд ли совершить. Компиляторы разбаловали. Разве что вставки... Ну если Вы можете вставки на С30 - снимаю шляпу, для меня это как китайский язык. Для тех, кто не в курсе , пример вставки __asm__("add %1,%2,%0\n sl %0,%1,%0" : "=&r"С : "r"(А), "r"(В));
|
|
|
|
|
Feb 15 2010, 04:11
|
Группа: Участник
Сообщений: 8
Регистрация: 10-03-07
Пользователь №: 26 039

|
[quote name='HHIMERA' date='Feb 13 2010, 04:12' post='717619'] Такой умный, а ничего не работает. Кто Вам сказал, что не работает? Видимо, имеете много свободного времени для пустой писанины (это не вопрос, ответы от Вас не интересуют, также как и студенческий подход  ). По остальному обращайтесь в Микрочип, в частности к соответствующим даташитам.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|