Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания 2138
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
tolik_zp
Доброго времени суток!
У меня почему-то происходят глюки с таймером. Таймер 0 настроен на сброс от T0MR2, при этом меняется состояние ноги MAT0.2 и вызывается прерывание fiq, вроде все работает как положено. Но! Если я в прерывании меняю T0MR2, скажем через n вызовов прерываний, то таймер улетает куда-то и долго не возвращается. Че за дела? Или в MR нельзя писать при запущеном таймере?
GetSmart
Писать-то можно. Но несколько тактов он будет как бы недоступен, то есть валидно будет старое значение MR. А если окажется что счётчик таймера уже обогнал MR, то он будет тикать до конца 32-битного значения, а уже после переполнения догонит MR. Защиты от превышения MR нет.
tolik_zp
Цитата(GetSmart @ Jun 1 2007, 16:31) *
Писать-то можно. Но несколько тактов он будет как бы недоступен, то есть валидно будет старое значение MR. А если окажется что счётчик таймера уже обогнал MR, то он будет тикать до конца 32-битного значения, а уже после переполнения догонит MR. Защиты от превышения MR нет.


Я уже и задержку вставлял в прерывании перед вводом нового значения... Как же он обгонит, если он сбрасывается при совпадении?
Кстати, похоже что счетчик действительно улетает за пределы MR, только не понимаю почему, ведь должен быть сброс
GetSmart
А может всю логику переделать на PWM. Там есть такие контрольные битики, которые если не дрыгнуть, то новое значение MR не будет валидным.

А вообще, показали бы код што ли.

Ну или так. Обновляете MR в прерывании, а потом контрольную проверочку таймера на то, обогнал ли он MR.
rezident
Цитата(GetSmart @ Jun 1 2007, 19:56) *
Ну или так. Обновляете MR в прерывании, а потом контрольную проверочку таймера на то, обогнал ли он MR.

А если обогнал, то остановить, сбросить и запустить таймер снова.
sqrt
Цитата(tolik_zp @ Jun 1 2007, 17:22) *
Если я в прерывании меняю T0MR2, скажем через n вызовов прерываний, то таймер улетает куда-то и долго не возвращается. Че за дела? Или в MR нельзя писать при запущеном таймере?

А чем стандартное решение не устраивает? Выключить и сбросить таймерный и масштабируемый счетчики, установить нужное значение в TxMRx и снова включить таймерный и масштабируемый счетчики.
tolik_zp
Цитата(sqrt @ Jun 2 2007, 16:11) *
А чем стандартное решение не устраивает? Выключить и сбросить таймерный и масштабируемый счетчики, установить нужное значение в TxMRx и снова включить таймерный и масштабируемый счетчики.


Таймер используется для генерации синхроимпульсов видеосигнала, по-этому его останавливать нельзя. Можно конечно и ШИМ попробовать, но все же не ясна природа загадки smile.gif
В мануале на стр. 197 четко и ясно нарисовано откуда растут сбросы и вызовы прерываний от таймера, но таймер почему-то не всегда сбрасывается. Я уже и задержку в прерывании вставлял, не помогает - прерывание несколько раз вызывается нормально, но через некоторое время таймер все-равно убегает от T0MR2... Такое впечатление, что возможность записи MR зависит от фазы.
GetSmart
дайте прогу почитать. может яснее станет
tolik_zp
Цитата(GetSmart @ Jun 4 2007, 11:28) *
дайте прогу почитать. может яснее станет


Всем спасибо за участие, была ошибка в коде - я сбрасывал не тот флаг прерывания...
SpiritDance
tolik_zp
smile.gif) жжошь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.