Технический форум по робототехнике.
-= Александр =- » 21 окт 2010, 12:56
Дошел я наконец до прерываний...
Никак не могу понять откуда берется связь обработчика с самим прерыванием.
Вот написал я функцию
- Код: Выделить всё • Развернуть
void SPI0Handler (void) __irq
И что теперь писать в lpc2400.s ?
Там я вижу такую запись:
- Код: Выделить всё • Развернуть
Vectors LDR PC, Reset_Addr
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, PAbt_Addr
LDR PC, DAbt_Addr
NOP ; Reserved Vector
; LDR PC, IRQ_Addr
LDR PC, [PC, #-0x0120] ; Vector from VicVectAddr
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler
Откуда берутся эти адреса и как мне получить адрес моего обработчика чтоб вставить его туда?
avr123.nm.ru » 21 окт 2010, 13:36
Наверно в примерах надо позырить.
Сергей » 21 окт 2010, 13:59
А еще лучше в книжке "Микроконтроллеры ARM7 семейства LPC2000" Редькин П.П.
-= Александр =- » 21 окт 2010, 14:52
Там все устройство описано. А вот как это все программировать - непонятно. Что в стартап писать, как обработчики объявлять и к прерываниям привязывать - совершенно непонятно...
Сергей » 21 окт 2010, 15:09
А разобрать один из бесконечного числа примеров религия не позволяет?
-= Александр =- » 21 окт 2010, 15:34
Разбираю... Честно говоря мало что понятно. Неужели просто назвать функцию void EINT0_Handler (void) __irq - уже значит привязать ее к прерыванию? А как он понимает к какому? Что-то не верится. Попробую щас что-то свое в таком духе сгенерить...
galex1981 » 21 окт 2010, 15:43
Да, просто по названию идет привязка к определенному прерыванию. По моему в заголовочном файле идет опиание и привязка какого к чему
-= Александр =- » 21 окт 2010, 15:47
Оказалось что не в файле. Есть такой файлик irq.c - там есть функция привязки.
Например
- Код: Выделить всё • Развернуть
install_irq(EINT0_INT,(void *)EINT0_Handler,HIGHEST_PRIORITY )
Привязывает вектор EINT0_INT к функции EINT0_Handler и дает высший приоритет.
Естественно в настройках источника прерывания (в данном случае внешнего входа) надо его разрешить.
Щас проверю как оно работает...
Сергей » 21 окт 2010, 15:50
Саша, ну честно, не ожидал от тебя таких вопросов =)
Вектора прописываются в контроллере прерываний, там задается источник, приоритет и указатель на функцию обработчик. Они маскируемые потому-что. Если, к примеру, у тебя не маскируемые прерывания, то у каждой периферии свой обработчик с масками источника.
Добавлено спустя 38 секунд:
Все это в даташите последовательно рассказано!
-= Александр =- » 21 окт 2010, 16:38
Это я понял... Прописал вроде все как надо. Теперь думаю почему ноль эффекта...
Добавлено спустя 10 минут 39 секунд:Как обычно проблему создавала внешняя схема. Я уж какие только примеры туда не вставлял - ноль эффекта. Сигнал внешнего прерывания вообще до проца не доходил. Щас его ногу пинцетом подергал - прерывание случилось!
Сергей » 21 окт 2010, 16:41
Лучше всего проверять базовый функционал с помощью симулятора Keil, очень удобно. Да еще и скрипты писать можно.
Romikgy » 21 окт 2010, 21:15
поточнее насчет последнего
avr123.nm.ru » 21 окт 2010, 21:49
в примерах точно в хелпе коменты.
Romikgy » 22 окт 2010, 00:51
скрипты описаны в примерах?
avr123.nm.ru » 22 окт 2010, 09:00
ага.