_sda 0 27 августа, 2018 Опубликовано 27 августа, 2018 · Жалоба Коллеги, почему то не выходит ниос из прерывания от таймера. Контроллер прерываний встроенный. Обработчик: 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 всегда не равен нулю. Что ещё глянуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
0608 0 28 августа, 2018 Опубликовано 28 августа, 2018 (изменено) · Жалоба В 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); } Прерывание по таймеру не ставил, так как время контролировал в режиме "полинга", т.е. времени вполне хватало, и можно было просто считывать показания таймера и сравнивать с требуемым. Пример этот привел просто для сравнения. Бывает, что не хватает каких-то закорючек, и все уже не работает... Изменено 28 августа, 2018 пользователем 608 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 августа, 2018 Опубликовано 28 августа, 2018 · Жалоба Спасибо за желание помочь. Я лет 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 0 28 августа, 2018 Опубликовано 28 августа, 2018 · Жалоба А как вы его включаете? Вообще кажется, что он срабатывает снова, сразу как вы его сбрасываете. Посмотрите просто в сигнал тапе и все будет понятно. вот например у меня устанавливается таймер и сбрасывается (но это с 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 ); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 августа, 2018 Опубликовано 28 августа, 2018 · Жалоба Установил флажок fixed period и всё нормально заработало. Меня это устраивает. Так и думал что пропустил что-то... Всем спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться