Ruslan1 17 29 марта, 2008 Опубликовано 29 марта, 2008 · Жалоба Здравствуйте ! Процессор - 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 переставлял- ничего не менялось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться