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

 
 
 
Reply to this topicStart new topic
> 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
aaarrr
сообщение May 10 2011, 11:04
Сообщение #2


Гуру
******

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



Загрузка LDRA и LDRB не будет работать как задумано из-за взаимных блокировок. Нужно переставить на разные фронты.
Но прерывания должны присутствовать. PIO не забыли настроить?
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 10 2011, 12:28
Сообщение #3


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

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



Цитата(aaarrr @ May 10 2011, 14:04) *
Загрузка LDRA и LDRB не будет работать как задумано из-за взаимных блокировок. Нужно переставить на разные фронты.
Но прерывания должны присутствовать. PIO не забыли настроить?


PIO настроен на выполнение альтернативной функции PIOB2. Поменял фронты (А -нарастающий, В - запрещён) прерывания по загрузке А/В упорно не возникают.

Нашёл в документации такую строку:
Registers A and B (RA and RB) are used as capture registers. This means that they can be
loaded with the counter value when a programmable event occurs on the signal TIOA.


Стуктурная схема ТС в capture mode на странице 448 показывает что цепь захвата никак не связана с TIOB, а бит ABETRG регистра CMR выбирает кто будет сбрасывать
счётный регистр.
Выходит PIOB2 не позволит выполнять захват значения счётного регистра в А/В.
Придётся увеличить частоту тактирования счётчика и учитывать только переполнения или проверить wavefome mode на предмет возможности подсчёта длительности импульса.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 10 2011, 14:41
Сообщение #4


Гуру
******

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



Waveform никак не поможет. Если нужно измерять длительность импульса, то можно завести TIOB на XC и использовать BURST. Но это довольно коряво, лучше перебросить сигнал в железе.
Go to the top of the page
 
+Quote Post

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

 


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


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