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

 
 
> реализация прерываний
Sarez
сообщение May 14 2007, 03:40
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Доброго дня!!! Народ, помогите пожалуйста!!!! Несколько дней уже бьюсь с прерываниями - не могу реализовать- программа не переходит на обработчик .... Опишите, если можно , как для малолетнего идиота, пошагово алгоритм действий....
Опишу, что у делаю я. Есть контроллер 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 ( 2.06 килобайт ) Кол-во скачиваний: 107

Прикрепленный файл  testos_lnk1.rar ( 2.36 килобайт ) Кол-во скачиваний: 115


Сообщение отредактировал Sarez - May 14 2007, 03:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sarez
сообщение May 14 2007, 04:10
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Пробовал....уже когда из шкафа достал любимай бубен, даже так делал :

org 0x18
ldr pc, IRQ

org 0x38
IRQ: dc32 irq_handler

Что то вроде перехода по адресу обработчика прерывания.....
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:18
Рейтинг@Mail.ru


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