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

 
 
> Применение прерываний в Nios II
Alexey_Rostov
сообщение Jan 16 2014, 00:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Здравствуйте. Только осваиваю Nios. Подскажите пожалуйста как решить следующую задачу.
Собрал в Qsys простейшую схему:
Прикрепленное изображение

В Quartus собрал счетчик. Со счетчика подаю сигнал на Nios и возвращаю из Nios на светодиоды.
Использование функций

Код
d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10);

приводит к тому, что при медленном счете Nios выводит на светодиоды один и тот же отсчет многократно.

Как сделать, чтобы сигнал из Nios на светодиоды выводился только один раз при приеме нового байта от счетчика?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Swup
сообщение Jan 17 2014, 10:41
Сообщение #2


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

Группа: Свой
Сообщений: 127
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Я как-то делал вот так.

1. на PIO заведены 4 тумблера.
Модуль вышлет прерывание при изменении любого разряда на регистре PIO. Это будет отражено в регистре pio_edge_cap(как-то так).
Прикрепленное изображение


2. функция прерывания выводящая код с 4 тумблеров на 4 светодиода.

Код
void handle_buttons_ISR()
{
    unsigned int led;
    led = IORD(BUTTONS_BASE, 0x00));    // захват данных из регистра pio
    IOWR(LED_BASE, 0, led );            // запись данных в регистр led
    IOWR(BUTTONS_BASE, 3, 0x00));        // обнуляется регистр pio_edge_cap
}


3. регистрируем прерывание по адресу в основной программе.
Примерно так.
Код
int main (void)
{
    IOWR(BUTTONS_BASE, 2, 0x0F);       //маска прерываний, разрешает прерывание при изменение всех 4х бит
    IOWR(BUTTONS_BASE, 3, 0x00);      // сбрасывается регистр pio_edge_cap
    alt_ic_isr_register( NULL, BUTTONS_IRQ, handle_buttons_ISR, NULL, 0x00 );

    while (1)
    {
    
    }

    return 0;
}


ПС если не хотите с этим морочиться, то перед записью просто проверяйте, что d10 изменился после записи.
Например так.
Код
d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE);
if (d10_tmp != d10)
{
     IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10);
}
d10_tmp= d10;


Сообщение отредактировал Swup - Jan 17 2014, 10:44
Go to the top of the page
 
+Quote Post



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

 


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


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