cz3

cz3




Programowanie



wane (następuje to automatycznie przy 5MPTY INTERRUPT (A;azwa_pr zerwania) ;


ABC... C

Obsługa przerwań w AVR-GCC

Przypominam jeszcze raz: standard ANSI C nic definiuje sposobu obsługi przerwań. To, o czym będziemy dalej mówić, dotyczy ściśle kompilatora zastosowanego w pakiecie WinAVR.

Tworzenie funkcji obsługi przerwania znakomicie upraszcza dołączenie do programu pliku <avr\signal.h>. Definiuje on 3 różne makra. Po jego dołączeniu funkcję obsługi przerwania tworzymy jak to przedstawia listing:

SI GNAŁ {Na z wa p rz e r w a ni a)

{

// Ciało funkcji

)

Czyż nie wygląda prosto? Takie właśnie w istocie jest.

Najczęściej będziemy korzystać z zalecanego makra SIGNAL. Powoduje ono utworzenie funkcji obsługi w typowy dla AVR-ów sposób, gdzie w czasie obsługi jednego przerwania zerowana jest globalna flaga zezwolenia na przerwanie. Nie oznacza to, że procesor jest „ślepy i głuchy na inne wołania”. Jeśli w tym czasie będzie zgłoszone żądanie obsługi innego zdarzenia, ustawiona zostanie odpowiednia flaga i będzie ono obsłużone, gdy tylko przerwania zostaną odbloko-kończeniu obsługi aktualnego przerwania).

Czasami jednak chcemy, aby nowe zdarzenie mogło przerwać bieżące zadanie. Możemy w takim przypadku przy tworzeniu funkcji obsługi słowo SIGNAL zamienić na INTERRUPT. Kompilator doda wtedy automatyczne odblokowanie przerwań zaraz po wywołaniu jego obsługi. Makra tego należy używać bardzo ostrożnie. Każde przerwanie odkłada na stos pewne informacje. Nieprzemyślane używanie makra typu INTERRUPT może doprowadzić do zapchania stosu i nieprzewidzianego działania programu.

Pozostało nam jeszcze trzecie, rzadziej stosowane makro. Umożliwia ono utworzenie tak zwanego pustego przerwania. Wywołane przerwanie natychmiast zwróci sterowania do programu głównego. Jest to o tyle ważne, że standardowo wystąpienie nieprzewidzianego przerwania spowoduje restart całego programu. Puste przerwanie możemy utworzyć jak niżej:

Nie należy definiować ciała funkcji -makro tworzy je automatycznie.

Włączanie/wyłączanie przerwań

Plik <avr/interrupl.h> definiuje bardzo przydatne funkcje sei() i cli(). Obie tłumaczone są na jedną instrukcję asemblera o nazwie identycznej z nazwą funkcji. Powodują odpowiednio: globalne włączenie i globalne wyłączenie przerwań.

Istnieje tutaj także funkcja aktywacji przerwań liczników. Jednak chociażby ze względu na kompatybilność z innymi kompilatorami oraz banalność „ręcznego” realizowania takiego działania nie w-arto z niej korzystać.

Przerwania procesora AT90S23I3

() z nnc/cn ic Woru nck w \ s i :ip i cn iii

SICJNTEKRIIPTO

SIGJNTERRUm S.IG_IN PlfT_C APTttREl

S IG_Ot!TriT_C OMPAREIA

Przerwanie zewnętrzne Przerw unie zew nęlr/.no Przechwycenie zawartości licznika 1 Wy stopnienie warunku p tirów nania licznika 1

SlG_OVERFW>WI s io_o verflo wo

Przepełnienie licznika 1 Przepełnienie licznika 0

SIOJlART RFCV

Odebranie znaku przez port szeregowy

SK;_l ART..DATA

Zwolnienie rejestru wyjściowego nadajnika

SIO 1JART TRANS SIO COMPARATOK

Wvsianie znaku przez port szeregowy Przerw anie komparatora analosmciR'


Listing 10 Definicja nazw przerwań w pliku io2313.h

/* Interrupt vectors */ tfdeflne SIGJENTERRUPTO _VECTOR(l) #define SIG_INTERRUPTl _VECTOR(2) #define SIG_INPUT__CAPTUREl _VECTOR(3) tfdefine SIG_OUTPUT_CCMPARE 1A __VECTOR{4; #de£ine SIG_OVERFLOW.l _VECTOR(5)

#define SIG_OVERFLOWG _VECTOR(6) tfdefine SIG_UART_RECV _VECTOR(7)

#define SIG_UARTJ}ATA _VECTOR(8)

#de f ine SIG_UART_TRAN!J _VECTOR {9}

#def ine SIG_COMPARATOR _VECTOR<10 >

#define VECTORS SIZE 22


Obsługa wyświetlacza wymaga od nas wysterowania każdej cyfry tak, aby niedostrzegalne było migotanie całego pola odczytowego. Za granicę widocznego przez człowieka migotania uznaje się około 50Hz. Każde przerwanie powodowrać będzie wyłączenie bieżącego wyśw-ietlacza i uruchomienie następnego. Biorąc pod uwagę, że wyświetlaczy mamy 4 dochodzimy do wniosku, żc musimy odpowiednią procedurę wywołać co najmniej 200 razy w ciągu sekundy. Oczywiście nic jest tutaj ważna duża dokładność odmierzenia czasu. Jeśli procedura obsługi wyświetlacza będzie wywoływana nawet 500 razy na sekundę, spowoduje to tylko większe obciążenie procesora, a jednocześnie mniej zauważalne migotanie wyświetlacza. Ostatecznie pod koniec całego powyższego toku rozumowania możemy stwierdzić, że całkowicie wystarczy nam zastosowanie prostszego tunera. Bardziej rozbudowany pozostawiamy w celu jego ewentualnego wykorzystania do bardziej ambitnych zadań. Ze względu natomiast na prostotę wspomnianego licznika, wyboru w' przerwaniach nic mamy - będzie to przerwanie

