Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 13:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 26 lip 2015, o 12:21 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

1-3... proponuję ci napisać taki sam program w C, i zajrzeć do pliku *.lss czyli asemblerowego. Zresztą wtedy możesz poćwiczyć z różnymi wariantami _delay_ms() w C i zobaczyć jak to robi kompilator i jak przygotowuje się do kontrolowanego w czasie opóźnienia ;) czyli dla różnego taktowania ten sam _delay_ms() będzie bardzo ciekawie różnie wyglądał w ASM i dużo ci to pomoże . Bo to co tu opisałeś to raczej taki delay - nazwałbym go "na czuja" czyli "na oko" dajesz takie wartości na różnych poziomach licznika aby dopasować sobie miganie diody LED

A z drugiej strony to i tu da się precyzyjnie powyliczać czas - przecież to asembler - patrzysz więc na czasy wykonywania poszczególych instrukcji asemblerowych - czy zajmują jeden, dwa czy więcej cykli zegara i po kolei liczysz uwzględniając oczywiście działania pętli itp ... no jest z tym trochę zabawy ;) jak widać - ale da się zrobić

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2015, o 12:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Nie orientuję się jeszcze w asemblerze na uC natomiast na pierwszy rzut oka wydaje mi się bardzo rozbudowany ten delay. Ja przy programowaniu 20 lat temu 6502 stosowałem bardzo prostą pętlę zagnieżdżoną. O ile pamiętam wyglądało to mniej więcej tak:

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tłumaczenia chyba to nie wymaga no i oczywiście to w pełni blokujący fragment programu :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2015, o 01:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

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):
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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...
Składnia: [ Pobierz ] [ Ukryj ]
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:


Składnia: [ Pobierz ] [ Ukryj ]
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 ;)


Autor postu otrzymał pochwałę

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 17:04 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

Nie koniecznie delaye to zło. Korzystam z nich czasem w debugowaniu, albo przy inicjalizacji programu, zanim ruszy cała machina przerwaniowo-timerowa. A gdybyś chciał kiedykolwiek użyć delaya w asm to zrób tak:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Poza tym uważam, że jednym z najbardziej przyjaznych asm posiadają AVRy, niby to aż 140 instrukcji, ale biorąc po uwagę instrukcje pochodne lub powielające się, ich ilość jest niewielka. Plusem AVR jest że każdy z 32 rejestrów roboczych może pełnić rolę akumalatora.

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO