Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработчик прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
AndreyS
Добрый день.

В кратце опишу систему:

проц - SiLabs 8051f130
тип памяти - far
MBYTE сидит на P4

Проблема в следующем.
В программе использую XBANKING.a51 и соответствующую опцию use far memory.
В связи с этим Keil в каждый обработчик добавляет асм строки по сохранению в стек значения ?C?XPAGE1SFR (адрес SFR=P4) и устанавливает в нее значение ?C?XPAGE1RST. Перед выходом из прерывания переменная ?C?XPAGE1SFR восстанавливается из стека.
Это все хорошо - даже отлично. Но. Я использую timer2 и его контрол регистр TMR2CN с флагом прерывания TF2 сидит по адресу SFR 0xC8 на странице SFR = 0x00. При этом для MBYTE (как я уже сказал ранее) использую P4. Он находится по адресу SFR 0xC8, но на странице 0x0F. При вызове прерывания проц автоматически переходит на SFR страницу прерывания (если это таймер 2 то переключает SFRPAGE со страницы 0x0F на 0x00. А страницу 0x0F сохраняет) и соответственно Keilовские строки по сохранению в стек ?C?XPAGE1SFR сохраняют контрол регистр таймера 2. А на выходе из прерывния благополучно восстанавливают контрол регистр и соответственно возведенный флаг TF2. Происходит очень частый вызов прерывания timer 2. Прога в полном ауте.

Для исключения этой ситуации вижу два пути решения:
1) подкорректировать приамбулы входа/выхода в прерывание (Keilовские)
2) вырубить нафиг автоматический переход на страницу SFR в прерывании и в каждом прерывании вставлять свой переключатель.

Какиеесть еще пути решения данной проблемы????????

Второй путь в принципе даже лучше. Но тогда основной страницей SFR для всей проги должна стать 0x0F.
Но мне просто интересно как в прогу вставить кусок асма???
Что-то #prgma asm не сработала. Написало вот: INTERRUPT.C(64): error C272: 'asm/endasm' requires src-control to be active. Хотя галочка SRC стоит на всех файлах. Читал описание и не допонял. Оно работает везде или только как тело функции????

Спасибо.
oran-be
Есть еще выход - использовать таймер 0 или 1. В этих таймерах флаг нельзя выставить аппаратно, а только сбросить, поэтому. что с контекстом ни делай. прерывания будут работать корректно.
AndreyS
Цитата(oran-be @ Feb 19 2008, 16:27) *
Есть еще выход - использовать таймер 0 или 1. В этих таймерах флаг нельзя выставить аппаратно, а только сбросить, поэтому. что с контекстом ни делай. прерывания будут работать корректно.



Спасибо за ответ.

В вашем случае мне прийдется отказаться от timer2 вообще. Так как порт P4 находится в области sfr 0xC8 и контрол регистр таймера 2 находится по этому же адресу sfr. sfr page timer 0 или 1 = 0. И у таймер 2 sfr page = 0. А это означает, что сохранять в прерывании будет опять таки контрол регистр таймера 2 и восстанавливать опять же его. Значит или об использовании таймер 2 прийдется забыть, или искать другой путь решения.

Я пока пошел по 2-му пути.

Еще раз спасибо за ответ.

Удач.

PS. А как все же использовать асм вставки?????? Я думал сначала что с помощью вставок в прерывании просто вытащ все из стека (что кеил запихнул) проманипулирую с флагом таймера, а затем перейду на страничку сфр 0x0F и запихаю в стек то что уже нужно (ну в принципе что кеил уложил).
но не получилось.
tag
Цитата(AndreyS @ Feb 15 2008, 00:48) *
Что-то #prgma asm не сработала. Написало вот: INTERRUPT.C(64): error C272: 'asm/endasm' requires src-control to be active. Хотя галочка SRC стоит на всех файлах. Читал описание и не допонял. Оно работает везде или только как тело функции????

Спасибо.


Для файла в котором есть asm-вставка надо сделать так:
1. Выставить Options for File "interrupt.c"->Properties->Generate Assembler SRC File
2. Выставить Options for File "interrupt.c"->Properties->Assemble SRC File
AndreyS
Добрый день

Цитата(repairDV @ Feb 20 2008, 06:05) *



Огромное спасибо. Поиск рулит!! smile.gif


Цитата
Для файла в котором есть asm-вставка надо сделать так:
1. Выставить Options for File "interrupt.c"->Properties->Generate Assembler SRC File
2. Выставить Options for File "interrupt.c"->Properties->Assemble SRC File


Спасибо. Буду пробовать


А преамбулы входа/выхода в прерывание не доступня для редактирования (ну на примере xbanking.a51). А то мне уж понравилась гибкость в настройке расширения памяти .smile.gif Думаю что и это должно где-то быть доступным. Он ведь вставляет туда сохранение старшей части указателя.

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