Tabela 2 Przykładowe nazwy przerwań

wywoływane w momencie przepełnienia licznika.

Koniecznie zapoznaj się teraz z ramką mówiącą o tym, jak w naszym kompilatorze wygląda obsługa przerwań. Tabela 2 prezentuje nazwy przerwań procesora AT90S23I3. Wszystkie nazwy, jakie udostępnia nasz kompilator, można odnaleźć w' manuału (przypominam: C:\WinAVR\doc\avr-libc). Z mojego doświadczenia wynika jednak, że znacznie wygodniej jest zajrzeć do odpowiedniego pliku definiującego wszelkie stałe symboliczne dla wykorzystanego procesora. W naszym przypadku będzie to C:\WinAVR\avr\incAu-d.e\avr\ io2313.h. Listing 10 pokazuje, jak wygląda definicja wektorów przerwań. W ten sposób często łatwiej znaleźć interesującą nas nazwę niż za pomocą przedzierania się przez dokumentację, w której brak podziału na poszczególne procesory.

Uzbrojeni wr wiedzę o przerwaniach możemy podjąć się już zadania napisania naszego kodu z ich wykorzystaniem. Spójrz na listing 11. Przedstawiłem na nim prawie kompletny kod naszego programu. Program został napisany na bazie tego, do czego udało nam się dojść w poprzedniej części. Spójrz na linie oznaczone na szaro. Są to linie, które nie uległy zmianom. Może zdziwi Cię wyszarzenie wnętrza naszej funkcji obsługi przerwania? Zrobiłem to specjalnie. Zauważ, że zawarty tutaj kod to nic innego jak poprzednia zawartość naszej pętli głównej! Dzięki temu, że wykorzystujemy sprawdzony już fragment kodu, unikamy pracy oraz zmniejszamy możliwość pomyłki.

Zanim więc zaczniesz pisać nowy program, warto oszczędzić sobie pracy i przyjrzeć się co tak naprawdę jest do zrobienia w stosunku do jego wersji z poprzedniego miesiąca. Jeśli chcesz zachować kopię poprzedniego programu, skopiuj go teraz. Następnie otwórz go w Programmers Notcpa-dzie. Tak naprawdę konieczne jest jedynie dodanie dwóch plików nagłówkowych pomagających wf obsłudze przerwań. Konieczne jest dopisanie trzech linii inicjacji, utworzenie szkieletu funkcji obsługi przerwania oraz przeniesienia do jej ciała wnętrza naszej pętli głównej. Samą (pustą już) pętlę główną proponuję zosta-' wić. Zmiany opisałem tutaj bardzo skrótowo, ale jeśli podeprzesz się jeszcze listingiem 11 — wprowadzenie odpowiednich zmian nie będzie trudne.

Po skompilowaniu programu i jego wysłaniu do naszego układu testów-ego powinniśmy ujrzeć znajomy nam widok - wyświetlane kolejne cyfry na wyświetlaczach. Niektórzy

38 Upiec 2005 Elektronika dla Wszystkich


Wyszukiwarka

Podobne podstrony:
image002 Witamy w programieOstatnio otwarty 1^1 Pokazuj to okienko przy starcie programu
HOW TO AUTOMATE CARES Act & Paycheck Prołection Program (PPP) SBA Loans for Banks and Credit Uni
cz3 Programowanie ABC... C Warunki Warunki są to pewne specyficzne wyrażenia, które mogą. przyjąć d
DSC05640 (2) OBRAZ KLINICZNY C.D. ♦ Następuje to zwykle w porze południowej, przy czym czas krwawien
Scan 140410 0024 ścić, wyznaczyć normy i wskaźniki, a następnie to wszystko zastosować w praktyce, k
86141 SAM56 Operacja kuźnicza: wydłużanie (1)• wydłużanie - jest to operacja, przy której następuje
42 43 (30) 42 ków, zaimków osobowych itp. Sprawa następna to artykulacja, czyli "ruchy narządów
35. AUTOMATYKA ŁĄCZENIOWA I REGULACYJNA 562 następuje SPZ jednofazowe, a przy zwarciach wielofazowyc
ex3 4 O i OD JC 119/Change to a jump on carry 0110/-xyy . P=010B 100/ Reset program counrer back to
File1013 (3) # Palcem nakreśl skoki żaby, a następnie namaluj je przy użyciu flamastra. # Rysuj lini
help 07a Automatic contents © Choose some criteria to automatically show contents on FB © post Q pag
ident0011 razy dłużej, więc następuje to odpowiednio w wieku 9, 10 i 11 lat. Rejestry na okrajkach ś
Image226 Ig Rys* 4.224. Synchroniczny rewersyjny licznik dwójkowy z przeniesieniami szeregowymi wane

więcej podobnych podstron