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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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, время: 02:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot