|
real time timer - прерывание по переполнению |
|
|
|
May 25 2010, 15:42
|
Частый гость
 
Группа: Участник
Сообщений: 144
Регистрация: 27-12-09
Из: Пермь
Пользователь №: 54 501

|
Не нашёл как установить обработчик прерывания по переполнению для таймера реального времени. Нужно ведь как-то так: Код AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, ???, m_interrupt_priority, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (void(*)())interrupt_handler); А я не знаю какой у него ID..
|
|
|
|
|
 |
Ответов
|
May 26 2010, 16:10
|
Частый гость
 
Группа: Участник
Сообщений: 144
Регистрация: 27-12-09
Из: Пермь
Пользователь №: 54 501

|
aaarrr, ок. спасибо за желание помочь. CODE template <uint_t i_timer> class CTimerImpl { private: static const AT91PS_TC m_timer; static const uint_t m_timer_id = i_timer == 0 ? AT91C_ID_TC0 : i_timer == 1 ? AT91C_ID_TC1 : i_timer == 2 ? AT91C_ID_TC2 : 0;
private: static const uint32_t m_max_ticks = 0x10000; static const uint32_t m_interrupt_priority = 1;
public: static CTimerImpl<i_timer>* m_instance;
private: float m_max_time_ms; float m_ticks_per_ms;
private: static void interrupt_handler() { uint32_t mask = m_timer->TC_SR; uint32_t x = 0; x = mask; // m_instance->on_interrupt(mask); }
inline bool on_interrupt(uint32_t mask) { if (mask & AT91C_TC_CPAS) on_event_a(); if (mask & AT91C_TC_CPBS) on_event_b(); if (mask & AT91C_TC_CPCS) on_overflow();
return (mask & (AT91C_TC_CPAS | AT91C_TC_CPCS | AT91C_TC_CPBS)) != 0; }
uint32_t calculate_optimal_divider(float max_period_ms) { const float cycles_per_ms = CSystem::get_instance()->get_frequency() / 1000.0f; const float max_time_ms = m_max_ticks / cycles_per_ms;
m_max_time_ms = max_time_ms * 2.0f; m_ticks_per_ms = cycles_per_ms / 2.0f;
if (m_max_time_ms > max_period_ms) return AT91C_TC_CLKS_TIMER_DIV1_CLOCK;
m_max_time_ms = max_time_ms * 8.0f; m_ticks_per_ms = cycles_per_ms / 8.0f;
if (m_max_time_ms > max_period_ms) return AT91C_TC_CLKS_TIMER_DIV2_CLOCK;
m_max_time_ms = max_time_ms * 32.0f; m_ticks_per_ms = cycles_per_ms / 32.0f;
if (m_max_time_ms > max_period_ms) return AT91C_TC_CLKS_TIMER_DIV3_CLOCK;
m_max_time_ms = max_time_ms * 128.0f; m_ticks_per_ms = cycles_per_ms / 128.0f;
if (m_max_time_ms > max_period_ms) return AT91C_TC_CLKS_TIMER_DIV4_CLOCK;
m_max_time_ms = max_time_ms * 1024.0f; m_ticks_per_ms = cycles_per_ms / 1024.0f;
if (m_max_time_ms > max_period_ms) return AT91C_TC_CLKS_TIMER_DIV5_CLOCK;
__STL_THROW(invalid_argument("vary big period")); return AT91C_TC_CLKS_TIMER_DIV5_CLOCK; }
protected: virtual void on_event_a() = 0; virtual void on_event_b() = 0; virtual void on_overflow() = 0;
void initialize(float max_time_ms) { m_instance = this;
AT91F_AIC_CfgPMC(); AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << m_timer_id);
// Disable TC clock m_timer->TC_CCR = AT91C_TC_CLKDIS; AT91F_TC_InterruptDisable(m_timer, 0xFFFFFFFF);
// Clear status register uint32_t mask = m_timer->TC_SR; mask = ~mask;
// Set mode m_timer->TC_CMR = calculate_optimal_divider(max_time_ms) | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE | AT91C_TC_EEVT_XC0;
// enable interrupts AT91F_TC_InterruptEnable(m_timer, AT91C_TC_CPCS | AT91C_TC_CPAS | AT91C_TC_CPBS);
// configure interrupt handler AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, m_timer_id, m_interrupt_priority, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (void(*)())interrupt_handler );
// enable interrupt AT91F_AIC_EnableIt(AT91C_BASE_AIC, m_timer_id); }
void deinitialize() { stop();
// disable interrupts AT91F_TC_InterruptDisable(m_timer, AT91C_TC_CPCS | AT91C_TC_CPAS | AT91C_TC_CPBS);
// mode m_timer->TC_CMR = 0;
// perepheral clock AT91F_PMC_DisablePeriphClock(AT91C_BASE_PMC, 1 << m_timer_id); }
void set_time_a(float time_a_ms) { m_timer->TC_RA = (uint32_t)(std_math::min(time_a_ms, m_max_time_ms) * m_ticks_per_ms); }
void set_time_b(float time_b_ms) { m_timer->TC_RB = (uint32_t)(std_math::min(time_b_ms, m_max_time_ms) * m_ticks_per_ms); }
void set_time_reset(float period_ms) { m_timer->TC_RC = (uint32_t)(std_math::min(period_ms, m_max_time_ms) * m_ticks_per_ms); }
inline void start() { m_timer->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; }
inline void stop() { m_timer->TC_CCR = AT91C_TC_CLKDIS; } };
template <> const AT91PS_TC CTimerImpl<0>::m_timer = AT91C_BASE_TC0;
template <> const AT91PS_TC CTimerImpl<1>::m_timer = AT91C_BASE_TC1;
template <> const AT91PS_TC CTimerImpl<2>::m_timer = AT91C_BASE_TC2;
template <uint_t i_timer> CTimerImpl<i_timer>* CTimerImpl<i_timer>::m_instance; вызываю так: Код CTimer<0> timer(10.0f);
timer.set_time_a(2.0f); timer.set_time_b(6.0f); timer.set_time_reset(8.0f);
timer.start();
while(1);
Сообщение отредактировал aaarrr - May 26 2010, 16:16
Причина редактирования: Оформление цитаты исходника
|
|
|
|
Сообщений в этой теме
srm real time timer - прерывание по переполнению May 25 2010, 15:42 srm Забыл указать контроллер. at91sam7s256.
Можно ли в... May 25 2010, 17:12 injen-d Таймер RTT входит в системную периферию (идентифик... May 25 2010, 17:32 srm injen-d, спасибо. May 25 2010, 17:54 aaarrr Еще обратите внимание, что что флаги RTT сбрасываю... May 25 2010, 19:19 srm Столкнулся с такой проблемой. Я поставил делитель ... May 26 2010, 13:45 aaarrr Цитата(srm @ May 26 2010, 17:45) Если же... May 26 2010, 13:58 srm Локализовал проблему. Вот обработчик прерывания:
К... May 26 2010, 14:17 aaarrr Цитата(srm @ May 26 2010, 18:17) Почему-т... May 26 2010, 14:39 srm ЦитатаМожет, просто прерывание по CPA забыли разре... May 26 2010, 14:46 aaarrr Цитата(srm @ May 26 2010, 18:46) там стан... May 26 2010, 14:51 srm ЦитатаРаз так, то никаких __irq не нужно. Как и за... May 26 2010, 15:01 aaarrr Проверьте, что в прерывании действительно читается... May 26 2010, 15:19 srm aaarrr, да, вроде, всё правильно.. может что-нибуд... May 26 2010, 15:42 aaarrr Цитата(srm @ May 26 2010, 19:42) может чт... May 26 2010, 16:02 srm в симуляторе Keil всё пучком
максимально упрости... May 26 2010, 19:16 srm Вроде, немного разобрался. Если поставить значение... May 27 2010, 16:35 srm В реалтайме, вроде, всё норм. У меня 12 сервомехан... Jun 1 2010, 18:14 aaarrr Ну а get_time_us() что собой представляет?
Желани... Jun 1 2010, 18:58 srm aaarrr, я, вроде, по применению и использую. наско... Jun 1 2010, 19:14 aaarrr Цитата(srm @ Jun 1 2010, 23:14) aaarrr, я... Jun 1 2010, 19:20 srm мдя... робот будет ходить либо вдвое быстрее, либо... Jun 1 2010, 19:35 aaarrr Цитата(srm @ Jun 1 2010, 23:35) мдя... ро... Jun 1 2010, 19:54 Nikitoc Добрый день. Дабы не плодить похожих тем решил спр... Jun 25 2010, 07:47 aaarrr Цитата(Nikitoc @ Jun 25 2010, 11:47) КодA... Jun 25 2010, 08:46  Nikitoc Цитата(aaarrr @ Jun 25 2010, 11:46) Ну по... Jun 25 2010, 09:07   aaarrr Цитата(Nikitoc @ Jun 25 2010, 13:07) Изме... Jun 25 2010, 09:20    Nikitoc ЦитатаГлобально прерывания разрешены?
Ээээмммм....... Jun 25 2010, 10:07 aaarrr Разрешаются сбросом бита I регистра CPSR процессор... Jun 25 2010, 10:38 Nikitoc Цитата(aaarrr @ Jun 25 2010, 13:38) Разре... Jun 25 2010, 11:22  aaarrr Цитата(Nikitoc @ Jun 25 2010, 15:22) Сдел... Jun 25 2010, 11:41   Nikitoc Цитата(aaarrr @ Jun 25 2010, 14:41) Не ум... Jun 25 2010, 12:05 aaarrr Поздравляю, работают теперь прерывания. LDR PC... Jun 25 2010, 12:31 Nikitoc Цитата(aaarrr @ Jun 25 2010, 15:31) Поздр... Jun 25 2010, 13:23  aaarrr Цитата(Nikitoc @ Jun 25 2010, 17:23) я ра... Jun 25 2010, 13:32   Nikitoc Цитата(aaarrr @ Jun 25 2010, 16:32) Раско... Jun 25 2010, 13:41    aaarrr Цитата(Nikitoc @ Jun 25 2010, 17:41) Ну ч... Jun 25 2010, 13:53     Nikitoc Цитата(aaarrr @ Jun 25 2010, 16:53) Так в... Jun 25 2010, 14:57      aaarrr Цитата(Nikitoc @ Jun 25 2010, 18:57) Ээх.... Jun 25 2010, 15:01       Nikitoc ЦитатаДля RTT это совсем не изврат. Единственное р... Jun 25 2010, 15:15        aaarrr Цитата(Nikitoc @ Jun 25 2010, 19:15) P.S.... Jun 25 2010, 15:48         Nikitoc Цитата(aaarrr @ Jun 25 2010, 18:48) Нет, ... Jun 25 2010, 16:00 aaarrr А зачем это вы упразднили модификаторы __irq? Они ... Jun 25 2010, 16:02 Nikitoc Цитата(aaarrr @ Jun 25 2010, 19:02) А зач... Jun 26 2010, 07:01  aaarrr Цитата(Nikitoc @ Jun 26 2010, 11:01) Ну я... Jun 26 2010, 08:41   Nikitoc ЦитатаНет, не так же. На входе в прерывание это де... Jun 26 2010, 12:31    aaarrr Цитата(Nikitoc @ Jun 26 2010, 16:31) Ага ... Jun 26 2010, 13:15     Nikitoc Цитата(aaarrr @ Jun 26 2010, 16:15) CPSR ... Jun 26 2010, 17:02      aaarrr Цитата(Nikitoc @ Jun 26 2010, 21:02) Как ... Jun 26 2010, 17:16 Nikitoc Ясно. Спасибо большое. Jun 26 2010, 17:57 srm В общем, глюк так и не удалось исправить. Периодич... Aug 1 2010, 08:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|