Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

LPC13xx Внешнее прерывание

Непрочитано 09.02.2012, 18:01  
Sinopteek
Частый гость
 
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
Sinopteek на пути к лучшему
По умолчанию LPC13xx Внешнее прерывание

Я пытаюсь, симулировать внешнее прерывание на lpc1343 посредством KEIL.
Пробую код с http://ics.nxp.com/products/lpc1000/lpc13xx/
Там выставляются все 4 внешних прерывания для портов EINT0-3.
Но когда я пытаюсь имитировать его, это не работает.
Прерывания настраиваются по нарастающему фронту и включаются, NVIC тоже.
Когда меняю внешнюю ножку в порту ввода/вывода, бит в GPIO1RIS (для первого порта) устанавливается.
Но прерывания не происходит.
Когда я устанавливаю бит "Pending" в блоке NVIC для этого обработчика прерываний всё работает нормально.

Тот же результат с другим проектом с внешним прерыванием.
Тот же результат с аппаратным моделирования этого проекта.
В Errdata инфы нет.

Кто посоветует, что нет так или даст кусок кода рабочего для отладки внешних прерываний?

Может быть, это ошибка аппаратная?
Реклама:
Sinopteek вне форума  
Непрочитано 09.02.2012, 22:25  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: LPC13xx Внешнее прерывание

Сообщение от Sinopteek Посмотреть сообщение
Пробую код с
А чё не просто с nxp.com?
Конкретный участок кода - конкретный вопрос - конкретный ответ.
omercury вне форума  
Непрочитано 10.02.2012, 06:02  
Sinopteek
Частый гость
 
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
Sinopteek на пути к лучшему
По умолчанию Re: LPC13xx Внешнее прерывание

Сообщение от omercury Посмотреть сообщение
А чё не просто с nxp.com?
Конкретный участок кода - конкретный вопрос - конкретный ответ.
Сообщение от main.c
GPIOInit();

/* use port0_1 as input event, interrupt test. */
GPIOSetDir( PORT0, 1, 0 );
/* port0_1, single trigger, active high. */
GPIOSetInterrupt( PORT0, 1, 0, 0, 0 );
GPIOIntEnable( PORT0, 1 );
Сообщение от gpio.c
void GPIOInit( void )
{
/* Enable AHB clock to the GPIO domain. */
LPC_SYSCON-›SYSAHBCLKCTRL |= (1‹‹6);

/* Set up NVIC when I/O pins are configured as external interrupts. */
NVIC_EnableIRQ(EINT0_IRQn);
NVIC_EnableIRQ(EINT1_IRQn);
NVIC_EnableIRQ(EINT2_IRQn);
NVIC_EnableIRQ(EINT3_IRQn);
return;
}

void GPIOSetInterrupt( uint32_t portNum, uint32_t bitPosi, uint32_t sense,
uint32_t single, uint32_t event )
{
switch ( portNum )
{
case PORT0:
if ( sense == 0 )
{
LPC_GPIO0-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO0-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO0-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO0-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO0-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO0-›IEV |= (0x1‹‹bitPosi);
break;
case PORT1:
if ( sense == 0 )
{
LPC_GPIO1-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO1-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO1-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO1-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO1-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO1-›IEV |= (0x1‹‹bitPosi);
break;
case PORT2:
if ( sense == 0 )
{
LPC_GPIO2-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO2-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO2-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO2-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO2-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO2-›IEV |= (0x1‹‹bitPosi);
break;
case PORT3:
if ( sense == 0 )
{
LPC_GPIO3-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO3-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO3-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO3-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO3-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO3-›IEV |= (0x1‹‹bitPosi);
break;
default:
break;
}
return;
}

void GPIOIntEnable( uint32_t portNum, uint32_t bitPosi )
{
switch ( portNum )
{
case PORT0:
LPC_GPIO0-›IE |= (0x1‹‹bitPosi);
break;
case PORT1:
LPC_GPIO1-›IE |= (0x1‹‹bitPosi);
break;
case PORT2:
LPC_GPIO2-›IE |= (0x1‹‹bitPosi);
break;
case PORT3:
LPC_GPIO3-›IE |= (0x1‹‹bitPosi);
break;
default:
break;
}
return;
}
void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
{
if(dir)
LPC_GPIO[portNum]-›DIR |= 1‹‹bitPosi;
else
LPC_GPIO[portNum]-›DIR &= ~(1‹‹bitPosi);
}
По функциям всё работает - устанавливаются биты в соответствии с даташитом. В симуляторе видно.
По логике вроде тоже =)

Однако, в прерывание не входит при изменении состояния бита порта. Хотя, бит прерывания и устанавливается.
Принудительное программное прерывание(Pending через окошко настройки NVIC) работает, следовательно указатель на обработчик прерывания верен, в противном случае был бы HardFault.

Что я делаю не так?
p.s. смайлы тут, уж, больно весёлые

Последний раз редактировалось Sinopteek; 10.02.2012 в 06:30.
Sinopteek вне форума  
Непрочитано 17.02.2012, 10:23  
Sinopteek
Частый гость
 
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
Sinopteek на пути к лучшему
По умолчанию Re: LPC13xx Внешнее прерывание

Таки оказалось, что косяк в симуляторе. Суппорт KEIL'а подтвердил на следующий день, как в железе заработало =)
Почему не работало в оригинальном варианте так и не понял. Единственное, что сделал - оставил одно прерывание с одной ножки, остальные - в комментарии.
Sinopteek вне форума  
 

Метки
keil, lpc, nxp, прерывание, симмулятор
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Внешнее питание Canon SX20 IS rusyvochka Ремонт оргтехники 1 30.07.2011 11:49
Внешнее питание AT90USB162 Archer07 Микроконтроллеры, АЦП, память и т.д 2 19.05.2011 06:20
Внешнее прерывание на tiny15 livsha Микроконтроллеры, АЦП, память и т.д 8 21.04.2010 01:11
80c31 + внешнее ПЗУ в Proteus Yuoson Микроконтроллеры, АЦП, память и т.д 7 22.02.2009 20:10
Внешнее питание коммуникатора через USB andruha-d Источники питания и свет 8 27.11.2008 00:08


Часовой пояс GMT +4, время: 09:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.