Здравствуйте, уважаемые коллеги

По поводу таймера (TC0). Я писал так
TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK
TC_IER = AT91C_TC_CPCS
При этом скорость таймера была 180 Гц. Подробное изучение докумнетации привело меня вот к чему: AT91C_TC_CLKS_TIMER_DIV1_CLOCK - делитель частоты MCK (это и так было ясно), а вот AT91C_TC_CPCS означает, что прерывание будет сработано тогда, когда сначение счётчика таймера (TC_CV) станет равно значению регистра C таймера (TC_RC). Так вот TC0_RC по умолчаниб равен 0, т.е. по сути прерывания срабатывали при переполнении таймера (он 16-ти битный), т.е. у меня 180 раз в секунду набегало 65536 тиков

Проблема решилась следующим образом:
TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK | AT91C_TC_CPCTRG
AT91C_TC_CPCTRG означает, что при равенстве значения в регистре С и в счётчике, счётчик будет обнуляться! Т.е. выставляя значение регистра C от 0 до 65535 могу выбирать скорость вызовов прерываний (если 0xFFFF - 180 Гц, то можно посчитать, сколько нужно для N герц, например мне нужно было 1 кГц - это число 0x2E14)
По поводу PIO.
Выполнение происходило в интеррапте другого таймера, да ещё и в режиме отладки на wiggler'е

Вот так вот.
P.S. Только не бейте больно
Сообщение отредактировал Pasha 111 - May 22 2006, 19:26