|
Работа с прерываниями в at91sam7s, не вызывается повторное прерывание |
|
|
|
Jul 7 2009, 03:57
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Конфигурация прерываний происходит следующим образом: Код void RT() { AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_PIOA, 0x06, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, irq_RT); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW2_MASK); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW3_MASK); //Маска прерываний на PA23, PA24 //* set the interrupt by software AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA); while(1); //Ожидание прерывания } Обработчик прерываний: Код __ramfunc void irq_RT() { //Определение источника прерывания и запрет прерываний int i_status = AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA); if(i_status&0x800000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW3_MASK); //Прерывание пришло от PA23 if(i_status&0x1000000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW2_MASK); //Прерывание пришло от PA24 AT91F_AIC_DisableIt(AT91C_BASE_AIC, AT91C_ID_PIOA); ... //программа обработки прерывания ... //Разрешение прерываний if(i_status&0x800000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW3_MASK); if(i_status&0x1000000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW2_MASK); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA); Первое прерывание нормально обрабатывается, но второе прерывание не обрабатывается, хотя источником является тот же вывод (PA24). Чтобы обработать следующее прерывание, приходится презагружать устройство и заново вызывать прерывание. То есть больше одного прерывания подряд не обрабатывает. Почемутак происходит, я ведь правильно конфигурирую прерывания? Заранее благодарен!
|
|
|
|
|
 |
