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

 
 
> at91sam7s & capture mode TC2, Не загружаются регистры LDRA/LDRB
mempfis_
сообщение May 10 2011, 10:33
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Всем добрый день.
Стоит задача используя вход TIOB2 определить частоту сигнала на этом входе (~1Гц-2000кГц)
TIOB2 настроил как внешний триггер по переднему фронту. Настроил загрузку LDRA/LDRB по переднему фронту триггера.
Чтобы грубо оценить частоту считаю кол-во переполнений таймера плюс текущее значение из LDRA/LDRB;

Прикинул код инициализации ТС2

Код
//--------------------------------------------
//настройка timer2
__thumb void ConfigureTC2(void)
{
  volatile unsigned int dummy;
  
  // Enable peripheral clock
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC2;
  
  // Disable TC clock
  AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS;
  
  // Disable interrupts
  AT91C_BASE_TC2->TC_IDR = 0xFFFFFFFF;
  
  // Clear status register
  dummy = AT91C_BASE_TC2->TC_SR;
  
  // Set mode
  //LDRB = AT91C_TC_LDRB_RISING
  //LDRA = AT91C_TC_LDRA_RISING
  //WAVE = 0, capture mode
  //CPCTRG = 0
  //ABETRG - TIOB external trigger
  //ETRGEDG = AT91C_TC_EEVTEDG_RISING
  //LDBDIS = 0, Counter clock is not disabled when RB loading occurs.
  //BURST = 0
  //CLKI = 0, без инверсии клока
  //BOARD_MCK/1024 (48000000/1024)
  AT91C_BASE_TC2->TC_CMR = AT91C_TC_LDRB_RISING|AT91C_TC_LDRA_RISING|AT91C_TC_EEVTEDG_RISING|AT91C_TC_CLKS_
TIMER_DIV5_CLOCK;
  
  //инсталяция прерываний в AIC
  IRQ_DisableIT(AT91C_ID_TC2);
  IRQ_ConfigureIT(AT91C_ID_TC2, 1, TC2_ISR);
  IRQ_EnableIT(AT91C_ID_TC2);
  
  //разрешаем прерывание по переполнению счётного регистра, внешнего триггера и загрузке регистра А/B
  AT91C_BASE_TC2->TC_IER = AT91C_TC_COVFS|AT91C_TC_ETRGS|AT91C_TC_LDRAS|AT91C_TC_LDRBS;
  
  //запуск ТС2
  AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN;
}
//--------------------------------------------


Описал обработчик прерываний в котором надеялся увидеть прерывания по загрузке LDRA/LDRB

CODE
//--------------------------------------------
//обработчик прерываний 2
__thumb void TC2_ISR(void)
{
static unsigned int state=0;
static unsigned int ovf_cnt=0;
unsigned int status;

static unsigned int led_stat=0;


//читаем статус прерывания
status = AT91C_BASE_TC2->TC_SR;

//проверка переполнения
if(status&AT91C_TC_COVFS)
{
//переполнение
ovf_cnt++;
}

//проверка загрузки регистра
if( status&AT91C_TC_ETRGS )
{
if(led_stat == 0)
{
led_stat = 1;
SET_LED(LED0);
}
else
{
led_stat = 0;
CLR_LED(LED0);
}

unsigned int val=0;
if(status&AT91C_TC_LDRAS)
{
val = AT91C_BASE_TC2->TC_RA;
}
else
{
val = AT91C_BASE_TC2->TC_RB;
}

//загрузка
if(state == 0)
{
//первый фронт
//исходное состояние
ovf_cnt = 0;

state = 1; //переход на ожидание второго фронта
}
else
{

//второй фронт
//можно определить частоту
unsigned int cnt_num = ovf_cnt*0xffff+val;

if(cnt_num == 0)
{
FRQ = 0xffffffff;
}
else
{
FRQ = BOARD_MCK/(cnt_num*TC2_BOARD_MCK_DIV);
}


//готовимся к след. определению частоты
ovf_cnt = 0;
}
}

}
//--------------------------------------------


Опытным путём уствновил что возникают только прерывания по переполнению AT91C_TC_LDRAS и срабатыванию триггера AT91C_TC_ETRGS , а прерываний AT91C_TC_LDRAS/AT91C_TC_LDRBS отсутствуют. Может кто подскажет что там ещё надо настроить чтоб они появились? Перечитал несколько раз описание ТС2 и всё время прихлжу к одному и тому же коду инициализации.
Go to the top of the page
 
+Quote Post



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

 


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


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