odmierzenie 1ms w C dla ATMEGA



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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ł



Poprzedni Następny
Wiadomość
Spis treści
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...



Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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--

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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--

Poprzedni Następny
Wiadomość
Spis treści
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ł



Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.





Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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.