Ответов
|
Aug 5 2009, 05:37
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Прерывание вызывается по внешнему сигналу от порта. В качестве сигнала вызова подпрограммы обработки прерывания у меня моргает светодиод 2 раза. Точнее, должен моргать. На самом деле, светодиод моргает 4 раза, то есть обработчик вызывается 2 раза. При этом осциллограф показал всего один импульс на входе внешнего прерывания. Я ввел в обработчик функции, запрещающие прерывания, но это не помогло. Код //Инициализация прерывания __ramfunc void RT() { //Настройка портов ввода-ввывода regs->PIOA_OER = 0x22490000; regs->PIOA_ODR = ~0x22490000; regPIO->PIO_PPUDR = 0x63DDFFFF; regs->PIOA_OWER = 0x2249ffff; regs->PIOA_OWDR = ~0x2249ffff; regs->PIOA_ODSR = 0x0080000; //R/W=0, REG=0, STRB=1 // Load System pAic Base address AT91F_AIC_ConfigureIt_MY( AT91C_BASE_AIC, AT91C_ID_PIOA, 0x06, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, irq_RT); AT91F_PIO_InterruptEnable_MY(AT91C_BASE_PIOA,SW2_MASK); AT91F_PIO_InterruptEnable_MY(AT91C_BASE_PIOA,SW3_MASK); // set the interrupt by software AT91F_AIC_EnableIt_MY(AT91C_BASE_AIC, AT91C_ID_PIOA); while(1){regs->PIOA_ODSR = 0x0080000;} //Ожидание прерывания }//RT()
//Обработчик прерываний __ramfunc void irq_RT() { int i_status = 0x0; i_status = AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA); if(i_status&0x800000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW3_MASK); //Прерывание пришло от PA23 if(i_status&0x1000000) AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA,SW2_MASK); //Прерывание пришло от PA24 AT91F_AIC_DisableIt_MY(AT91C_BASE_AIC, AT91C_ID_PIOA); //Прием командного слова if(i_status&0x800000) regs->PIOA_ODSR = 0x400000; //REG=0, R/W=1, STRB=0, CHA/CHB=0 ïðè CHA if(i_status&0x1000000) regs->PIOA_ODSR = 0x410000; //REG=0, R/W=1, STRB=0, CHA/CHB=1 ïðè CHB PIO_copy = regs->PIOA_PDSR; //считываем данные с порта контроллера regs->PIOA_ODSR = 0x0080000; if(PIO_copy != 0x0) i_PIO=1; if(i_PIO == 1) { i = 300000; while(i!=0) { if(i>=200000 & i<=300000) regs->PIOA_ODSR = 0x0080001; //Лампочка горит if(i>=100000 & i<200000) regs->PIOA_ODSR = 0x0080000; //не горит if(i<100000) regs->PIOA_ODSR = 0x0080001; //горит i--; } i_PIO=0; }
AT91C_BASE_AIC->AIC_EOICR = status; if(i_status&0x800000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW3_MASK); if(i_status&0x1000000) AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW2_MASK); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA); } Почему прерывание 2 раза вызывается, если внешний сигнал только один? Заранее благодарен. файл стартапа прилагается
|
|
|
|
|
Aug 5 2009, 05:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Bulat @ Aug 5 2009, 08:37)  if(i>=200000 & i<=300000) regs->PIOA_ODSR = 0x0080001; //Лампочка горит if(i>=100000 & i<200000) regs->PIOA_ODSR = 0x0080000; //не горит Должно быть: Код if(i>=200000 && i<=300000) regs->PIOA_ODSR = 0x0080001; //Лампочка горит if(i>=100000 && i<200000) regs->PIOA_ODSR = 0x0080000; //не горит
|
|
|
|
Сообщений в этой теме
Bulat Работа с прерываниями в at91sam7s Jul 7 2009, 03:57 SergeiCh Тему не в том разделе создали, надо в помощь начин... Jul 7 2009, 04:37 dimka76 Цитата(Bulat @ Jul 7 2009, 07:57) Первое ... Jul 7 2009, 08:35 Troll Цитата(dimka76 @ Jul 7 2009, 14:35) Перед... Jul 7 2009, 09:07 aaarrr Ну, добавим еще традиционную и очевидную ошибку - ... Jul 7 2009, 11:32 SergeiCh Цитата(aaarrr @ Jul 7 2009, 18:32) Если п... Jul 7 2009, 12:49  aaarrr Цитата(SergeiCh @ Jul 7 2009, 16:49) Как ... Jul 7 2009, 12:53   SergeiCh Цитата(aaarrr @ Jul 7 2009, 19:53) (и кто... Jul 7 2009, 15:43    aaarrr Цитата(SergeiCh @ Jul 7 2009, 19:43) Надо... Jul 7 2009, 15:49     Bulat Цитата(aaarrr @ Jul 7 2009, 21:49) Да, на... Jul 8 2009, 08:47 Troll Не сильно хорошо разбираюсь в Ассемблере. Но на пе... Jul 8 2009, 09:34 Bulat Цитата(Troll @ Jul 8 2009, 15:34) Не силь... Jul 8 2009, 09:48 Troll Цитата(Bulat @ Jul 8 2009, 15:48) Так вот... Jul 8 2009, 10:49 aaarrr Цитата(Troll @ Jul 8 2009, 13:34) Команда... Jul 8 2009, 11:47 Bulat Цитата(aaarrr @ Jul 8 2009, 17:47) Команд... Jul 9 2009, 10:38 Troll Цитата(aaarrr @ Jul 8 2009, 17:47) Но я б... Jul 8 2009, 11:59 aaarrr Цитата(Troll @ Jul 8 2009, 15:59) aaarrr ... Jul 8 2009, 12:13  singlskv Цитата(aaarrr @ Jul 8 2009, 16:13) Связан... Jul 9 2009, 23:26 Troll Цитата(aaarrr @ Jul 8 2009, 18:13) а в сл... Jul 8 2009, 12:46 aaarrr Цитата(Troll @ Jul 8 2009, 16:46) Что в э... Jul 8 2009, 12:51 Troll Отключать прерывания не нужно.
КодAT91F_AIC_Disab... Aug 5 2009, 06:20 Bulat спасибо за ответы, но это не решает основной пробл... Aug 5 2009, 07:25 sergeeff В конце обработчика прерывания сбросьте флаг перыв... Aug 5 2009, 07:55 Bulat Цитата(sergeeff @ Aug 5 2009, 13:55) В ко... Aug 5 2009, 09:39 zltigo Цитата(sergeeff @ Aug 5 2009, 10:55) Кодv... Aug 5 2009, 12:08 singlskv Цитата(sergeeff @ Aug 5 2009, 11:55) В ко... Aug 5 2009, 20:09 Troll Цитата(sergeeff @ Aug 5 2009, 11:55) В ко... Aug 5 2009, 10:48 aaarrr Цитата(Troll @ Aug 5 2009, 14:48) А я реш... Aug 5 2009, 11:52 sergeeff Уважаемый Гуру!
Я прекрасно помню про вашу не... Aug 5 2009, 12:36 zltigo Цитата(sergeeff @ Aug 5 2009, 15:36) Ваши... Aug 5 2009, 14:14 sergeeff Вы же сами признавались в топике (http://electroni... Aug 5 2009, 16:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|