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

 
 
> Прерывание срабатывает после старта контроллера
алексей500
сообщение Jun 9 2010, 17:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Может кто встречался с такой проблемой. Хочу помигать диодиком по прерыванию от порта.
После загрузки программы в контроллер(AT91SAM7A3) вроде бы работает нормльно, обработчик прерывания выполняется по прерыванию. Потом отключаю питание и снова включаю. И программа остаётся висеть в прерывании. Вот куски кода:


MAIN:

CODE
int main(void)
{
AT91S_AIC * pAic=AT91C_BASE_AIC;



pAic->AIC_IDCR = 1<<AT91C_ID_PIOA;//mask ;
//* Save the interrupt handler routine pointer and the interrupt priority
pAic->AIC_SVR[AT91C_ID_PIOA] = (unsigned int) int_button1 ;
//* Store the Source Mode Register
pAic->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | 7 ;
;
//* Clear the interrupt on the interrupt controller
pAic->AIC_ICCR = 1<<AT91C_ID_PIOA ;




// Нулевую ножку PIOB на выход

*AT91C_PIOB_PER=0x00000001;
*AT91C_PIOB_OER=0x00000001;
*AT91C_PIOB_PPUDR=0x00000001;
*AT91C_PIOB_SODR=0x00000001;




//Нулевую ножку PIOA на прерывание

*AT91C_PIOA_PPUDR=0x00000001;
*AT91C_PIOA_IER=0x00000001;





//Enable interrupt
pAic->AIC_IECR = 0x1 << AT91C_ID_PIOA ;



while(1){}



Обработчик:

Код
void int_button1()
{
  while(1){*AT91C_PIOB_SODR=0x00000001;
  *AT91C_PIOB_CODR=0x00000001;}

*AT91C_AIC_EOICR=0;
}





Я взял пример прям из IAR'а - getting-started-project.

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
aaarrr
сообщение Jun 9 2010, 17:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Для генерации прерывания тактирование PIO должно быть включено. В вашем коде включения я не вижу. Для срабатывания достаточно любого перехода на линии PIO - вы точно уверены, что там ничего не проскакивает?

И еще: работа с прерываниями от внутренних источников по фронту - дело безблагодатное и в 99.9% случаев не нужное.
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 9 2010, 19:05
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Попробовал поймать прерывание с другой ножки, такой же эффект. Тактирование тут включается, просто я не стал вставлять сюда, чтобы не отвлекать внимание на непонятные функции. Да и нога дрыгается, когда обработчик выполняется(или чтобы ногой дрыгать необязательно тактирование PIO включать?). И кстати такой странный эффект: прерывание ловится, когда я просто осциллографом тыкаю на ножку, с которой прерывание ловлю. А вопрос: PIO считается внутренним источником для прерывания? Я попробовал изменить, чтобы по уровню было, тоже самое. Так что пока сижу думаю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 19:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(алексей500 @ Jun 9 2010, 23:05) *
чтобы ногой дрыгать необязательно тактирование PIO включать?

Не обязательно. Обязательно только если нога работает как вход PIO или источник общего прерывания PIO.

Цитата(алексей500 @ Jun 9 2010, 23:05) *
И кстати такой странный эффект: прерывание ловится, когда я просто осциллографом тыкаю на ножку, с которой прерывание ловлю.

Прерывание ловится по любому фронту. Если нога висит в воздухе и pull-up выключен, то оно неминуемо случится от любой малейшей наводки, в том числе от касания щупом осциллографа.

Цитата(алексей500 @ Jun 9 2010, 23:05) *
А вопрос: PIO считается внутренним источником для прерывания?

Внутренним.
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 9 2010, 20:40
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Странным образом эффект когда обработчик прерывания начинает выполняться при старте контроллера исчез. Не знаю я вроде ту же программу пробую. Ну да ладно тем лучше. Но прерывание всё равно ловится от малейшего прикосновения. Нога висит в воздухе. Включаю подтяжку - всё равно когда трогаю щупом срабатывает прерывание.


Цитата
И еще: работа с прерываниями от внутренних источников по фронту - дело безблагодатное и в 99.9% случаев не нужное.


А если нужно чтобы прерывание срабатывало именно по фронту(не по спаду rolleyes.gif ), то так как у меня написано не поможет?

Код
pAic->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7;
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 20:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(алексей500 @ Jun 10 2010, 00:40) *
Включаю подтяжку - всё равно когда трогаю щупом срабатывает прерывание.

Значит, емкости щупа вполне хватает для создания "иголки" на выводе. Ничего удивительного.

Цитата(алексей500 @ Jun 10 2010, 00:40) *
А если нужно чтобы прерывание срабатывало именно по фронту(не по спаду rolleyes.gif ), то так как у меня написано не поможет?

Код
pAic->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7;

Не поможет. Прерывания PIO всегда срабатывают по любому изменению состояния вывода. Можете только программно проверить, что пришел нужный фронт. Или используйте выводы IRQx.
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 9 2010, 21:31
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Хорошо, спасибо большое за помощь.
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 20 2010, 21:51
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



А вот ещё такой вопрос. Если используется много ножек для ловли прерывания, и частота изменения сигнала на них большая, то пока проверяешь из-за какой ноги прерывание сработало, состояние на какой-нибудь ножке уже изменится. С этой проблемой как-нибудь борятся? И вообще, существует такая проблема у кого-нибудь?smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 20 2010, 21:57
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



С этой проблемой не борются, ее просто стараются не создавать. Если период изменения состояния вывода(-ов) меньше времени обработки прерывания, то тут уже ничего не поделаешь.

Зачем нужна куча быстрых внешних прерываний?
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 20 2010, 23:52
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Ну, у меня пока такой проблемы нет, но может появиться. Сейчас только с двух ножек ловлю прерывания. Пока что делаю так: проверяю сначала ту, изменение на которой происходит быстрее.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 21 2010, 00:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(алексей500 @ Jun 21 2010, 03:51) *
С этой проблемой как-нибудь борятся?
Попробуйте использовать таблицу переходов. Она может быть излишней по размеру коду, но всяко быстрее, чем последовательный перебор с проверкой всех источников прерываний.
Go to the top of the page
 
+Quote Post
алексей500
сообщение Jun 21 2010, 13:41
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



Хм, ок, спасибо, возьму на заметку.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2010, 13:47
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Что-то я слабо представляю, каким боком тут можно притянуть таблицу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:48
Рейтинг@Mail.ru


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