Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с таймером в ниос
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
_Anatoliy
Коллеги, почему то не выходит ниос из прерывания от таймера. Контроллер прерываний встроенный.
Обработчик:
Код
void Timer0_isr()
    {
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
    flag_isr_tmr = 1;
    }

Ставлю здесь точку остановки , программа в main() больше не возвращается.
Ведь командой
Код
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
я должен снять запрос прерывания.
Собственно зависание происходит в библиотечной функции alt_irq_handler. Я так понял что не сбрасывается запрос.
Код
........................
    active = alt_irq_pending ();
    
  } while (active);


active всегда не равен нулю. Что ещё глянуть?
608
В 2008 году работал с Nios-2. Там правда был не таймер, а кнопки, на которые были поставлены прерывания.
Обработчик кнопок был такой:

#ifndef MY_INTERRUPT_H_
#define MY_INTERRUPT_H_
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//---- my_interrupts.h -------------------------
//----------------------------------------------
static void handle_button_interrupts(void* context, alt_u32 id)
{volatile int* edge_capture_ptr = (volatile int*) context; //cast the context pointer to an integer pointer
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);//Read the EDGE_CAP reg. button PIO & Store value.
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0x0);
}
#endif /*MY_INTERRUPT_H_*/


А инициализация кнопок такая:

//--------------------------------------------
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;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0); // Reset the edge capture register.
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf); // Enable all 4 button interrupts.
alt_irq_register(BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts); // Register the ISR.
edge_capture=0x00; edge_timer=0; LED=0x00;
//IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, LED);
IOWR_ALTERA_AVALON_PIO_DATA(SEVEN_SEG_PIO_BASE, 0xffffffff);
}


Прерывание по таймеру не ставил, так как время контролировал в режиме "полинга", т.е. времени вполне хватало, и можно было просто считывать показания таймера и сравнивать с требуемым.
Пример этот привел просто для сравнения. Бывает, что не хватает каких-то закорючек, и все уже не работает...
_Anatoliy
Цитата(608 @ Aug 28 2018, 08:54) *

Спасибо за желание помочь. Я лет 5 назад писал прогу с таймером, всё работало прекрасно.
Вот этот кусок из старой рабочей программы.
Код
void Timer0_isr()
    {
    IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
    if (CommTimeOut)
       {
       if (CommTimeOut > 1) CommTimeOut--;
       else {CommTimeOut = 0; IndexUartToCom = 0; rx_counter = 0; crc8 = 0;}
       }
    }

Похоже что дело не в обработчике, наверняка пропустил какую то важную штучку. Не могу найти какую...
Swup
А как вы его включаете?

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

вот например у меня устанавливается таймер и сбрасывается (но это с VIC, хотя разницы особо нет:
Код
void ru_timer_isr() {
   IOWR(PERIPHERAL_TIMER_RU_BASE,0,0);
   ...
}
void ru_timer_irq_init()
{
    alt_u32 timer_cnt = sys_freq; // 1sec
    IOWR(PERIPHERAL_TIMER_RU_BASE, 2, timer_cnt & 0xFFFF);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 3, (timer_cnt>>16) & 0xFFFF);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 0, 0x00);
    IOWR(PERIPHERAL_TIMER_RU_BASE, 1, 0x07); // timer start, cont, irq

    alt_ic_isr_register( 0x00, PERIPHERAL_TIMER_RU_IRQ, ru_timer_isr, NULL, 0x00 );
}
_Anatoliy
Цитата(Swup @ Aug 28 2018, 11:10) *

Установил флажок fixed period и всё нормально заработало. Меня это устраивает.
Так и думал что пропустил что-то...
Всем спасибо за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.