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 15:23


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
    PostNapisane: 16 mar 2014, o 17:19 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 162
    Pomógł: 6

    Witam,
    mam do wykonania projekt urządzenia opartego na M324PA, który między innymi ma za zadanie odbierać dane wysyłane szeregowo (trzy sygnały - SCK -->INT0, DATA -> jakiś pin, LATCH -- > INT1)(48 bitów, bez CRC)
    Obrazek


    , a następnie wyświetlać te tane na 8 multipleksowanych wyświetlaczach 7-seg.

    Wydaje mi się, że istnieje niebezpieczeństwo, że dane mogą nadejść w momencie przerwania obsługującego multipleksowanie... i wtedy nie odbiorę kompletnych danych...
    Co mogę zrobić, żeby w trakcie przerwania timera obsługującego multipleksowanie możliwe było wystąpienie przerwnia od INT0 i INT1???

    Z góry dziękuję za pomoc.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 17:58 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Przy taktowaniu 20MHz nie powinno być problemu. Cała ramka ma 1,85ms co daje 38us na bit. W tym czasie przy taktowaniu 20MHz procesor wykona 760 instrukcji. Funkcja obsługi przerwania dla multipleksowania trwa znacznie krócej, bo jakieś 70 instrukcji (co można sobie sprawdzić w pliku lss z folderu Release).
    Oczywiście lepiej byłoby wykorzystać sprzętowe SPI.

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:20 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 162
    Pomógł: 6

    no, że czas wolny na obliczenia jest, to ja wiem. Ale jak będzie wykonywało się przerwanie od multipleskowania i akutat w tym czasie wystąpi zbocze narastające na INT0(zakłądam wyzwalanie przerwania zboczem), to nie zostanie wyłapany bit, bo przecież procedura przerwania nie zaczeka w kolejce na odblokowanie przerwań(a może jednak zaczeka...?).
    Czy ja mogę w w przerwaniu od timera(multipleksowanie) na początku dać sei(), żeby umożliwić wchodzenie w kolejne przerwania?



    Ostatnio edytowano 16 mar 2014, o 23:32 przez aaadamw, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lut 2013
    Posty: 223
    Zbananowany użytkownik

    Pomógł: 21

    Rozdział 22.16 AVR libc user manual radzi:
    Cytuj:
    Nested interrupts The AVR hardware clears the global interrupt flag in SREG before entering an interrupt vector. Thus, normally interrupts will remain disabled inside the handler until the handler exits, where the RETI instruction (that is emitted by the compiler as part of the normal function epilogue for an interrupt handler) will eventually re-enable further interrupts. For that reason, interrupt handlers normally do not nest. For most interrupt handlers, this is the desired behaviour, for some it is even required in order to prevent infinitely recursive interrupts (like UART interrupts, or level-triggered external interrupts). In rare circumstances though it might be desired to re-enable the global interrupt flag as early as possible in the interrupt handler, in order to not defer any other interrupt more than absolutely needed. This could be done using an sei() instruction right at the beginning of the interrupt handler, but this still leaves few instructions inside the compiler-generated function prologue to run with global interrupts disabled.
    The compiler can be instructed to insert an SEI instruction right at the beginning of an interrupt handler by declaring the handler the following way:

    ISR(XXX_vect, ISR_NOBLOCK)
    {
    ...
    }


    Autor postu otrzymał pochwałę

    _________________
    Nie pisz komentarzy - dobry kod komentuje się sam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 162
    Pomógł: 6

    hm... czyli jak użyję tego parametru dla przerwania od przepełnienia timera:
    ISR(XXX_vect, ISR_NOBLOCK)
    {
    ...
    }
    to obsługa tego przerwania będzie mogła zostać przerwana przez INT0 i INT1



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lut 2013
    Posty: 223
    Zbananowany użytkownik

    Pomógł: 21

    Użycie przy ciele przerwania argumentu ISR_NOBLOCK, powoduje, że po ~5 cyklach zegarowych od wystąpienia żądania przerwania (chyba 2 na skok do tablicy wektorów, 2 na jmp w tablicy, potem 1 na sei) działanie programu może zostać (ponownie) przerwane przez dowolne przerwanie. W przypadku wystąpienia przerwania bez tego argumentu, możliwość przerwania pracy programu (przerwania) jest zablokowana do czasu wyjścia z takiego przerwania (reti).

    Albo krócej - tak.

    _________________
    Nie pisz komentarzy - dobry kod komentuje się sam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 162
    Pomógł: 6

    aaadamw napisał(a):
    bo przecież procedura przerwania nie zaczeka w kolejce na odblokowanie przerwań(a może jednak zaczeka...?).

    poczytałem w nocie do M324PA:
    Obrazek

    i wychodzi na to że jednak zaczeka. Jeżeli wystąpi zbocze na INT0/INT1 nawet w trakcie wykonywania innego przerwania, zostanie ustawiona flaga INTFx i potem, jak bit I w rejestrze SREG zostanie ponownie ustawiony to przerwanie INT zostanie obsłużone.... :)

    Dobrze to rozumiem?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 mar 2014, o 23:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lut 2013
    Posty: 223
    Zbananowany użytkownik

    Pomógł: 21

    Flaga żądania przerwania zostaje ustawiona, kiedy zostaną spełnione odpowiednie warunki. Flaga żądania może zostać usunięta ręcznie (bodajże trzeba do niej 1 wpisać), albo automatycznie poprzez wywołanie żądanego przerwania. Przerwanie zostanie wywołane, kiedy flaga żądania jest ustawiona, odblokowane jest to konkretne przerwanie, oraz ustawiona jest globalna flaga zezwolenia na przerwania.

    Krócej - tak.

    _________________
    Nie pisz komentarzy - dobry kod komentuje się sam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 mar 2014, o 01:08 
    Offline
    Moderator
    Avatar użytkownika

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

    aaadamw napisał(a):
    i wychodzi na to że jednak zaczeka. Jeżeli wystąpi zbocze na INT0/INT1 nawet w trakcie wykonywania innego przerwania, zostanie ustawiona flaga INTFx i potem, jak bit I w rejestrze SREG zostanie ponownie ustawiony to przerwanie INT zostanie obsłużone....


    No a jak inaczej mógłby działać system przerwań? gdyby było inaczej to w zasadzie można byłoby takie procki na śmietnik tylko wyrzucać albo do starych kalkulatorów używać ;)

    Flagi sprzętowe przerwań - tak jak już widzisz same się nie skasują i dzięki temu kaskadowo może się wykonać szereg różnych przerwań jedno po drugim

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

    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