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



Teraz jest 3 gru 2024, o 16:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 8 gru 2012, o 15:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Witam.

Mam pytanie, czy jeśli ustawimy przerwanie tak aby było wykonywane gdy na końcówce będzie poziom niski(i końcówkę na stałe podepniemy do masy) , to czy cały czas będzie wykonywana procedura z przerwania? czy może program na moment zdąży przejść do pętli głównej?

Może to zobrazuję:(skrócony kod)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i teraz jeśli jeśli mamy przerwanie wywoływane poziomem, i CAŁY CZAS pin jest zwarty do masy, to czy program będzie cały czas siedział w pętli ISR( INT0_vect ) , czy może jednak zdąży wyskoczyć z tej pętli i na minimalny okres czasu zrobić coś z pętli main?

Post edytowany ;))



Ostatnio edytowano 8 gru 2012, o 15:38 przez xamrex, łącznie edytowano 6 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:17 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Nie będzie siedział w pętli bo skoro będzie cały czas stan niski - to NIE BĘDZIE zbocza. Będzie tylko stan niski.

W tym przypadku należałoby ustawić przerwanie od niskiego poziomu.

------------------------ [ Dodano po: 4 minutach ]

Ale pod listingiem nie poprawiłeś. :lol: Brzmi to teraz niejednoznacznie.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Chodzi mi o takie ustawienie:
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:27 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

xamrex napisał(a):
Mam pytanie, czy jeśli ustawimy przerwanie tak aby było wykonywane gdy na końcówce będzie poziom niski (i końcówkę na stałe podepniemy do masy) ,


No i teraz jeśli jeśli mamy przerwanie wywoływane zboczem , i CAŁY CZAS pin jest zwarty do masy, to czy program będzie cały czas siedział w pętli ISR( INT0_vect ) , czy może jednak zdąży wyskoczyć z tej pętli i na minimalny okres czasu zrobić coś z pętli main?

Post edytowany ;))


Wiem o co Ci chodzi, ale popatrz na te dwa zdania. Nie widzisz sprzeczności? O tym mówię.

Nigdy takiej możliwości nie sprawdzałem, ani nie spotkałem sie z opisem, ale myślę że żaden kod się nie wykona.

Będzie non stop wywoływana obsługa przerwania.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:30 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

xamrex jeśli chodzi ci o poziom logiczny 0 czyli że przerwanie ma być wykonane wtedy gdy będzie stan niski na pinie. To tak będzie cały czas robił się program z przerwania także do czego ma to być? Takie ustawienie może blokować program w pętli jeśli miało by chodzić cały czas. Tak mi się wydaje :)

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Jaglarz-> już post poprawiłem:) tak to jest jak się szybko pisze :)

Janadamis napisał(a):
jeśli chodzi ci o poziom logiczny 0 czyli że przerwanie ma być wykonane wtedy gdy będzie stan niski na pinie. To tak będzie cały czas robił się program z przerwania także do czego ma to być? Takie ustawienie może blokować program w pętli jeśli miało by chodzić cały czas. Tak mi się wydaje :)


To nie ma być do niczego.
Tylko czysto teoretycznie..
Cytuj:
To tak będzie cały czas robił się program z przerwania


Jesteś pewien, że ani na jeden cykl program nie wróci do pętli w mainie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:42 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

W 100% nie jestem pewien ale skoro gdy skończy się przerwanie to zaczyna się kolejne przerwanie bo ciągle stan niski.więc program nie powinien się wykonywać. Ale pewny nie jestem. Trzeba zrobić prosty test i się dowiemy.

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:47 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Według mnie nawet kod przerwania się nie wykona. Cały czas będzie wywoływany skok do obsługi przerwania i ... bardzo szybko przepełni się stos.


Teraz czekajmy aż wpadną tu M. lub S. :lol:

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 15:53 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

M:
Panowie, Panowie, na Zeusa zróbcie sobie przerwanie, dławik na drogę temu co wymyslił to pytanie,
oby mu cewka puściła...

a tak na poważnie to Xamrex - podobają mi się Twoje pytania



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 16:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Ja bym z miłą chęcią sobie zrobił taki teścik..
Nawet specjalnie w mainie we whilu dałem PORTD=(1<<PD0);
Aby zobaczyć czy na porcie D.0 Jest cały czas stan niski, czy może na ułamek sekundy jest stan wysoki, ale niestety nie mam oscyloskopu, aby to sprawdzić :) Nie mam nawet płytki Mirkowej, bo akurat dałem koledze ;/
wireless Wiem, wiem ja mam zawsze dziwne pytania :D

------------------------ [ Dodano po: 2 minutach ]

Jaglarz napisał(a):
Według mnie nawet kod przerwania się nie wykona. Cały czas będzie wywoływany skok do obsługi przerwania i ... bardzo szybko przepełni się stos.


Teraz czekajmy aż wpadną tu M. lub S. :lol:

Nie no tak nie będzie.
Jeśli w trakcie wykonywania funkcji przerwania następuje kolejne przerwanie to te przerwanie pierwsze musi dolecieć do końca. (Z tego co mi wiadomo w trakcie obsługi przerwań inne przerwania są wyłączone)Doipero jak się skończy obsługa przerwania znowu następuje włączenie przerwań.
Więc stos się nie przepełni.
Ale też tego nie jestem pewien :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 16:33 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

czego się właśnie douczyłem:

