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



Teraz jest 23 kwi 2024, o 10:28


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: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

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 
Offline
Moderator
Avatar użytkownika

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

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 
Offline
Moderator
Avatar użytkownika

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

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