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

 
 
> Ошибка с прерываниями Nios2
torik
сообщение Feb 27 2008, 12:35
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Имеем PIO 8 бить вход с прерыванием по переднему фронту. IRQ=2 в сопсбилдере.
Нужно обработать прерывания от него.
Делаем все по учебнику:

Код
static void handle_button_interrupts(void* context, alt_u32 id) {
    
СЮДА ХОТЕЛОСЬ БЫ ПОПАСТЬ
    /* cast the context pointer to an integer pointer. */
    volatile int* edge_capture_ptr = (volatile int*) context;
    /*
    * Read the edge capture register on the button PIO.
    * Store value.
    */
    *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_2_BASE);
    /* Write to the edge capture register to reset it. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_2_BASE, 0);
    /* reset interrupt capability for the Button PIO. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_2_BASE, 0xff);
}

// Настройка прерывания от PIO_2
static void init_button_pio() {
    /* Recast the edge_capture pointer to match the
    alt_irq_register() function prototype. */
    void* edge_capture_ptr = (void*) &edge_capture;
    /* Enable all 4 button interrupts. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_2_BASE, 0xff);
    /* Reset the edge capture register. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_2_BASE, 0x0);
    /* Register the ISR. */
    alt_irq_register(PIO_2_IRQ, edge_capture_ptr, handle_button_interrupts);
}


Код
...
   init_button_pio();
...

Что получается - глядим дебагером. Когда доходит до одной из функций alt_irq_ччч (к примеру alt_irq_register, а в ней alt_irq_disable_all...) получаем сообщение: "Source not found."

Что это значит, ошибка где? Все что не касается прерываний этого PIO работает нормально...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
torik
сообщение Feb 28 2008, 06:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Ага, погляди заодно аппаратную часть - может дело в этом. Какой номер IRQ, какие прерывания еще... (хотя это не должно влиять).


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Feb 28 2008, 07:39
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Нашел, наконец, свою ошибку, заработало!
Нужно в непосредственном обработчике прерывания static void handle_button_interrupts() убрать сроку с IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf); , то есть не торопиться открывать маску для последующих прерываний. В edge_capture хранится флаг нажатой клавиши, его нужно обрабатывать уже другой программой (например в main с циклом 1мс), а уже в этой программе выполнить IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf); , соответственно сбросив здесь и edge_capture. Ну и нужно еще немного побороться с дребезгом контактов от клавиш.
Кстати, в тестовом примере из board_diag.c, так и сделано.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 08:01
Рейтинг@Mail.ru


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