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.\

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
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
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.
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.
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.
-
- -
- Posty:175
- Rejestracja:10 paź 2003, o 20:44
- Lokalizacja:Białystok
- Kontaktowanie:
Re: opóźnienia (funkcje) w c++ dla AVR - generowanie
CZeść. POszukaj w funkcjach bibliotecznych. Nie znam ICCAVR ale takie dedykowaneJak stworzyć funkcję opźnień w programach dla określonych czasów.
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.
A kto sądzi że nie ma żadnego wpływu. Nie bez kozery użyłem słowa "PRAWIE"Wbrew temu co sądzi Guru, temat jest bardziej skomplikowany i kompilator ma spory wpływ ...
[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.
Guru napisał (pisownia oryginalna):
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.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...
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 17 gości