реклама на сайте
подробности

 
 
> real time timer - прерывание по переполнению
srm
сообщение May 25 2010, 15:42
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
srm
сообщение May 26 2010, 16:10
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 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
Причина редактирования: Оформление цитаты исходника
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016