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

 
 
> Использование Capture Mode в AT91RM9200, Таймер как-то ненормально работает.
Ruslan1
сообщение Mar 29 2008, 11:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

Процессор - 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 переставлял- ничего не менялось.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 04:13
Рейтинг@Mail.ru


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