Перейти к содержанию
    

Использование Capture Mode в AT91RM9200

Здравствуйте !

 

Процессор - AT91RM9200.

 

Проблема такая: Нужно измерить частоту входного сигнала.

Результат: некорректно работает Capture в имеющихся таймерах.

Вопрос: может, кто посоветует, как это сделать?

 

Сделал следующее:

 

1. На таймере T4 собрал генератор меандра 8 Гц, вывел это на ногу TIOA4

 

AT91C_BASE_TC4->TC_CCR = (1<<2) | 1;

AT91C_BASE_TC4->TC_CMR =(2<<18) | //ACPC = 10

(1<<16) | //ACPA = 01

(1<<15) | //WAVE = 1

(2<<13) | //WAVESEL = 10

(0<<12) | //ENETRG

(0<<10) | //EEVT

(0<<8) | //EEVTEDG

3; //TIMER_CLOCK4 (MCK/128)

AT91C_BASE_TC4->TC_RC = (AT91C_MASTER_CLOCK / 128) / 8; AT91C_BASE_TC4->TC_RA = AT91C_BASE_TC4->TC_RC / 2;

AT91F_PIO_CfgPeriph (AT91C_BASE_PIOB,NULL,AT91C_PB8_TIOA4);

 

2. Таймеру T5 сказал считать с наружного клока (CLK5), защелкивать показания в RA5 по фронту сигнала, поданного на ногу TIO5 и генерить прерывание:

 

// //TC5 - capture mode, CLK- TCLK5(TCLK2) (XC2)

AT91F_PIO_CfgPeriph (AT91C_BASE_PIOA,NULL,AT91C_PA29_TCLK5);

AT91F_PIO_CfgPeriph (AT91C_BASE_PIOB,NULL,AT91C_PB10_TIOA5);

 

AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_TC5);

AT91C_BASE_TC5->TC_CCR = (0<<2) | 1;

AT91C_BASE_TC5->TC_CMR =(2<<18) | // LDRB = falling edge of TIOA

(1<<16) | // LDRA = rising edge of TIOA

(0<<15) | // WAVE = 0. Capture Mode is enabled

(0<<14) | // CPCTRG: = RC Compare has no effect on the counter and its clock (1<<10) | // ABETRG: TIOA is used as an external trigger

(1<<8) | // ETRGEDG: rising edge

(0<<7) | // LDBDIS:0 = Counter clock is not disabled when RB loading occurs

(0<<6) | // LDBSTOP: Counter clock is not stopped when RB loading occurs

(0<<4) | // BURST: The clock is not gated by an external signal

(1<<3) | // CLKI: Counter is incremented on rising edge of the clock

7; // XC2 (TCLK5/PA29)

AT91C_BASE_TC5->TC_IDR = 0xffffffff;

 

// Configure TC5 interrupt

AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,

AT91C_ID_TC5,

7,

AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,

(void(*)())AT91F_TC5_Handler );

AT91F_TC_InterruptEnable(AT91C_BASE_TC5,AT91C_TC_LDRAS);

AIC_ICCR = (1 << AT91C_ID_TC5);

AIC_IECR = (1 << AT91C_ID_TC5);

volatile int tmp = AT91C_BASE_TC5->TC_SR;

 

 

3. Соединил выход меандра TC4 (TIOA4) c входом защелки TC5 (TIOA5). Подал на клок T5 (TCLK5) мой входной сигнал.

 

И получил что-то непонятное. Количество защелкиваемых импульсов действительно коррелирует с входной частотой, но не равно ей (точнее, не равно 1/8 от частоты).

 

Но это цветочки. Ягодки: Если я не подаю частоту (на TCLK5 постоянный уровень), то ничего не защелкивается вообще и прерывания не происходят. Это никак не вяжется с приведенной в документации микроконтроллера схемой устройства таймера, там просто нет вообще зависимости прохождения сигнала TIOA от TCLK.

 

 

Если коммутирую TCLK5 для работы от внутреннего клока- то измеряет нормально.

 

Интересно, это я чего-то недодумал, или разработчики атмеловские?

 

 

PS. Ерраты читал. BURST переставлял- ничего не менялось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...