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 20 maja 2025, o 06:53


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 3 wrz 2017, o 09:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    Wyjaśnijcie proszę początkującemu po co pisać sei() przed while za każdym razem gdy chcemy by nasz procek korzystał z przerwania , wszędzie jest napisane że masz pisać , nie pisze czemu przed while ,a nie np . w pętli , masz pisać i już mi jednak nie daje to spokoju i dociekam głębiej dlatego:

    1. co to jest sei () // odpowiedz zezwolenie na przerwanie globalne mnie nie satysfakcjonuje
    2. dlaczego jest to zezwolenie na przerwanie globalne a nie np. lokalne
    3. czemu akurat przed while się go stosuje ?

    fajnie gdyby ktoś dysponował rysunkami objaśniającymi bo ciężko mi to zrozumieć .

    Pozdrawiam



    Ostatnio edytowano 3 wrz 2017, o 10:52 przez procek87, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2017, o 10:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1034
    Lokalizacja: Trójmiasto
    Pomógł: 190

    procek87 napisał(a):
    2. dlaczego jest to zezwolenie na przerwanie globalne a nie np. lokalne
    bo lakalne zezwolenia są w konfiguracji poszczególnych peryferiów (przerwanie od licznika, od ADC, od UART itd itp) a sei() włączą zezwolenie na wykonanie dowolnego przerwania. Jeśli włączysz przerwanie np od przepełnienia licznika, to bez sei() to przerwanie się nie będzie wykonywać bo brak zezwolenia globalnego. Globalne zezwolenie jest pomocne bo gdy mamy fragment programu gdzie bardzo istotny jest czas wykonywania (który przecież może zostać zaburzony przez wykonywanie procedur obsługi przerwań) to na czas wykonywania tego fragmentu kodu możemy wyłączyć zezwolenie globalne cli(), a po wykonaniu newralgicznego kodu ponownie włączyć sei(). W ten sposób we wszystkich peryferiach które używają przerwań nie trzeba ich wyłączać, a wystarczy wyłączyć globalnie zezwolenie na przerwania, a później włączyć.
    Cytuj:
    2. czemu akurat przed while się go stosuje ?
    ponieważ w ciele funkcji main zazwyczaj są instrukcje inicjujące poszczególne peryferia i włączenie globalnego zezwolenia na przerwanie za wcześnie spowodowałoby że różne przerwania mogły by zostać już wywołane przed zainicjowaniem wszystkiego co potrzeba. Nie jest to wymóg ale raczej dobry nawyk.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2017, o 11:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 maja 2017
    Posty: 143
    Pomógł: 0

    xentis dziękuje może wrócę do tego wątku gdy będe robił więcej ćwiczeń praktycznych wtedy też w tym wątku o coś się spytam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2017, o 12:01 
    Online
    Moderator
    Avatar użytkownika

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

    procek87 napisał(a):
    1. co to jest sei () // odpowiedz zezwolenie na przerwanie globalne mnie nie satysfakcjonuje


    wiesz dlaczego cię nie przekonuje ? ja wiem - bo nie rozumiesz JAK DZIAŁA system przerwań w procku jeszcze - a od tego warto byłoby zacząć, aby zrozumieć

    zamiast więc pisać że ciebie coś nie satysfakcjonuje - to weź że lepiej obejrzyj poradnik:


    poświęć troszkę czasu - tu w pierwszej połowie masz to SUPER wyjaśnione - dla początkującego - poradnik jako uzupełnienie do Blueboka - a widzę od jakiegoś czasu, że raczej nie przeglądasz za często bloga



    ------------------------ [ Dodano po: 11 minutach ]

    procek87 napisał(a):
    2. dlaczego jest to zezwolenie na przerwanie globalne a nie np. lokalne


    Bo nie ma czegoś takiego jak zezwolenia "lokalne" - skąd taki pomysł ? mieszasz pojęcia programistyczne np: zmienne lokalne i globalne. A to nie ma nic wspólnego.

    zezwolenie globalne sei() .... bo to jest tak, że wcześniej dokonujesz odblokowania poszczególnych innych przerwań np od UART'a od jakiegoś Timera, od ADC itp itd

    ale system przerwań w procku wciąż nie działa - DOPIERO gdy przed "startem" programu czyli przed pętlą główną (a masz o tym napisane w Bluebooku - co to jest start program czyli pętla główna i sekcja inicjalizacji przed nią - i globalne zezwolenie na przerwania)

    a więc przed pętlą główną - gdy wiesz, że już odblokowałeś za pomocą bitów w różnych rejestrach konfiguracyjnych przerwania od różnych modułów - to dopiero teraz gdy konie stoją w bramkach :) (jak na torze) i czekają tylko na START - właśnie ten start to SEI() bramki się otwierają i konie zapierniczają :D czyli od tego momentu każde przerwanie zaczyna działać w systemie....

    A ty co? a ty chcesz takie globalne zezwolenie SEI() odpalać miliony razy w pętli głównej ? a po jaki gwint ?

    tak samo na torze wyścigowym, jak gościu strzeli z pistoletu, konie wybiegną z bramek to po jaki gwint miałby on dalej sobie strzelać tym pistoletem? coś to da? skoro konie i tak już biegną?

    _________________
    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: 31 sty 2018, o 17:05 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 05 sty 2018
    Posty: 14
    Pomógł: 0

    Obserwując w nocie info (rozpisane instrukcje asemblera) dotyczące przerwania jest tak:

    $000 rjmp RESET ; Reset Handler
    $001 rjmp EXT_INT0 ; IRQ0 Handler
    ...
    ... // rjmp dla pozostałych przerwań
    ...
    $011 rjmp TWSI ; Two-wire Serial Interface Handler
    $012 rjmp SPM_RDY ; Store Program Memory Ready Handler
    ;
    $013 RESET: ldi r16,high(RAMEND); Main program start
    $014 out SPH,r16 ; Set Stack Pointer to top of RAM
    $015 ldi r16,low(RAMEND)
    $016 out SPL,r16
    $017 sei ; Enable interrupts
    $018 <instr> xxx
    ... ... ...

    I teraz tak. Pisząc program w C, aby można było korzystać z przerwań trzeba umieścić przed np. pętlą główną instrukcję:

    sei(); // uruchomienie systemu przerwań

    a ja widzę, że w asemblerze w linii $017 jest:

    $017 sei ; Enable interrupts - czyli asembler domyślnie uruchamia przerwania

    Czy to znaczy, że asembler automatycznie uaktywnia przerwania po restarcie, a C nie. Czy może jedno z drugim nie ma nic wspólnego? Czy ja o czymś nie wiem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2018, o 01:21 
    Online
    Moderator
    Avatar użytkownika

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

    nowy_stary napisał(a):
    Czy może jedno z drugim nie ma nic wspólnego?

    Nie ma nic wspólnego - piszesz o jakichś dziwnych rzeczach ....

    jakby były jakieś tajne mechanizmy w ASM i w C które coś tam sobie robią ...

    Panie - ani C ani ASM nic same nie robią ... to TY jako programista robisz

    Jeśli programujesz w asemblerze to od ciebie zależy kiedy włączysz globalne przerwania - tak samo w C ... rozumiesz ?

    Można tak napisać jakiś tam program, że np nigdy nie będzie trzeba włączyć globalnych przerwań ;) i co? myślisz że jakiś tajny agent w ASM albo w C ... sam sobie coś tam włączy ?

    Trzeba najpierw zrozumieć co to są przerwania i jak działają - zanim się zacznie domyślać takich dziwnych rzeczy, że coś tam sobie robi C a coś innego ASM ;)

    _________________
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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


    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