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



Teraz jest 11 sty 2025, o 04:37


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: 27343
Lokalizacja: Szczecin
Pomógł: 1041

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