Cześć Anty,
Antystatyczny napisał(a):
1. Czy da się jakoś uprościć funkcję Delay?
2. Jak właściwie obliczać długość takiego delaya?
3. A może jest zupełnie inna metoda tworzenia delaya?
Zacznę trochę nietypowo, bo od 2-giego punktu:
Ad.2 - Podstawa to jest znać ilość cykli zegarowych potrzebnej do wykonania danej instrukcji procesora (arytmetycznego). To zawsze powinno być w dokumentacji gdzieś w dziale "Arithmetic and Logic Instructions" w kolumnie "Cycles". Sumujesz ilość cykli wszystkich instrukcji (pamiętając, że liczenie w ALU zaczyna się od zera) oraz dodajesz 4 cykle (zazwyczaj) na powrót z instrukcji ret.
Ad.3 - Nie wiem czy są jakieś konkretne metody tworzenia delay'ów. Ja zawsze -podobnie jak Kolega SylwekK stosowałem pętle, gdzie przeważnie w tej całkiem wewnętrznej pętli była instrukcja nop. Z tym stosowaniem pętli jest taka ciekawostka, że trzeba wiedzieć następującą (być może prozaiczną zasadę obliczenia czasu):
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W oparciu o to dokonujemy przekształcenia wzoru i mamy tak:
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz wiemy ile musimy "nabić" tych cykli jakimiś instrukcjami i jakimiś pętlami (wewnętrznymi i zewnętrznymi)...
np. taka pętla dla Atmega32...
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ostatnia instrukcja skoku jest dość ciekawa, bo zajmuje 2 cykle jeśli występuje w pętli zewnętrznej tak jak tutaj, ale 1 cykl zegarowy w pętli wewnętrzej - patrz proszę przykład poniżej:
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Liczymy ilość cykli pętli wewnętrznej:
125 * 4 = 500 cykli zegarowych
Liczymy ilość cykli pętli zewnętrznej:
- pętla wewnętrzna wykona: 500 * 8 (wartość R17) = 4000 cykli zegarowych
- oraz wykona raz obejście samej siebie co jej zajmie: 4 * 8 = 32 cykle zegarowe
Suma cykli zegarowych wynikających z pętli wewn. i zewn. = 4032 i do tego należy dodać 1 cykl zerowania rejestru R17 oraz 4 cykle na powrót z instrukcji wywołania (ret), czyli RAZEM: 4032 + 1+ 4 = 4037 cykli
Czas jaki to zajmie przy założeniu że ALU jest taktowany zegarem np. 8 MHz:
t = 4037 / 8000000 = 0.0005 sekundy
Mam nadzieję, że niczego nie pomieszałem, bo dość późno o tym piszę, ale chcę dobrze.
Anty akurat do asemblera jeśli chodzi o avr'y ja używałem książki Borkowskiego. Nie jest to może najlepsza książka, jednak ma tą przewagę nad innymi, że niektóre rzeczy akurat w assemblerze autor tłumaczy tam naprawdę dokładnie, można by rzec zbyt dokładnie i zbyt wiele drobnych uwag tam wtrąca, które mnie akurat rozpraszały, ale jak dla kogoś kto zaczyna mogłyby pomóc...
A gdy się już te podstawy zrozumie to należy się wziąść za Baranowskiego - on już jedzie ostrzej
Acha, często stosuje się ileś tam nop'ów, tzn. nop - to taka mini-instrukcja delay procesora
która zajmuje przeważnie 1 cykl zegarowy
Mam nadzieję, że przynajmniej odrobinkę pomogłem
Pozdrawiam! j23 Jarek
P.S. "Załaduj program skoków"
...z Matrix'a