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

 
 
> delay in 10-100mks on SAM7
tokauchusya
сообщение Jun 23 2009, 21:54
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 23-06-09
Пользователь №: 50 584



Люди добрые помогите разобраться с TimerTC от SAM7.
Мне нежно реализовать на TimerTC задержку от 10-100 микросекунд, а я не пойму как там выставляются задержки. Объясните пожалуйста.

Код
void timer0_isr (void)
{
  ***
  // мигнуть диодом
}

char InitTimer()
{  
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;// Enable Clock for TIM0
  AT91C_BASE_TC0->TC_CCR    = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
  AT91C_BASE_TC0->TC_CMR    = 2 | AT91C_TC_CPCTRG;
  AT91C_BASE_TC0->TC_RC     = 0x0E; // ??

  // TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST;
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) timer0_isr;
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
  AT91C_BASE_TC0->TC_IER    = AT91C_TC_CPCS;

  return 1;
}


Здесь я пытаюсь получить 10 микросекунд, но это на самом деле не так. Что именно не так объясните. Как высчитывается коэффициент?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jun 23 2009, 22:20
Сообщение #2


Гуру
******

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



Цитата(tokauchusya @ Jun 24 2009, 01:54) *
Здесь я пытаюсь получить 10 микросекунд, но это на самом деле не так. Что именно не так объясните. Как высчитывается коэффициент?

Да все не так почти sad.gif

Код
char InitTimer()
{  
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;// Enable Clock for TIM0
  AT91C_BASE_TC0->TC_CCR    = AT91C_TC_CLKEN | AT91C_TC_SWTRG;  // Зачем-то сразу запустили таймер. Это нужно делать в самом конце.
  AT91C_BASE_TC0->TC_CMR    = 2 | AT91C_TC_CPCTRG;  // С такими настройками будете получать прерывание каждые 10мкс.
  // Для однократной задержки логично использовать режим Wave и поставить бит CPCSTOP
  AT91C_BASE_TC0->TC_RC     = 0x0E; // ??

  // TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST;  // Зачем прерывание по фронту?
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) timer0_isr;
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
  AT91C_BASE_TC0->TC_IER    = AT91C_TC_CPCS;

  return 1;
}
Go to the top of the page
 
+Quote Post



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

 


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


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