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? 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 10 lip 2025, o 06:17


    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: 582
    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: 3229
    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: 582
    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: 3229
    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: 582
    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: 3229
    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: 582
    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: 582
    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 
    Online
    Moderator
    Avatar użytkownika

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

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

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

    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: 582
    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 
    Online
    Moderator
    Avatar użytkownika

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

    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 10 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