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

 
 
 
Reply to this topicStart new topic
> Прерывание AT91SAM7X
Annuta
сообщение Jul 23 2007, 12:47
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 26-04-07
Из: Смоленск
Пользователь №: 27 333



Пытаюсь освоить работу с прерываниями...
Сконфигурировала на вход ножку, подцепила к ней девайс, - идея в том, что когда я даю установку девайсу он должен в течении 300 мс держать на этой ножке чётко 1... если был за это время хоть один сброс в 0 - то взываю прерывание... изменяю флаг... и.т.д...

Вот мой код... Функ-я
Код
//обработчик
void pio_c_irq_handler ( void )
{
    int dummy;    
    TFlag = 1;//уст флаг в один - если был сброс в нуль!
  
    //* enable the next PIO IRQ
    dummy =AT91C_BASE_PIOA->PIO_ISR;
    //* suppress the compilation warning
    dummy = dummy;
    AT91C_BASE_AIC->AIC_EOICR=0x00;
}
....
и далее в главном цикле ... делаю опрос
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LD);
                      
  AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_PIOA, 1,AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL,  pio_c_irq_handler);
                      
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, LD);                                  
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
AT91C_BASE_PIOA->PIO_IER = (1 << LD);  

Sleep(300);
If(TFlag)   // прерывание сработало
{
    ...
}


проблема в том, что прерывание не срабатывает... Т.е. сигнал на ножке скачет и пляшет... а прерывание не срабатывает.
help.gif не могу понять - где ошиблась...???... народ подскажите пожаста...

Сообщение отредактировал Annuta - Jul 23 2007, 12:47


--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
Go to the top of the page
 
+Quote Post
amw
сообщение Jul 23 2007, 13:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



А тактирование PIO включено?
А не нужно ли для обработчика указать какой нибудь атрибут? (#pragma _irq или что-то в этом роде).
А где сохраняется контекст?
А вообще прерывания разрешены? (I_BIT в CPSR)?

Может вопросы избыточны, но я не пользуюсь предопределенными макросами потому как не уверен что они работают так как мне надо.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 23 2007, 13:32
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(amw @ Jul 23 2007, 16:08) *
А вообще прерывания разрешены? (I_BIT в CPSR)?
Наиболее вероятно.
Код
AT91C_BASE_PIOA->PIO_IER = (1 << LD);  
__enable_interrupt();
Sleep(300);
Хотя Sleep() наталкивает на мысль об ОС, а ОС как правило разрешает прерывания при старте.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Annuta
сообщение Jul 23 2007, 14:43
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 26-04-07
Из: Смоленск
Пользователь №: 27 333



прерывания разрешены...
UCOS моя ОС... там всё по умолчанию включено...


--------------------
Из комбинации лени и логики - получается программист! /народная мудрость/
Go to the top of the page
 
+Quote Post
Master
сообщение Jul 23 2007, 15:09
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405



Цитата(Annuta @ Jul 23 2007, 18:43) *
прерывания разрешены...
UCOS моя ОС... там всё по умолчанию включено...

Заодно проверьте размер стека.
И попробуйте сменить AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL на AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE.
И лучше вот эту строчку
Код
AT91C_BASE_PIOA->PIO_IER = (1 << LD);
поставьте до
Код
T91F_PIO_InterruptEnable(AT91C_BASE_PIOA, LD);                                  
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);

Сдвиги не проверял, определение LD не предствалено.
Go to the top of the page
 
+Quote Post
Timofey
сообщение Jul 24 2007, 02:59
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Буквально только что проверил на SAM7X256. Все работает. Ловит высокий логический уровень. Смотрел через J-TAG.
Код
unsigned int TFlag=0;
unsigned int LD=23;
void pio_c_irq_handler ( void )
{
    int dummy;    
    TFlag = 1;//
  
    //* enable the next PIO IRQ
    dummy =AT91C_BASE_PIOA->PIO_ISR;
    //* suppress the compilation warning
    dummy = dummy;
    AT91C_BASE_AIC->AIC_EOICR=0x00;
}
main (void)
{  AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LD);
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91B_LED_MASK);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA, 1,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,  pio_c_irq_handler);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, (1 << LD));                                  
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
while(1)
    {
      if (TFlag==0) {
        AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91B_LED1);
        AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED2);
      } else {
        AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91B_LED2);
        AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED1);
      }
  
    }
    
}


Сообщение отредактировал Timofey - Jul 24 2007, 03:01
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 15:02
Рейтинг@Mail.ru


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