[an error occurred while processing this directive]
Вопрос по обработке прерывания HT-PICC. Надо ли самому сохранять PCLATCH или это делает компилер?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
Отправлено
Алекс ВМ
18 декабря 2002 г. 12:12
Составить ответ
|||
Конференция
|||
Архив
Ответы
А не мог бы кто-нибудь просветить насчет механизма прерывания в Пике. Я чего-то не врублюсь. Ведь если контекст сохраняет сам программист, то сделать это он может только в одном месте - в Isr. Но раз мы находимся в Isr, значит, PCLATCH уже изменился. Зачем его, измененного, сохранять?? Или я чего-то не понимаю? Объясните убогому.
—
Алексей ВМ
(18.12.2002 15:43,
пустое
)
Вы, вероятно, гдето в своей ISR вручную переключаете банк памяти (RAM) на ненулевой и так оставляете...
—
NoMore
(18.12.2002 18:08, 70 байт)
Нет, я вручную банки не переключаю.
—
Алексей ВМ
(18.12.2002 18:23,
пустое
)
По идее компилятор должен сохранить в начале вектора прерывания, который по адресу 0х04, хотя бы W, STATUS и возможно PCLATH... Что у тебя в программе получается по адресу 0х04?
—
bialix
(18.12.2002 15:57,
пустое
)
У меня в проге по этому адресу сидит процедура обработки прерывания.
—
Алексей ВМ
(18.12.2002 15:58,
пустое
)
Как это? Сразу начинается твой Си код? Круто. Тогда делай вставочку на асме, чтобы гемморой полечить. А вобче странно это как то. У тебя обработчик только одного прерывания?
—
bialix
(18.12.2002 16:02,
пустое
)
Нет, виноват. Мой обработчик начинается с адреса 0х0D, а по адресу 0х04 сидит функция intlevel0.Сейчас брожу в отладчике MPLABа и вот что интересно- компилер в конце isr пытается восстанавливать PCLATCH, и примерно через раз не угадывает. Чтобы это значило?
—
Алексей ВМ
(18.12.2002 16:09,
пустое
)
PCLATH сохраняется в конкретной ячейке обычно доступной из любого банка данных (если речь о PIC16). Может твой обработчик каким-то образом затирает эту ячейку?
—
bialix
(18.12.2002 16:16, 78 байт)
Ещё что интересно - ячейка 0х66 доступна только в банке 0 ОЗУ. Может, её надо переопределить - все тогда будет хорошо?
—
Алексей ВМ
(18.12.2002 16:47,
пустое
)
Как раз этим занимаюсь. Уже интересно. Ф-ция intlevel0 как раз и занимается сохранением PCLATCH в ячейке с адресом 0х66. Только где эта переменная определена? А адреса моих переменных, указанные в файле *.map абсолютные или относительные начала какого-то регистра?
—
Алексей ВМ
(18.12.2002 16:33,
пустое
)
Какой у тебя проц? Твои адреса дб абсолютными
—
bialix
(18.12.2002 16:35,
пустое
)
Ответ: PIC16F877 Компилер - HT-PICC 8PL3
—
Алексей ВМ
(18.12.2002 16:38,
пустое
)
В даташит на пик16ф877 в пункте 12.11 описан пример как надо сохранять контекст(+)
—
bialix
(18.12.2002 17:06, 613 байт)
А если в код заглянуть? А затем в мануал?
—
Perec
(18.12.2002 15:02, 523 байт)
Ответ:
—
Алексей ВМ
(18.12.2002 15:13, 331 байт)
Вручную не надо(+)
—
Perec
(18.12.2002 16:53, 1647 байт)
Ответ: (+)
—
Алексей ВМ
(18.12.2002 17:00, 3368 байт)
Мин нет(+)
—
Perec
(18.12.2002 18:12, 176 байт)
Обработчик начинается с @векрора прерывания. Т.е c @0x004.(-)
—
Perec
(18.12.2002 17:27,
пустое
)
Вроде все честно -- банк 0 ОЗУ. Осталось найти кто портит saved_pclath
—
bialix
(18.12.2002 17:13,
пустое
)
запомни: PCLATH сам и никем никогда не апдейтится, только после операции с регистром PCL (по записи)
—
Romario
(18.12.2002 16:21,
пустое
)
Апдейтится, оказывается. Самим компилером, причем этот кусок проги, который располагается в программной памяти прямо перед моим Isr, в листинге этой Isr не отражен, хотя кусок, восстанавливающий PCLATCH, нарисован.
—
Алексей ВМ
(18.12.2002 16:36,
пустое
)
PCLATH -- это регистр sfr. Если функцию обработки прерывания компилятор не помещает в другую 2К страницу, то ктож тогда изменит регистр PCLATH кроме самого программиста?
—
bialix
(18.12.2002 13:43,
пустое
)
Он сам. Напиши только что-нибудь типа static void interrupt Isr ( void ){}, и все.
—
John
(18.12.2002 12:37,
пустое
)
А можно чуток подробнее? PCLATCH сохраняет процессор или это делается программно в начале процедуры обработки прерывания?
—
Алексей ВМ
(18.12.2002 13:17,
пустое
)
сpu сохраняет только PC....PCLATH не сохранятеся и не апдейтится после RETFIE
—
Romario
(18.12.2002 13:33, 52 байт)
ps: достаточно посмотреть в листинг и все станет ясно (-)
—
Romario
(18.12.2002 13:35,
пустое
)
Смотрел я в листинг... В начале isr там в самом деле ничего не сохраняется, а в конце что-то восстанавливается. Но вопрос - что восстанавливается, если в пооцедуре ничего не сохранялось? :(
—
Алексей ВМ
(18.12.2002 13:47,
пустое
)
что-то восстанавливается это в смысле PCLATH?
—
Romario
(18.12.2002 13:50, 172 байт)
Нет.(+)
—
Алексей ВМ
(18.12.2002 14:03, 319 байт)
:)
—
Romario
(18.12.2002 14:18, 239 байт)
Слушай, но ведь программа работает? Значит, компилятор все делает как надо. Зачем тебе лишняя информация? Многие знания - многие печали...
—
John
(18.12.2002 14:08,
пустое
)
Глючит она. Как только происходит обращение из main (bank0) к другим функциям, расположенным в других банках - тут и начинаются глюки. Такое впечатление, что прога вылетает не в то место, откуда она вызывалась. Сижу теперь в отладчике, фигней страдаю.
—
Алексей ВМ
(18.12.2002 14:16,
пустое
)
Ответ: А сколько вложений? Может стек переполняется если при выполнении функции с большим вложением происходит вызов прерывания.
—
VAI
(18.12.2002 17:36,
пустое
)
Не больше шести.
—
Алексей ВМ
(18.12.2002 17:45,
пустое
)
Ответ: а из прерывания функции вызываешь?
—
VAI
(18.12.2002 20:09,
пустое
)
Нет.
—
Алексей ВМ
(19.12.2002 08:27,
пустое
)
Ответ:
—
John
(18.12.2002 14:31, 620 байт)
Дело не в ОЗУ - проверил.
—
Алексей ВМ
(18.12.2002 14:43,
пустое
)
Я уже лет 8 на асме не писал. Я знаю только, что вот этого бывает достаточно, и все работает программах в 50.
—
John
(18.12.2002 13:27,
пустое
)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание
|||
Без кадра
E-mail:
info@telesys.ru