Перейти к содержанию
    

А какого поведения вы ожидаете от контроллера после 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, поэтому источник внутренний и уровень высокий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прерывания же от 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прерывания же от 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

В итоге что-то комментарил , что разкомментарил , а обработчик был один для двух версий программ!!!

В конце его сброс регистра статуса dummy =AT91C_BASE_PIOA->PIO_ISR, но я то-работал уже c PIOB.

 

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

 

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

 

Так по памяти, может еще что где исправлял, но вроде бы так было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Исправьте еще dummy =AT91C_BASE_PIOB->PIO_ISR просто на AT91C_BASE_PIOB->PIO_ISR;

Не нужно плодить лишние переменные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...