Давайте по порядку.
Цитата(barabek @ Feb 19 2012, 04:08)

Добейтесь сперва работоспособности прерывания от таймера.
Создаю такой таймер к примеру, рис.1.
Цитата(barabek @ Feb 19 2012, 04:08)

Функции прерывания написаны в таком виде void COM_ISR(void * Context,alt_u32 id) (или при Enhansed void COM_ISR(void * Context) )?
Пишу так:
CODE
int io = 0;
void COM_ISR(void* context, alt_u32 id)
{
io = io + 1; // здесь я поставил точку прерывания слева
}
...
int main (void)
{
...
alt_irq_register(SYS_TIMER_IRQ, 0, COM_ISR);
...
alt_u16 states;
alt_u16 control;
//ну и чем-то чтобы себя занять, кручусь в цикле ожидая прерывания от таймера
while(1)
{
states = IORD(SYS_TIMER_BASE, 0);
control = IORD(SYS_TIMER_BASE, 1);
i = i + 1;
}
...
}
в модуле system.h то, что касается таймера описано так:
CODE
#define ALT_MODULE_CLASS_sys_timer altera_avalon_timer
#define SYS_TIMER_ALWAYS_RUN 1
#define SYS_TIMER_BASE 0x0
#define SYS_TIMER_COUNTER_SIZE 32
#define SYS_TIMER_FIXED_PERIOD 1
#define SYS_TIMER_FREQ 50000000u
#define SYS_TIMER_IRQ 2
#define SYS_TIMER_IRQ_INTERRUPT_CONTROLLER_ID 0
#define SYS_TIMER_LOAD_VALUE 14ULL
#define SYS_TIMER_MULT 2.0E-8
#define SYS_TIMER_NAME "/dev/sys_timer"
#define SYS_TIMER_PERIOD 15
#define SYS_TIMER_PERIOD_UNITS "clocks"
#define SYS_TIMER_RESET_OUTPUT 0
#define SYS_TIMER_SNAPSHOT 0
#define SYS_TIMER_SPAN 32
#define SYS_TIMER_TICKS_PER_SEC 3333334u
#define SYS_TIMER_TIMEOUT_PULSE_OUTPUT 0
#define SYS_TIMER_TYPE "altera_avalon_timer"
Далее компилирую обновленные файлы, нажимаю на "жучка" и перехожу в режим "debug nios"
В режиме отладки перед тем как зайти в функцию регистрации смотрю, на всплывающую подсказку, которая говорит, что
SYS_TIMER_IRQ = 0, хотя в system.h он определен как SYS_TIMER_IRQ = 2 (рис.2). Ну я думаю это просто глюк..У Вас наверное также...
перед выходом из функции регистрации rc = 0, что говорит, что нормально зарегилась...
Цитата
Соответствующий бит разрешения всех прерываний в регистре status выставлен?
После того, как я начинаю крутиться в цикле, который уже упоминал, дожидаясь события смотрю в окно register (рис.3)
я там выставил двоичный формат, мне так проще смотреть...
Цитата
А для таймера должен быть выставлен бит ITO и с приходом переполнения выставляется флаг TO. Все это можно посмотреть в memory.
долго жму F5, но бит ITO не выставляется... рис.4
тогда иду ва-банк и сам его выставляю ручками рис.5(черт его знает почему он не выставляется автоматом)
Цитата
При возникновении флага прерывания соответствующий бит в ipending (такой же по номеру как и в ienable) возводится?
Далее перехожу на вкладку register и там ipending подтверждается рис.6.
Цитата
И еще нужно попробовать поставить брекпоинт в обработчике прерываний alt_irq_handler.
breakpoint уже сделал в теле COM_ISR (.
вот такая ситуация... Уже неделю на это потратил...Где-то я не то делаю...Но где? не могу понять...