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

 
 
> 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
Ответов
piz2383
сообщение Jul 29 2009, 15:16
Сообщение #2


Участник
*

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



Вот код:
Подскажите, а то что-то туплюююю Вот код:

Код
volatile unsigned char doo = 0;

__arm void tim0isr (void)
{
  
  doo = 1;  

  AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_TC0->TC_SR;
  AT91C_BASE_AIC->AIC_IVR        = 0;
  AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_TC0;    
  AT91C_BASE_AIC->AIC_EOICR   = 0;
  AT91C_BASE_TC0->TC_IDR = AT91C_TC_CPCS;
}

char InitTimer()
{
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;// Enable Clock for TIM0
  
  // TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_PRIOR_HIGHEST;
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) tim0isrEntry;
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);

  AT91C_BASE_TC0->TC_CMR    = TC_CLKS_MCK32 | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_CPCSTOP;  

  return 1;
}

void DELAY_MK(unsigned short coef)
{  
  unsigned int delay = ((coef*22)/15);  

  AT91C_BASE_TC0->TC_RC     = delay;
  
  AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
  
  doo = 0;

AT91C_BASE_TC0->TC_CCR    = AT91C_TC_CLKEN | AT91C_TC_SWTRG;  
  
  while(!doo)
   ;
}


Когда я выполняю:
Код
DELAY_MK(3000);
DELAY_MK(4000);
DELAY_MK(5000);
DELAY_MK(6000);
DELAY_MK(2000);
DELAY_MK(10000);
DELAY_MK(17000);

То это занимает 46 милисекунд, все правильно

А если выполняю:
Код
for(int i =0; i < 20000; i++)
      DELAY_MK(6);


То вместо 120 милисекнд, этот код выполняеться чуть более 300 милисекунд.

Вопрос, в чем и где я ошибился? Просто мне нужно гарантированно добиться задержки в 6 микросекунд.



И встречный вопрос. Никто не поделиться кодом, который делает задежку в микросекундах без таймеров, а так просто с помощью нупов или циклом для частоты 48 Мгц???

Заранее всем спасмбо.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:18
Рейтинг@Mail.ru


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