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

 
 
> Работа с таймером в AT91SAM7X
Yarvi
сообщение Sep 5 2007, 20:15
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 25-11-05
Пользователь №: 11 362



Уже достаточно долгое время над казалось бы простой проблемой.

Собственно необходимо запустить таймер и обрабатывать его прерывания.

Инициализация таймера:

Код
void InitTimer()
{
  m_pTC0->TC_CMR =  AT91C_TC_CLKS_TIMER_DIV5_CLOCK   | AT91C_TC_WAVESEL_UP_AUTO
                                  |  AT91C_TC_WAVE;
  
  m_pTC0->TC_IER = (1<<4); //прерывание  RC Compare

  m_pTC0->TC_RC = 0xFFFF;

  m_pAic->AIC_SVR[AT91C_ID_TC0] = (unsigned int) timer_c_irq_handler;
  m_pAic->AIC_SMR[AT91C_ID_TC0] = ( AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL  | 0x5 );
  m_pAic->AIC_ICCR    = (1<<AT91C_ID_TC0);
  m_pAic->AIC_IECR    = (1<<AT91C_ID_TC0);
  m_pTC0->TC_CCR      =  AT91C_TC_CLKEN;
}


Обработчик прерывания таймера
Код
__arm __irq  void timer_c_irq_handler(void)
{
  __disable_interrupt();

m_pTC0->TC_CCR =  AT91C_TC_CLKDIS;
count++;
if (count == 100000)
{
  blink = !blink;
  count = 0;
}
if (blink)
{
  m_pPioB->PIO_SODR |= BIT19; //включаем светодиод
}
else   m_pPioB->PIO_CODR |= BIT19; // выключаем

m_pTC0->TC_CCR =  AT91C_TC_CLKEN;
m_pTC0->TC_CCR |= AT91C_TC_SWTRG;
m_pAic->AIC_EOICR = 0x1;
}


Вроде проще простого, однако, что наблюдается:

светодиод мигает, с частотой 7 раз в 10 сек, при этом изменение значения предделителя таймера счетчика НИКАК НЕ влияет на эту частоту. Также и изменение значения RC не влияет на частоту мигания светодиода.

Совершенно не пойму почему так получается, ведь судя по всему прерывание срабатывает гораздо чаще, ему следовало бы срабатывать.


Буду очень благодарен, если кто сможет помочь.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:45
Рейтинг@Mail.ru


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