реклама на сайте
подробности

 
 
> Low priority interrupts PIC18F4550, Не отключаются LPI
Роман77
сообщение Feb 11 2010, 07:41
Сообщение #1





Группа: Участник
Сообщений: 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),при этом отключение/подключение прерываний остается, то ситуация еще более запутывается.

Прошу сообщить, что я делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jam
сообщение Feb 11 2010, 18:01
Сообщение #2


Знающий
****

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



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

void InterruptHandlerHigh ()
{

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

Насколько я помню в pic18 была ошибка и компилятор нельзя использовать если используются интеррапты с автоматическим спасением регистров (из-за команды movff ) - не слышал, что её уже поправили. Может быть дело в этом.
Go to the top of the page
 
+Quote Post
Роман77
сообщение Feb 12 2010, 15:09
Сообщение #3





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Feb 13 2010, 01:12
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Роман77 @ Feb 12 2010, 19:09) *
Для Ххимер выделил любимым цветом...

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

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

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

...учите матчасть. biggrin.gif

Сообщение отредактировал HHIMERA - Feb 13 2010, 01:21
Go to the top of the page
 
+Quote Post
jam
сообщение Feb 13 2010, 13:08
Сообщение #5


Знающий
****

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



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

Глаз режет - поэтому отказался от компилятора и для pic18 использую только asm. Но вот не могу понять , если movff занимает 2 cycle , а movf f1,0 movwf f2 тоже 2cycle - то зачем такая команда нужна и почему бы не сделать макрос. pic24 гораздо лучше pic18 , а стоит примерно столько же - советую переходить.
Go to the top of the page
 
+Quote Post
Herz
сообщение Feb 13 2010, 16:54
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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 , а стоит примерно столько же - советую переходить.

А вы бегите за такси, а не за автобусом - больше денег сэкономите. rolleyes.gif Может, Вы просто не умеете их готовить? (с)
Меня, к примеру, HT-PICC18 вполне устраивает.
А PIC32 - пожалуй, ещё лучше, почему сразу не на него?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.02248 секунд с 7
ELECTRONIX ©2004-2016