[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ВН 23 сентября 2003 г. 20:52
В ответ на: Ответ: отправлено DmitryVB 23 сентября 2003 г. 19:01

А программа-то попадает в обработчик или нет?
Если нет - то см. установки PMST,IMR, таблицу векторов. Плюс к этому -
не попадать она может из-за того, что обработчик находится в одной странице памяти, а вектора в другой.Вместо B(D) в векторах нужно в этом случае использовать FB(D), а перед ней сохранить XPC в стеке.
И в опциях установить FAR branch,call. И, наоборот, если эта опция установлена, то использовать FB вместо B с предварительным сохранением XPC.
Если все-же попадает, но возвращается не туда:
отсутствие ключа interrupt у обработчика;
несогласовка в вызове обработчика и возврате из него (B и FRETE), а точнее в "неспрятывании" XPC в стек перед B, в случае расположения и векторов и обработчика в одной странице и разрешенном FAR branch,call;
наконец всего перечисленного может не быть, вектора и обработчик в одной странице, FAR запрещен, interrupt присутствует, тогда дело может быть в том что, используется BD, а не B, сл-но после нее одна (2) инструкции и наверное не nop'ы, они у Вас в стек случаем ничего не прячут?
Еще одна возможная причина - недостаточно места под стек выделено,
он на что-нибудь наползает, например на статич. переменные. А эти переменные используются в обработчике.
Посмотрите в листинге, симуляторе чем завершается обработчик, да и чем он начинается тоже. Наверное прояснится.
А работающий пример, упрощенный до невозможности, ниже.
FAR запрещен в опциях.



.cmd FILE:
MEMORY
{
PAGE 0:
PRGMEM: origin=0x2000 length=0x1f80 /* code */
VECT: origin = 0x3f80 length = 0x80 /* vectors */
............
PAGE 1:
DATMEM: origin=0x80 lenth=0x1f80 /*data*/
............
}

SECTIONS
{
.........
.text: > PRGMEM PAGE 0
.vectors : > VECT PAGE 0
..........
}

vectors.asm:
.sect ".vectors"
.mmregs
.ref _yourisr
.align 0x80

_reset: NOP ;reset
NOP
NOP
NOP
nmi: RETE ;nmi, not used
NOP
NOP
NOP
....... ; other interrupts
yourinterr:
B _yourisr
NOP
NOP
.............. ;other interrupts
.end
.c file:
short i;
interrupt void yourisr()
{
i+=1;
}
void main()
{
asm(" SSBX INTM");
asm(" andm #0x3faf,*(PMST)");
asm(" orm #0x2c,*(PMST)"); //vectors to 0x3f80, DROM=1,OVLY=1,AVIS=0,CLKOUT DISABLE;
asm(" stm #0xffff,IFR)");
asm(" stm #0xabcd,IMR"); //ABCD - MASK OF YOUR INTERRUPT
asm(" rsbx INTM");
i=0;
while (1) {;}
}





Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru