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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Прерывание PIO AT91SAM7A3
aaarrr
сообщение Sep 23 2008, 10:58
Сообщение #16


Гуру
******

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



Цитата(Сергей Борщ @ Sep 23 2008, 13:29) *
А какого поведения вы ожидаете от контроллера после AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA,PIO_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler);?

Здесь-то как раз все правильно: прерывание по pin level change, поэтому источник внутренний и уровень высокий.
Go to the top of the page
 
+Quote Post
Balaganoff
сообщение Sep 23 2008, 12:02
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 24-08-07
Пользователь №: 30 034



Прерывания же от PIO считаются внутренними, а "значения активных уровней внутренних прерываний для пользователя не имеют значения" .
Там только

1.AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ( поле SRCTYPE регистра AIC_SMR0[n] =0). В этом случае прерывается постоянно даже без его инициализации джойстиком .

2.AT91C_AIC_SRCTYPE_POSITIVE_EDGE (поле SRCTYPE регистра AIC_SMR0[n] =1). В этом случае в этом случае прерывания не наступает ни при каких действиях .

3.AT91C_AIC_SRCTYPE_HIGH_LEVEL (поле SRCTYPE регистра AIC_SMR0[n] =2) . Как в п 1.


4.AT91C_AIC_SRCTYPE_POSITIVE_EDGE поле SRCTYPE регистра AIC_SMR0[n] =3) . Как в п.2.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2008, 12:26
Сообщение #18


Гуру
******

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



Цитата(Balaganoff @ Sep 23 2008, 15:02) *
Прерывания же от PIO считаются внутренними, а "значения активных уровней внутренних прерываний для пользователя не имеют значения" .
Да, ступил, признаю. Тогда надо проверять, что подтяжки действительно включены, что сигнал от джойстика приходит на нужную ногу, смотреть, в каком виде хочет второй параметр AT91F_PIO_InterruptEnable() и чему равна SW4_MASK
Больше у меня версий нет. Вот этот код работает:
Код
void CMX_init()
{
    AT91C_BASE_PIOA->PIO_IER = (1UL<<19);    // FFSK_CLK
    // AIC
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST + 1;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (uint32_t)CMX469_Int_Handler;

    AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_PIOA);    // enable ints
}


OS_INTERRUPT void CMX469_Int_Handler()
{
    OS::TISRW ISR;
    if(AT91C_BASE_PIOA->PIO_ISR & (1<<19))
    {
        FFSK_modem.put(signal(FFSK_DATA), ADC.RSSI());
    }
    AT91C_BASE_AIC->AIC_EOICR = 0;            // Reset AIC logic
}


--------------------
На любой вопрос даю любой ответ
"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
Balaganoff
сообщение Sep 23 2008, 14:53
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 24-08-07
Пользователь №: 30 034



Ух! Все заработало. Сразу хочу сказать большое всем спасибо за помощь, ценные советы и оказанное внимание.

Какой же я олух!!! С прерываниями от джостика не получалось,в итоге я параллелно начал работать только с одной ногой PIOB2, чтобы последовательно и наглядно без всяких там масок типа SW4_MASK все разобрать (благо все пины они введены на колодку ).

В итоге что-то комментарил , что разкомментарил , а обработчик был один для двух версий программ!!!
В конце его сброс регистра статуса dummy =AT91C_BASE_PIOA->PIO_ISR, но я то-работал уже c PIOB.

Т.е. я думаю было так, я коротил PIOB2 на землю с влюченной подтяжкой, наступало прерывание как и должно быть,но в конце програмым обработки нужный регистр статуса не сбрасывался. И получается вновь вход в перрывание и так постоянно.

В итоге исправил dummy =AT91C_BASE_PIOA->PIO_ISR, на dummy =AT91C_BASE_PIOB->PIO_ISR

Так по памяти, может еще что где исправлял, но вроде бы так было.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 23 2008, 15:01
Сообщение #20


Гуру
******

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



Цитата(Balaganoff @ Sep 23 2008, 18:53) *
В итоге исправил dummy =AT91C_BASE_PIOA->PIO_ISR, на dummy =AT91C_BASE_PIOB->PIO_ISR

Исправьте еще dummy =AT91C_BASE_PIOB->PIO_ISR просто на AT91C_BASE_PIOB->PIO_ISR;
Не нужно плодить лишние переменные.
Go to the top of the page
 
+Quote Post

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

 


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


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