Sarez 0 14 мая, 2007 Опубликовано 14 мая, 2007 (изменено) · Жалоба Доброго дня!!! Народ, помогите пожалуйста!!!! Несколько дней уже бьюсь с прерываниями - не могу реализовать- программа не переходит на обработчик .... Опишите, если можно , как для малолетнего идиота, пошагово алгоритм действий.... Опишу, что у делаю я. Есть контроллер LPC 2214. Есть источник прерывания ( стек W3150) . Есть IAR 4.40 . Источник висит на линии порта ввода/вывода P0.16. Линия сконфигурирована как вход внешнего прерывания EINT0 ( регистр IO0DIR = 0x000000, т.е нога P0.16 сконфигурирована как вход, регистр PINSEL1 = 0x01, т.е линия сконфигурирована как вход внешнего прерывания..) . Сигналом прерывания является низкий уровень на входе. Соответственно содержимое регистра EXMODE ( выбор типа прерывания - по фронту или по уровню , не менял - там нули..). startup файл добовляю в проект и прописываю следующее ( полную версию startup прилагаю) : org 0x18 ldr pc, 0xFFFFF030 ; адрес регистра VicVectAddr В xls файле по поводу стеков следующее ( полную версию прилагаю ) : //************************************************************************* // Stack and heap segments. //************************************************************************* -Z(DATA)CSTACK+2000=40000000-40003FFF -Z(DATA)IRQ_STACK+100=40000000-40003FFF -Z(DATA)HEAP+8000=40000000-40003FFF -Z(DATA)FIQ_STACK+100=40000000-40003FFF Функция обработки : __arm __irq void irq_handler() { printf("socket is :"); IR_STATUS[0] = IINCHIP_READ(INT_REG); IR_STATUS[0] = IINCHIP_READ(INT_STATUS(0)); EXTINT = 0x1; VICVectAddr = 0; // Clear interrupt in VIC. // iinchip_irq(); } Определена до main. Функция инициализации VIC : void irq_init () { IO0DIR = 0x00000000; PINSEL1 = 0x00000001; VICVectCntl0 = 0x2e; VICVectAddr0 = (unsigned)&irq_handler; VICIntSelect = 0x00000000; VICIntEnable = 0x00004000 ; } Вызываю в main() до инициализации самого источника прерываний. Что самое интересное - в регистрах EXTINT и VIQIRQStatus после возникновения прерываний еденицы, т.е контроллер прерывание ловит, но почему-то не переходит на его обработчик.... Обьясните пожалуйста пошагово, как это делать. Если можно, подкинте примеры startupa.. Пытался сделать прерывание fiq, как показывал уважаемый Andy Mozzhevilov тут http://electronix.ru/forum/index.php?showtopic=31378 был тут http://electronix.ru/forum/index.php?showt...mp;#entry190686 тут http://electronix.ru/forum/index.php?showt...27621&st=15 но ничего не вышло. Пожалуйста помогите!!!! cstartup.rar testos_lnk1.rar Изменено 14 мая, 2007 пользователем Sarez Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба Попробуй ldr PC,[PC,#-0x0FF0]. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarez 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба Пробовал....уже когда из шкафа достал любимай бубен, даже так делал : org 0x18 ldr pc, IRQ org 0x38 IRQ: dc32 irq_handler Что то вроде перехода по адресу обработчика прерывания..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба а __enable_interrupt стоит в main ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarez 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба а __enable_interrupt стоит в main ? Поподробне пожалуйста? Чтобы разрешить прерывания нужно еще что нибудь сделать , кроме записи едениц по требуемым каналам в регистр VICIntEnable ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба Поставить вот эту строчку в main() __enable_interrupt(); И ещё в начале файла main поставить вот это #include <inarm.h> Хотя я предпочитаю вот это: #define _disIRQ() __set_CPSR(__get_CPSR() | 0xc0) #define _enaIRQ() __set_CPSR(__get_CPSR() & ~0xc0) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sarez 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба Есть!!! Обработал!!! Спасибо большое :a14: Буду разбираться с этим файлом. БОЛЬШОЕ СПАСИБО!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба Ну и если ещё не глядели, то в errata про extint почитайте чтобы не наступить потом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться