Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Low priority interrupts PIC18F4550
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Роман77
Здравствуйте!
Имеется разделение прерываний по приоритетам. 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),при этом отключение/подключение прерываний остается, то ситуация еще более запутывается.

Прошу сообщить, что я делаю не так?
Herz
А какой это компилятор?
Роман77
Цитата(Herz @ Feb 11 2010, 11:54) *
А какой это компилятор?

MPLAB C18 (mcc18.exe) v3.34
jam
Цитата(Роман77 @ Feb 11 2010, 10:41) *
Здравствуйте!
Имеется разделение прерываний по приоритетам. Main и ISRы находятся в одном файле, вспомогательные функции в другом.
#pragma interruptlow InterruptHandlerHigh

void InterruptHandlerHigh ()
{

Прошу сообщить, что я делаю не так?

Насколько я помню в pic18 была ошибка и компилятор нельзя использовать если используются интеррапты с автоматическим спасением регистров (из-за команды movff ) - не слышал, что её уже поправили. Может быть дело в этом.
HHIMERA
Цитата(Роман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; // какой в этом тайный смысл???
}
}



Прошу сообщить, что я делаю не так?


Всё... апсалютна... smile.gif
Роман77
Цитата(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."
Для Ххимер выделил любимым цветом, учите матчасть.
jam
Ну тогда надо запустить дебагер и тайна откроется.
HHIMERA
Цитата(Роман77 @ Feb 12 2010, 19:09) *
Для Ххимер выделил любимым цветом...

Такой умный, а ничего не работает.lol.gif
interruptlow InterruptHandlerHigh - глаз не режет???( по форме, а не по содержанию)
Цитата
Функция WriteConfig() обеспечивает запись данных в EEPROM, во время которой на период процедуры записи, отключаются прерывания.

Зачем???Прерывания при записи отключают в основной проге, а в прерывании зачем, тем более с высоким приоритетом???
В папке Example MCC18 найдите example3.c ...
Цитата
Так вот, если прерывания отключаются в WriteConfig(), то затем отключить все низкоуровневые прерывания INTCONbits.GIEL = 0 не удается

Пипец... А что, низкоуровневое может прервать высокоуровневое??? К чему весь этот бред???

...учите матчасть. biggrin.gif
jam
Цитата(HHIMERA @ Feb 13 2010, 04:12) *
interruptlow InterruptHandlerHigh - глаз не режет???( по форме, а не по содержанию)

Глаз режет - поэтому отказался от компилятора и для pic18 использую только asm. Но вот не могу понять , если movff занимает 2 cycle , а movf f1,0 movwf f2 тоже 2cycle - то зачем такая команда нужна и почему бы не сделать макрос. pic24 гораздо лучше pic18 , а стоит примерно столько же - советую переходить.
Herz
Цитата(jam @ Feb 13 2010, 15:08) *
Глаз режет - поэтому отказался от компилятора и для pic18 использую только asm. Но вот не могу понять , если movff занимает 2 cycle , а movf f1,0 movwf f2 тоже 2cycle - то зачем такая команда нужна и почему бы не сделать макрос. pic24 гораздо лучше pic18 , а стоит примерно столько же - советую переходить.

А вы бегите за такси, а не за автобусом - больше денег сэкономите. rolleyes.gif Может, Вы просто не умеете их готовить? (с)
Меня, к примеру, HT-PICC18 вполне устраивает.
А PIC32 - пожалуй, ещё лучше, почему сразу не на него?
HHIMERA
Цитата(Herz @ Feb 13 2010, 19:54) *
Меня, к примеру, HT-PICC18 вполне устраивает.
А PIC32 - пожалуй, ещё лучше, почему сразу не на него?


PIC24 на АСМе ещё вполне можно юзать... Сам предпочитаю С30... smile.gif
А вот АСМ на PIC32 - можно, ИМХО, заворот мозгов получить... biggrin.gif
jam
Цитата(Herz @ Feb 13 2010, 19:54) *
А вы бегите за такси, а не за автобусом - больше денег сэкономите. rolleyes.gif Может, Вы просто не умеете их готовить? (с)
Меня, к примеру, HT-PICC18 вполне устраивает.
А PIC32 - пожалуй, ещё лучше, почему сразу не на него?


PIC32 только планирую осваивать. А вот PIC24 на асме мне очень понравился - и С30 тоже - пока впечатления только положительные, хотя одну ошибку у них уже нашёл
AD1PCFGL = 0x0000; AD2PCFGL = 0x0000; не работает, приходится присваивать через bits
Herz
Круто, наверное. Но мне уже таких подвигов вряд ли совершить. Компиляторы разбаловали. Разве что вставки...
Здесь регулярно убеждаюсь, что слухи о непроходимой глючности компиляторов сильно преувеличены. rolleyes.gif
"Глючат" они, по странному предпочтению, преимущественно у новичков, которые регулярно возвещают об открытии в них всё новых багов.
jam
Цитата(Herz @ Feb 14 2010, 13:25) *
Круто, наверное. Но мне уже таких подвигов вряд ли совершить. Компиляторы разбаловали. Разве что вставки...

Ну если Вы можете вставки на С30 - снимаю шляпу, для меня это как китайский язык.
Для тех, кто не в курсе , пример вставки
__asm__("add %1,%2,%0\n sl %0,%1,%0" : "=&r"С : "r"(А), "r"(В));
Роман77
[quote name='HHIMERA' date='Feb 13 2010, 04:12' post='717619']
Такой умный, а ничего не работает.lol.gif

Кто Вам сказал, что не работает?
Видимо, имеете много свободного времени для пустой писанины (это не вопрос, ответы от Вас не интересуют, также как и студенческий подход laughing.gif ).
По остальному обращайтесь в Микрочип, в частности к соответствующим даташитам.
HHIMERA
Цитата(Роман77 @ Feb 15 2010, 07:11) *
Кто Вам сказал, что не работает?


rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.