|
|
  |
Прерывание срабатывает после старта контроллера |
|
|
|
Jun 9 2010, 17:01
|
Участник

Группа: Участник
Сообщений: 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. Заранее спасибо.
|
|
|
|
|
Jun 9 2010, 19:05
|
Участник

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

|
Попробовал поймать прерывание с другой ножки, такой же эффект. Тактирование тут включается, просто я не стал вставлять сюда, чтобы не отвлекать внимание на непонятные функции. Да и нога дрыгается, когда обработчик выполняется(или чтобы ногой дрыгать необязательно тактирование PIO включать?). И кстати такой странный эффект: прерывание ловится, когда я просто осциллографом тыкаю на ножку, с которой прерывание ловлю. А вопрос: PIO считается внутренним источником для прерывания? Я попробовал изменить, чтобы по уровню было, тоже самое. Так что пока сижу думаю.
|
|
|
|
|
Jun 9 2010, 19:22
|
Гуру
     
Группа: Свой
Сообщений: 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 считается внутренним источником для прерывания? Внутренним.
|
|
|
|
|
Jun 9 2010, 20:40
|
Участник

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

|
Странным образом эффект когда обработчик прерывания начинает выполняться при старте контроллера исчез. Не знаю я вроде ту же программу пробую. Ну да ладно тем лучше. Но прерывание всё равно ловится от малейшего прикосновения. Нога висит в воздухе. Включаю подтяжку - всё равно когда трогаю щупом срабатывает прерывание. Цитата И еще: работа с прерываниями от внутренних источников по фронту - дело безблагодатное и в 99.9% случаев не нужное. А если нужно чтобы прерывание срабатывало именно по фронту(не по спаду  ), то так как у меня написано не поможет? Код pAic->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7;
|
|
|
|
|
Jun 9 2010, 20:47
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(алексей500 @ Jun 10 2010, 00:40)  Включаю подтяжку - всё равно когда трогаю щупом срабатывает прерывание. Значит, емкости щупа вполне хватает для создания "иголки" на выводе. Ничего удивительного. Цитата(алексей500 @ Jun 10 2010, 00:40)  А если нужно чтобы прерывание срабатывало именно по фронту(не по спаду  ), то так как у меня написано не поможет? Код pAic->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7; Не поможет. Прерывания PIO всегда срабатывают по любому изменению состояния вывода. Можете только программно проверить, что пришел нужный фронт. Или используйте выводы IRQx.
|
|
|
|
|
Jun 9 2010, 21:31
|
Участник

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

|
Хорошо, спасибо большое за помощь.
|
|
|
|
|
Jun 20 2010, 23:52
|
Участник

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

|
Ну, у меня пока такой проблемы нет, но может появиться. Сейчас только с двух ножек ловлю прерывания. Пока что делаю так: проверяю сначала ту, изменение на которой происходит быстрее.
|
|
|
|
|
Jun 21 2010, 13:41
|
Участник

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

|
Хм, ок, спасибо, возьму на заметку.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|