Przerwanie od Timera w Atmega168

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 02 wrz 2010, 17:51

keruseykaryu pisze:- SIGNAL() zastąp przez ISR(), bo SIGNAL() może znienacka zniknąć (jak sławne cbi, sbi);
Jaka jest właściwie różnica?

keruseykaryu

Post autor: keruseykaryu » 03 wrz 2010, 8:32

Na początku był chaos. Potem były dwa makra SIGNAL() i INTERRUPT(). Oba tworzyły odpowiednie procedury, zakończone przez reti. Różnica była jedna: INTERRUPT() automatycznie włączał przerwania, co by następne przerwania mogły go przerwać. SIGNAL() tego nie robił. Potem ktoś stwierdził, że INTERRUPT() jest przestarzałe i trzeba ujednolicić, dlatego zapomniano o INTERRUPT(), utworzono nowe, lepsze makro ISR() powiązane z nowym nagłówkiem interrupt.h , a SIGNAL() jak i jego nagłówek pozostało jako nieszkodliwa wsteczna kompatybilność.

ISR() zastąpiło w sumie oba makra, bo nie każdy pamięta, że definicja wygląda tak:
#define ISR ( vector, attributes ). O wektorach to pewnie wiesz, ale atrybuty są ciekawe: ISR_BLOCK, ISR_NOBLOCK, ISR_NAKED i ISR_ALIASOF(vect). Po kolei.
a) Blokowanie dalszych przerwań, jakby SIGNAL(), można pominąć bo to wartość domyślna.
b) Nieblokowanie dalszych przerwań, jakby INTERRUPT().
c) Przerwanie nie ma dodatków kompilatora, można pisać przerwanie od początku do końca jak się chce, trzeba pamiętać o reti().
d) Przerwanie nie ma swojego rozwinięcia i odwołuje się do innego przerwania, by nie pisać czasem tego samego.

Reszta przydatnych informacji ale po anielsku http://www.nongnu.org/avr-libc/user-man ... rupts.html

ODPOWIEDZ