odmierzenie 1ms w C dla ATMEGA

Apr 25, 2006 11 Replies

Witam



W jaki sposób odmierzaæ czas precyzyjnie? I to nie chodzi ju¿ o 1 ms (chocia¿ akurat nad tym konkretnie my¶lê) tylko ogólnie w jaki sposób okre¶liæ w jakim czasie wykonuje siê funkcja napisana w C. Obecnie dobra³em czas "na oko" ¿eby by³ nie mniejszy ni¿ wymagany ale to strata czasu procka bo pewno jest duuuuu¿o wiêkszy ni¿ wymagany.



Rafa³



U¿ytkownik "Kacper" <elkacperUSUÑ snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:e2l8vo$m69$ snipped-for-privacy@inews.gazeta.pl...

Nie wiem jak bêdzie wygl±da³ ca³y program ale mo¿na zrobiæ tak: Na pocz±tku funkcji wystartowaæ Timera a na koñcu go zatrzymaæ i ju¿ masz ilo¶æ taktów procesora jaka minê³a podczas wykonywania funkcji... teraz tylko przeliczyæ to z kwarcem i masz wynik...

oczywiście można zobaczyć jak została przetłumaczona na ASM i policzyć, ale to nie ma sensu, bo nie ma gwarancji, że następna kompilacja da to samo.

Ja bym po prostu zrobił tę funkcję w assemblerze (ew. "wstawkę").

Mo¿na u¿yæ symulatora, np. AVRstudio. Ustawiæ breakpoint przy wej¶ciu w funkcjê i przy wyj¶ciu. Run. Po osiagbniêciu pierwszego breaka skasowaæ czas (klikaj±c go). Run. Na drugim breaku ju¿ mamy czas... Piszê z pamiêci, ale na pewno jako¶ tak testowa³em funkcje opó¼nieñ w AVR-GCC. Wa¿ne, by w symulatorze by³a dobrze ustalona warto¶æ oscylatora. No i niektóre funkcje zale¿ne od peryferiów s± trudne do symulowania.

Piotr Chmiel napisał(a):

jeśli chodzi o avr-gcc, to dlaczego nie korzystać z funkcji dostępnych w <avr/delay.h> (albo <util/delay.h> w zależności o wersji)?

w.

Poka¿e ci moje funkcje C dla 8MHz (AVR)

// delay od 1 do 255 <us> mikrosekund /// zegar 8 Mhz ; 8 cykli zegara na petle , czas petli 1 us void delay(char us) { register char i=0;

do { i++; // petla trwa 8 cykli= 4cykle + 4 cykl(nop) asm("nop"); asm("nop"); asm("nop"); asm("nop"); } while(i<us); }

//delayms to opóznienie w milimekundach void delayms(unsigned int dt) { unsigned int i; dt*=5; //dt*5 w celu osiagniecia 1ms = 5*200us for (i=0;i<dt;i++) delay(200); //rowna 1ms }

Ano w³a¶nie ¿e NOP trwa jeden cykl to siê wie k³opot mia³em np z okre¶leniem ile trwa wykonanie takiego " i++" oraz wykonanie pêtli while, for itp. Dziêki za pomys³y. Spróbujê wykorzystaæ. Mia³em pomys³ jeszcze taki ¿eby co okres wykonania funkcji zmieniaæ stan na porcie i obejrzeæ to na oscyloskopie ale sprawa chwilowo usiad³a bo nie mam oscyloskopu.

Rafa³

U¿ytkownik "Kacper" <elkacperUSUÑ snipped-for-privacy@gazeta.pl napisa³ w wiadomoœci news:e2l8vo$m69$ snipped-for-privacy@inews.gazeta.pl...

Na pewno u¿ywanie funkcji opóŸniaj¹cej dla oczekiwania na coœ jest strat¹ czasu. Mo¿e mieæ to sens dla czasów mikrosekundowych, ale zatrzymywanie procesora, ¿eby czeka³ 1 ms na coœ to zupe³nie bez sensu. Jeœli chcesz mieæ sprawny, precyzyjny program to czynnoœci, które chcesz aby by³y wykonywane co 1 ms (lub wielokrotnoœæ tego czasu) umieœæ w przerwaniu jakiegoœ timera. Z czasem mo¿e siê okazaæ, ¿e prawie ca³oœæ programu to bêdzie przerwanie.

Owszem zapomnia³em podaæ po co mi te czasy. Do obs³ugi magistral I2C, 1-wire, oraz LCD itp. Tu chyba przerwania nie wchodz¹ w grê. Po prostu musi poczekaæ swoje i tyle.

Rafal

U¿ytkownik "Bogdan Gutknecht" <usunto_b_gutknecht snipped-for-privacy@interia.pl napisa³ w wiadomoœci news:e2n70v$js3$ snipped-for-privacy@atlantis.news.tpi.pl...

Jeszcze pytanie co ten program robi, bo moze i tak nie ma nic lepszego do roboty :-)

J.

Kacper napisał(a):

jak już pisałem w tym wątku, jeśli używasz avr-gcc, to masz do dyspozycji funkcje opóźnień w <avr/delay.h> (lub <util/delay.h> w nowszych wersjach avr-libc). tylko pamiętaj, żeby _dokładnie_ przeczytać ich opisy, żeby nie mieć potem problemów ze zbyt krótkimi czasami.

w.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required