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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 8 kwi 2025, o 14:02


    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: 27367
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 1968
    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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO