Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймер в blackfin 533
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
verali
Добрый вечер! Разбираюсь с таймером в BF533. Делаю программу мигания светодиодом по прерыванию таймера 0.
По теории после включения таймера в режиме ШИМ (PWMOUT) в регист TIMERx_COUNTER должен записаться 0 и счетчиком инкрементироваться до значения в регистре TIMERX_PERIOD.
В моем же случае в регистр TIMERx_COUNTER после включения таймера записывается рандомное число и с каждым новым тактом значение в данном регистре увеличивается на рандомное число (причем с каждым разом это число разное), соответсвенно и прерывание срабатывает почти сразу после начала выполнения программы(программа входит в обработчик прерываний, устанавливается нулевой бит в регистре TIMER_STATUS). В регистре TIMER_CONFIG устанавливаю биты:
1)PWM_OUT - включение режима ШИМ
2)OUT_DIS - запрещение сигнала на выходе TMRx
3)PERIOD_CNT - генерируется ШИМ сигнал
4)IRQ_EN - разрешение прерывания
5)EMU_RUN - при эмуляции таймер работает

Может быть кто-нибудь сталкивался с данной проблемой?
kolobochishe
Источник частоты для таймера какой выбрали? Там, вроде, 2 варианта PPI и SCLK. Просто ШИМ режим он же непрерывный. Т.е. счетчик не останавливается, а продолжает считать с 0, а то что сработало прерывание не означает что таймер не успел начать счет заново. А если частота выбрана SCLK, то и большое число будет рандомным, т.к. считает очень быстро
uriy
Цитата
По теории после включения таймера в режиме ШИМ (PWMOUT) в регист TIMERx_COUNTER должен записаться 0 и счетчиком инкрементироваться до значения в регистре TIMERX_PERIOD.
Не помню точно так или может быть наоборот считает на декремент.
Числа вы видите рандомные потому что установлен бит EMU_RUN - при эмуляции таймер работает. Это означает что таймер работает даже если вы остановили программу в эмуляторе.
Внутри прерывания сбрасываете статусный бит?

Вот так у меня формируется на выходе четверть частоты SCLK
Код
#define BF_T0_PERIOD                4
#define BF_T0_WITDH                2
*pTIMER0_CONFIG    = PWM_OUT | PERIOD_CNT;
*pTIMER0_PERIOD    = BF_T0_PERIOD;
*pTIMER0_WIDTH    = BF_T0_WITDH;
*pTIMER_ENABLE    |= TIMEN0;
verali
Цитата(kolobochishe @ Dec 23 2015, 16:29) *
Источник частоты для таймера какой выбрали? Там, вроде, 2 варианта PPI и SCLK. Просто ШИМ режим он же непрерывный. Т.е. счетчик не останавливается, а продолжает считать с 0, а то что сработало прерывание не означает что таймер не успел начать счет заново. А если частота выбрана SCLK, то и большое число будет рандомным, т.к. считает очень быстро

Все верно, два источника частоты для таймера.Я выбрал SCLK.
Значит я ошибочно считал, что при каждом "шаге"(F11) в дебагере (использую ADSP bf533 EZ KIT LITE), значение в TIMERx_COUNTER должно увеличиваться на 1.

Цитата(uriy @ Dec 23 2015, 16:44) *
Не помню точно так или может быть наоборот считает на декремент.
Числа вы видите рандомные потому что установлен бит EMU_RUN - при эмуляции таймер работает. Это означает что таймер работает даже если вы остановили программу в эмуляторе.
Внутри прерывания сбрасываете статусный бит?

Исходя из схемы работы таймера, счетчик таймера идет на инкремент и сравнивает свое значение с регистром TIMERx_COUNTER, пока значение в регистре счетчика не станет равным с TIMERx_COUNTER.
Да, первым делом в обработчике прерывания сбрасываю статусный бит.
Спасибо за объяснение.
Сейчас попробую на железе помигать светодиодом, чтобы визуально оценить правильность работы таймера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.