|
Счетчик частоты на SAM7S64 |
|
|
|
Jul 27 2011, 14:26
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(abit @ Jul 27 2011, 17:58)  хотя есть одна странность - TС2 почему то если есть такты TIOA1 - сбрасывается, если нет - не сбрасывается по AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG; поэтому если снять сигнал с PA29 - TC1 сбрасывается, а TC2 сохраняет свое значение с последнего цикла измерения и висит в таком состоянии пока не подать снова сигнал на PA29... Эта странность документирована: Цитата Regardless of the trigger used, it will be taken into account at the following active edge of the selected clock. This means that the counter value can be read differently from zero just after a trigger, especially when a low frequency signal is selected as the clock. Только это не совсем правда: CPCTRG на деле срабатывает сразу. Цитата(abit @ Jul 27 2011, 17:58)  Все бы хорошо, однако все бултыхается... А clock gating сделали, или просто смотрите значения TC1-2 по прерыванию? В последнем случае по определению будет все "бултыхаться". Цитата(abit @ Jul 27 2011, 17:58)  почему он так веляет от цикла к циклу? А какие прерывания включены (SOF USB, например)? Используется ли где-нибудь PDC? Все это будет влиять на результат. На самом деле, следует забыть о каких-либо программных измерениях. Хорошей точности не получите по определению. Все должно делаться в железе.
|
|
|
|
|
Jul 28 2011, 10:40
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Цитата(aaarrr @ Jul 27 2011, 18:26)  А clock gating сделали, или просто смотрите значения TC1-2 по прерыванию? В последнем случае по определению будет все "бултыхаться". Я просто смотрю значение счетчиков... к своему стыду я не знаю что такое clock gating, слышал только что это что-то из области управления питанием для синхронных схем... а уж как его делать тем более не представляю, поэтому сомнительно что я его сделал случайно... У меня тут есть программист ПЛИСок, может он знает... но он сейчас не ходит работать ))) Цитата(aaarrr @ Jul 27 2011, 18:26)  А какие прерывания включены (SOF USB, например)? Используется ли где-нибудь PDC? Все это будет влиять на результат. прерывания умышленно я включал только на таймер T0, никаких других не включал, PDC не использую... вот весь кусок инициализации МК: Код void AT91F_USB_Open(void) { AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1; AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP); AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91C_PIO_PA16); AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA16); AT91F_CDC_Open(&pCDC, AT91C_BASE_UDP); }
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) { TC_pt->TC_CCR = AT91C_TC_CLKDIS; TC_pt->TC_IDR = 0xFFFFFFFF; TC_pt->TC_CMR = Mode; TC_pt->TC_CCR = AT91C_TC_CLKEN; }
void TC0_ISREntry( void ) { unsigned long STATUS = AT91C_BASE_TC0->TC_SR; AT91C_BASE_AIC->AIC_IVR = 0; AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0); dataready=1; AT91C_BASE_AIC->AIC_EOICR = 0; }
int main ( void ) {
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, (1 << AT91C_ID_PIOA) | (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1) | (1 << AT91C_ID_TC2));
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED1 );
AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC2XC2S_TIOA1; //(1<<5)|(1<<6); infdd[12]='\r'; infdd[13]='\n';
AT91F_USB_Open(); while (!pCDC.IsConfigured(&pCDC));
//AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0); AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF; AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK | AT91C_TC_CPCTRG; AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN; AT91C_BASE_TC0->TC_RC = 46800; // MCK / 1024 = 47,4МГц / 1024 => 1 сек AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_TC0); AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) TC0_ISREntry; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x3; AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0); AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0); dataready=0; AT91F_TC_Open(AT91C_BASE_TC1,13 << 15 | 7,AT91C_ID_TC1); AT91F_TC_Open(AT91C_BASE_TC2,0x7,AT91C_ID_TC1); Цитата(aaarrr @ Jul 27 2011, 18:26)  На самом деле, следует забыть о каких-либо программных измерениях. Хорошей точности не получите по определению. Все должно делаться в железе. Это не мой каприз((( Подноготная вопроса тяжелая - я работаю на заводе, который поделен на много предприятий... одно из них с гордым началом НИИ замутило все это... я им еще год назад говорил купите мне ПЛИСку за 500рублей и я вам все сделаю, нет, они понабрали этой шляпы, лицензию на IAR дороже рынка... явная отмывка денег, наняли программистов... год не пойми чем занимались - а в конце мая резко уволили всех программистов... стали искать по заводу - а кроме нашей скромной лабораторией (мы собстна 3 человека из области программирования станков, УЧПУ и ПЛИСок) с этим никогда не сталкивались - а кроме нас - некому... потому что по контракту должен завод отвечать... вот нам уже 2 месяца не платят зарплату, пока не сделаем хоть чего-то... поэтому я и взялся делать из того что есть, а потом уж переделаем нормально
|
|
|
|
|
Jul 28 2011, 10:51
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(abit @ Jul 28 2011, 14:40)  Я просто смотрю значение счетчиков... к своему стыду я не знаю что такое clock gating, слышал только что это что-то из области управления питанием для синхронных схем... а уж как его делать тем более не представляю, поэтому сомнительно что я его сделал случайно... Это то, о чем я писал в №14 - фича таймера. Таймером 0 формируете строб в одну секунду на TIOA0, этим стробом разрешаете клок на таймере 1. Таким образом все будет подсчитано железкой без вмешательства ПО. Цитата(abit @ Jul 28 2011, 14:40)  Это не мой каприз((( Подноготная вопроса тяжелая - я работаю на заводе, который поделен на много предприятий... одно из них с гордым началом НИИ замутило все это... я им еще год назад говорил купите мне ПЛИСку за 500рублей и я вам все сделаю, нет, они понабрали этой шляпы, лицензию на IAR дороже рынка... явная отмывка денег, наняли программистов... год не пойми чем занимались - а в конце мая резко уволили всех программистов... стали искать по заводу - а кроме нашей скромной лабораторией (мы собстна 3 человека из области программирования станков, УЧПУ и ПЛИСок) с этим никогда не сталкивались - а кроме нас - некому... потому что по контракту должен завод отвечать... Под железом я в данном случае имел в виду ресурсы самого МК. Хотя ПЛИС уместнее, конечно, для такой задачи. Цитата(abit @ Jul 28 2011, 14:40)  вот нам уже 2 месяца не платят зарплату, пока не сделаем хоть чего-то... поэтому я и взялся делать из того что есть, а потом уж переделаем нормально Так может, ну его, такого работодателя?
|
|
|
|
|
Jul 28 2011, 19:59
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Цитата(aaarrr @ Jul 28 2011, 14:51)  Это то, о чем я писал в №14 - фича таймера. Таймером 0 формируете строб в одну секунду на TIOA0, этим стробом разрешаете клок на таймере 1. Таким образом все будет подсчитано железкой без вмешательства ПО. Всё работает!!! Спасибо, перевел TС0 в режим формирования, затем TIOA0 - сделал установкой лог.1 на RA=0 и лог. 0 на RC=46800 и повесил TIOA0 на XC1 затем XC1 на burst счетчика TC1... я в шоке, как все было просто сделать - и все заработало, спасибо вам просто огромнейшее... я бы в жизни не догадался что burst - это Clock Enable, хотя неск. раз пролиставал эту блок-схему... скорее всего главная ошибка автора книжки - что они не внесли в общую блок-схему (самую первую) этот burst/или не озвучили его далее как CE... в итоге - все прыгает теперь около 30Гц от 4МГц, это я понимаю погрешность опорного кварца 18МГц на плате... у него как раз стоит точность 10^-4, нужно повесить тот самый сверхточный генератор... и я уже было начал писать об этом результат работы... как понял... не все так гладко - пусть точность пока 10^-4, но ведь строб то нефига не аппаратный, а программный по прерыванию... если возможно - завтра тогда настрою канал TIOB0 на выход из платы, чтобы генерить сигнал строба так же аппаратно... в итоге - весь измеритель будет аппаратным на этих трех счетчиках... и похоже плиска уже не нужна - все будет итак с точностью квраца на плате SAM7S64... надо точнее - пусть кварц выравнивают емкостями или генератор делают точный... Еще раз благодарю за советы... особенно за тактирование TCLK и наводку про burst, фиг знает как бы это сделал без вас... сейчас дело осталось разве что за TIOB0 наружу для строба, но думаю завтра разберусь.... Цитата(aaarrr @ Jul 28 2011, 14:51)  Так может, ну его, такого работодателя? к сожалению нельзя, сам работодатель (мой директор) не виноват в нечестности соседних контор... а общий начальник завода - всех винит что кто-то оплошал.. а я своего директора очень уважаю, он честный человек... но в любом случае - я тут кроме работы еще прохожу аспирантуру... в общем, лучше пока тут оставаться, чтобы получить кандидата наук, не метаться по разным конторам и быть спокойным... ибо уволюсь - не видать кандидата...
|
|
|
|
|
Jul 29 2011, 20:37
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Цитата(aaarrr @ Jul 29 2011, 01:55)  Стоп. Почему же не аппаратный, если сформирован непосредственно таймером T0, и этот сигнал заведен в качестве гейта на клок T1? так тут речь шла о стробе не который burst для T1 формирует (так сказать ворота, а по вашему - clock gating)... а о стробе по которому синхронизуется регистр в той микросхеме, которая ГГц на себя берет и снижает до 4МГц своим счетчиком... вот) про тот строб что на нее дается, чтобы младший регистр прочитать с нее... Задача этого строба была сформировать короткий импульс в момент открытия ворот счета (burst) и в момент закрытия на ту микросхему... однако даже TIOB0 не помог - сделать оказалось не реально... одних RB и RC не хватало при любых Wavesel... в итоге чтобы не делать строб для ГГцовой микросхеме программно - вывел tioa0 наружу (pa0) и спаял на советской К555ЛП5 + кондюк для задержки + резистор для превращения выхода в 3.3V тупую логику для формирования короткого строба по смене фронта tioa0 далее спаял кварцованный генератор на 2МГц (на 4 не нашел кварца...) его откалибровал на Ч3-84, кстати оказался в одном экземпляре этот частотомер на заводе - полдня ждал пока принесут... как только этот замечательный прибор, способный замерять частоту и длительность любого фронта попал мне в руки - выяснилось две вещи... 1) Кварц 18.с копейками МГц не соответствует действительности по этим копейкам - в итоге вместо 46800 секунде соответствует 47034 на счетчике в T0.RC... при MCK/1024 2) С этого генератора 2МГц - частота держится в 2 000 004 по измерениям атмельки... ничего не болтается... ну вернее там просто секунда не совсем соответствует фактической секунде - так что все хорошо... дело в том что при изменении RC с 47034 на 47035 в "ворота" попадает сразу 2 000 0046 импульсов... вместо 2 000 004... так что тут ничего не поделаешь, ровную секунду не сформировать... надо на компе пересчитывать главное что сейчас с точностью прибора ЧЗ-84 успешно все измеряется! стоит и не болтается... и спасибо ВАМ ЗА ПОМОЩЬ!!! Я бы сам вряд ли справился так быстро...
Сообщение отредактировал abit - Jul 29 2011, 20:41
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|