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

 
 
 
Reply to this topicStart new topic
> Работа с таймером в 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
aaarrr
сообщение Sep 5 2007, 21:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Запрещать прерывания смысла нет - они и так уже запрещены. PIO_SODR, PIO_CODR и TC_CCR - write-only регистры, зачем их читать? Зачем останавливать клок таймеру в прерывании?

И главное: Вы забыли прочитать TC_SR - без этого прерывание сброшено не будет.
Go to the top of the page
 
+Quote Post
Yarvi
сообщение Sep 6 2007, 06:07
Сообщение #3





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



Спасибо большое!
Все дело действительно в сбросе прерывания в регистре статуса.
Go to the top of the page
 
+Quote Post

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

 


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


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