procedura przerwania kończy się wygenerowaniem instrukcji asemblera RET, powodującej
załadowanie do rejestru wartości wcześniej odłożonej na stosie, a więc powrót do instrukcji
następnej po instrukcji wywołującej przerwanie

procedura przerwania musi także odblokować globalną flagę zezwolenia na przerwanie RETI
to wszystko musi dołożyć kompilator

czyli na chłopski rozum nastąpi powrót do funkcji main i nastąpi kolejne przerwanie i takie
zapętlenie bym obstawiał

czyli do while nigdy nie dojdzie wg. mnie i niech mnie Zeus ma w swojej opiece, jeśli to nieprawda :lol:



Ostatnio edytowano 8 gru 2012, o 16:38 przez wireless, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 16:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Tak, tylko czy w tej funkcji main zdąży się wykonać
PORTD=(1<<PD0);
Bo o to od początku pytam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 16:39 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

wireless napisał(a):
czyli do while nigdy nie dojdzie wg. mnie i niech mnie Zeus ma w swojej opiece, jeśli to nieprawda :lol:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 18:17 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

W teorii tak jak koledzy piszą nie powinno dojść do pętli głównej.
Więc jedynym rozwiązaniem jest sprawdzić to w praktyce i nie potrzeba do tego żadnego oscyloskopu.

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2012, o 21:10 
Offline
Moderator
Avatar użytkownika

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

Sprawa jest BARDZO PROSTA i nic nie trzeba sprawdzać w praktyce - trzeba po prostu poczytać jak działa procesor najlepiej zapoznać się z nim od strony asemblera - wtedy od razu wszystko stanie się proste jeśli chodzi o takie rzeczy.

zakładamy że wyzwalamy przerwanie INTx poziomem niskim, i na chama zwieramy pin INTx do GND ;) co się stanie ?

W pewnym momencie (nie ważne jakim - gdy zewrzemy INTx do GND) program główny zostanie przerwany, wykona się procedura obsługi przerwania no i MUSI się skończyć ;) .... jak mogłaby się nie skończyć? Więc gdy się skończy to sterowanie zostanie przekazane znowu do programu głównego, wykonana zostanie JEDNA instrukcja asemblerowa z programu głównego (czyli może to być nawet nie pełna instrukcja w C i program zostanie ZNOWU przerwany i znowu nastąpi wywołanie takiego przerwania. Gdy się skończy .... i tak dalej i tak dalej i tak dalej

po prostu 99,99% czasu procek będzie obsługiwał to przerwanie a tylko 0,01% (w uproszczeniu) będzie wykonywał program główny

to tylko tyle albo aż tyle

mam nadzieję, że proste ? ;)

_________________
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: 8 gru 2012, o 23:01 
Offline
Moderator
Avatar użytkownika

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

Antystatyczny napisał(a):
A czemu zostanie wykonana jedna instrukcja skoro wciaż jest masa na pinie procka?


Oczywiście napisałem "jedna" w uproszczeniu - jak ktoś chce zobaczyć czy jedna czy dwie to MUSI zajrzeć dokładnie do PDF'a. Chodzi o to że:

1. przede wszystkim skoro zaczęła się procedura to MUSI się kiedyś skończyć ;)
2. w asemblerze jest taki specjalny rozkaz RETI oznaczający powrót z przerwania, i przy okazji zdjęcie ze stosu adresu powrotu
3. skoro wraca NO TO MUSI wrócić tam gdzie został przerwany program główny i do licznika komend PC ładowany jest kolejny rozkaz z kolejnej komórki pamięci programu FLASH...

..... i teraz

trzeba sobie sprawdzić w PDF, ile cykli zegarowych jest wymaganych aby nastąpiło sprawdzenie flagi (większość rozkazów ma 1 cykl zegara). Więc MINIMUM musi być ten jeden cykl, ale skoro już został pobrany rozkaz programu to MUSI zostać wykonany i w kolejnym cyklu zegarowym sprawdzana jest flaga czy przerwanie aktywne - A PRZECIEŻ AKTYWNE bo cały czas INTx zwarte do GND, zatem w kolejnym cyklu już odkładany jest na stos adres powrotu i znowu skok do przerwania .... ale zasada działania procków RISC jest taka, że po wykonaniu jednego rozkazu MUSI być załadowany drugi, więc po RETI - ZAWSZE zostanie wykonane co najmniej jedno polecenie asemblera z programu głównego gdzie nastąpił powrót, nie może procek w jednym cyklu wykonywania RETI badać jednocześnie flagi, dopiero jak będzie ładował kolejny rozkaz do wykonania to zbada flagę i w następnym cyklu zareaguje

tak to mniej więcej się dzieje

_________________
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: 8 gru 2012, o 23:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 maja 2012
Posty: 256
Pomógł: 3

W AVR Studio 4.5 był symulator pamiętam. W związku z tym może dało by się to odtworzyć tam, jakby ktoś bardzo ciekawy był.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2012, o 09:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Mirku, czyli reasumując.
Zdąży się wykonać instrukcja:
PORTD=(1<<PD0);
?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2012, o 15:29 
Offline
Moderator
Avatar użytkownika

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

GwynBleidD napisał(a):
Tak, powinna zdążyć się wykonać, ewentualnie na raty jeśli składa się z kilku instrukcji asemblerowych (w tym przypadku mamy jedną).


Dokładnie jak mówi kolega.

_________________
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: 19 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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