Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

opóźnienia (funkcje) w c++ dla AVR - generowanie

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
opóźnienia (funkcje) w c++ dla AVR - generowanie

Postautor: Sławek5 » 21 paź 2005, o 04:13

Jak stworzyć funkcję opźnień w programach dla określonych czasów.
Np. potrzebuje funkcji Delay_i2c() dla wytworzenia sygnału zegarowego dla i2c.
Powiedzmy że jet typu
Delayi2c()
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}

Kwarc 8MHz, kompilator Image Craft AVR ICCAVR.
Jak obliczyć takie opóźnienie.


Lub funkcje dla dłuższych opóźnien:

void delay( unsigned int del)
{
unsigned int i;
for(i=0; i<del; i++);
}

a ile taka zajmuje us.

bo chyba jest dłuższa niż 1/8MHz*del.\

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 21 paź 2005, o 06:01

W przypadku tej pierwszej funkcji kompilator tu prawie nie ma nic do rzeczy. Należy zapoznać się d datasheetem do konkretnego mikrokontrolera i tam będzie napisane że taką a to taką instrukcję mikrokontroler wykonuje przez ileś tam taktów zegarowych, stąd będziemy wiedzieli jaki okres czasu będzie się wykonywała dana procedura, i opóżnienie związane z jej wykonywaniem.

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 21 paź 2005, o 07:11

Wbrew temu co sądzi Guru, temat jest bardziej skomplikowany i kompilator ma spory wpływ. Funkcja opóżnienia ma dawać efekt w miejscu wywołania. Całkowite opóźnienie będzie się składało z czasu wykonania wiekszej ilości instrukcji maszynowych. pierwszy składnik to przygotownie parametru i wywołanie funkcji, drugi składnik to kod "na rozbiegu" funkcji, trzeci, dopiero, będzie składał się z ciała funkcji (np. tej wstawki asemblerowej), na koniec jeszce dojdzie czas wykonania instrukcji wyjścia (powrotu) z funkcji, Dla Twojej dociekliwości zostawiam analizę dlaczego zaproponowana funkcja "Delayi2c()" tylko w części związanej z powrotem będzie maiła czas wykonania zbliżony do czasu wykonania wstawki asm i jak temu zaradzić. Oczywiście nie uwzględniamy efektu działania przerwań. Ile czasu zajmują te składowe? najlepiej namówić kompilator aby pokazał co wygenerował, w asemblerze. I metodą GURU policzyć ilość cykli maszynowych każdego kawałka.
Jeżeli nie zależy nam na objętości programu a wymagane opóżnienie jest stosunkowo krótkie to lepiej zdefiniować przez

#define Delayi2c() {asm..<tu tekst wstawki>..}

wtedy czas opóżnienia będzie dokładnie taki jak to przedstawił Guru.

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Re: opóźnienia (funkcje) w c++ dla AVR - generowanie

Postautor: Jurek Szczesiul » 21 paź 2005, o 08:24

Jak stworzyć funkcję opźnień w programach dla określonych czasów.
CZeść. POszukaj w funkcjach bibliotecznych. Nie znam ICCAVR ale takie dedykowane
konkretnej rodzinie kompilatory mają na ogół dobre wsparcie dla sprzętu. Np.
avrlibc ma takie opóźnienia gotowe w kilku wersjach ( dla liczby cykli, us, ms ).

Pozdrowienia Jurek S.

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 21 paź 2005, o 09:00

Wbrew temu co sądzi Guru, temat jest bardziej skomplikowany i kompilator ma spory wpływ ...
A kto sądzi że nie ma żadnego wpływu. Nie bez kozery użyłem słowa "PRAWIE"

[shadow=red]W przypadku tej pierwszej funkcji kompilator tu PRAWIE nie ma nic do rzeczy[/shadow]

Proszę więc, zanim się mnie skrytykuje, o uważne przeczytanie co napisałem, bo przecież nie można się nie zgodzić z faktem, że co kompilator to inna ta sama funkcja.
Jeszcze należy dodać że wywołanie jej w odpowiednim kontekście, generuje np. rozkazy odłożenia na stos tego nad czym aktualnie pracujemy.
Ale przecież to opóźnienie będzie stosowane do obsługi magistrali I2C więc nie ma potrzeby odmierzania czasu z dokładnością w [ps].
Ostatnio zmieniony 24 paź 2005, o 09:53 przez Guru, łącznie zmieniany 1 raz.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 21 paź 2005, o 12:08

Slawek5: C++ ????

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 21 paź 2005, o 12:33

Guru napisał (pisownia oryginalna):
A kto sądzi że nie ma rzadnego wpływu. Nie bez kozery użyłem słowa "PRAWIE"
....
Proszę więc, zanim się mnie skrytykuje, o uważne przeczytanie co napisałem...
Drogi Guru, zanim się w tobie zagotuje, zastosuj się do własnej rady!. Przeczytaj uważnie co napisałem. Nigdzie nie imputuję Tobie wypowiedzi że nie ma żadnego wpływu. Ja tylko się nie zgodziłem ze zdaniem że PRAWIE nie ma wpływu. A w tym konkretnym przypadku "Delayi2c()" czas wykonania wszystkiego co dokłada kompilator i wywołanie funkcji znacznie przekracza czas wyznaczony zgodnie z Twoją radą. I jest to ZNACZNY wpływ kompilatora.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 21 paź 2005, o 12:55

pajaczek wiadomo, że C!

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 21 paź 2005, o 17:30

No wlasnie ostatnio niewiadomo... coraz wiecej osob zaczyna mylic te jezyki. A co gorsza zaczynja sie pojawiac takie pomylki, ktore prowokuja kolejne u innych... i tak kolko sie napedza.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości