odmierzenie 1ms w C dla ATMEGA
Masz problem? Zapytaj na forum elektroda.pl
From: "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl>
Subject: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 15:41:48 +0200
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ł
From: "Jarek" <jarek54129_at_nospam_poczta.fm>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 16:24:34 +0200
Użytkownik "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl> napisał w wiadomości
news:e2l8vo$m69$1_at_nospam_inews.gazeta.pl...
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.
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...
From: Jarek Andrzejewski <jareka_at_nospam_dawid.com.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 17:12:29 +0200
On Tue, 25 Apr 2006 15:41:48 +0200, "Kacper"
<elkacperUSUŃTO_at_nospam_gazeta.pl> wrote:
ogólnie w jaki sposób określić w jakim czasie wykonuje się
funkcja napisana w C.
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ę").
--
pozdrawiam,
Jarek Andrzejewski
From: "EM" <edim123_at_nospam_poczta.onet.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 18:47:51 +0200
ogólnie w jaki sposób określić w jakim czasie wykonuje się
funkcja napisana w C.
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.
--
Pozdr
EM
From: Piotr Chmiel <piotr_at_nospam_topaz.zsel.lublin.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 22:14:04 +0200
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--0-433979124-1145996044=:43922
Content-Type: TEXT/PLAIN; charset=iso-8859-2; format=flowed
Content-Transfer-Encoding: 8BIT
On Tue, 25 Apr 2006, Kacper wrote:
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.
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; /dt5 w celu osiagniecia 1ms = 5*200us
for (i=0;i<dt;i++)
delay(200); //rowna 1ms
}
--
Piotr Chmiel
gg: 3440801
--0-433979124-1145996044=:43922--
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 22:06:28 +0200
Piotr Chmiel napisał(a):
Pokaże ci moje funkcje C dla 8MHz (AVR)
(...)
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.
From: Piotr Chmiel <piotr_at_nospam_topaz.zsel.lublin.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Tue, 25 Apr 2006 23:14:11 +0200
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--0-893441669-1145999651=:43922
Content-Type: TEXT/PLAIN; charset=iso-8859-2; format=flowed
Content-Transfer-Encoding: 8BIT
On Tue, 25 Apr 2006, Wojtek Kaniewski wrote:
Piotr Chmiel napisał(a):
Pokaże ci moje funkcje C dla 8MHz (AVR)
(...)
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)?
nie używam gcc,
--
Piotr Chmiel
gg: 3440801
--0-893441669-1145999651=:43922--
From: "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Wed, 26 Apr 2006 08:17:20 +0200
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; /dt5 w celu osiagniecia 1ms = 5*200us
for (i=0;i<dt;i++)
delay(200); //rowna 1ms
}
--
> Piotr Chmiel
> gg: 3440801
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ł
From: "Bogdan Gutknecht" <usunto_b_gutknecht_itotez_at_nospam_interia.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Wed, 26 Apr 2006 09:20:40 +0200
Użytkownik "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl> napisał w wiadomości
news:e2l8vo$m69$1_at_nospam_inews.gazeta.pl...
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.
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.
From: "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Wed, 26 Apr 2006 10:35:28 +0200
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_itotez_at_nospam_interia.pl> napisał
w wiadomości news:e2n70v$js3$1_at_nospam_atlantis.news.tpi.pl...
Użytkownik "Kacper" <elkacperUSUŃTO_at_nospam_gazeta.pl> napisał w wiadomości
news:e2l8vo$m69$1_at_nospam_inews.gazeta.pl...
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.
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.
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Wed, 26 Apr 2006 21:48:16 +0200
Kacper napisał(a):
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.
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.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: odmierzenie 1ms w C dla ATMEGA
Date: Wed, 26 Apr 2006 10:42:16 +0200
On Wed, 26 Apr 2006 09:20:40 +0200, Bogdan Gutknecht wrote:
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.
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ć
Jeszcze pytanie co ten program robi, bo moze i tak nie ma nic lepszego
do roboty :-)
J.