Tłumaczą Ci ludzie już drugi dzień. Zwłaszcza kolega
Logan. Czy tak trudno przeczytać w Helpie:
Cytat: Instrukcja ON INTERRUPT
Przeznaczenie:
Wykonuje skok do podprogramu gdy wystąpiło określone przerwanie.
Składnia:
ON źródło_przerwania nazwa_podprogramu [ NOSAVE ]
gdzie:
źródło_przerwania symboliczna nazwa źródła przerwania,
nazwa_podprogramu etykieta określająca gdzie znajduje się podprogram obsługi przerwania.
Opis:
Gdy wystąpi określone przerwanie – określone symbolicznie po słowie ON – instrukcja skacze do podanego podprogramu.
Język BASCOM BASIC rozpoznaje następujące źródła przerwania (po przecinku podano nazwy w konwencji stosowanej przy opisie procesorów AVR):
INT0 przerwanie zewnętrzne końcówka INT0
INT1 przerwanie zewnętrzne końcówka INT1
INT2 przerwanie zewnętrzne końcówka INT2 (tylko niektóre kontrolery)
INT3 przerwanie zewnętrzne końcówka INT3 (tylko niektóre kontrolery)
INT4 przerwanie zewnętrzne końcówka INT4 (tylko niektóre kontrolery)
INT5 przerwanie zewnętrzne końcówka INT5 (tylko niektóre kontrolery)
TIMER0, OVF0 przerwanie przepełnienia licznika TIMER0
TIMER1, OVF1 przerwanie przepełnienia licznika TIMER1
TIMER2, OVF2 przerwanie przepełnienia licznika TIMER2 (tylko niektóre kontrolery)
ADC, ADCC przerwanie przetwornika A/D (tylko niektóre kontrolery)
EEPROM, ERDY przerwanie - gotowość wbudowanej pamięci EEPROM
CAPTURE1, ICP1 przerwanie rejestru przechwycenia licznika TIMER1
COMPARE1A, OC1A przerwanie pierwszego rejestru porównania licznika TIMER1
COMPARE1B, OC1B przerwanie drugiego rejestru porównania licznika TIMER1
COMPARE1 przerwanie rejestru porównania licznika TIMER1
OC2 przerwanie rejestru porównania licznika TIMER2 (tylko niektóre kontrolery)
SPI przerwanie interfejsu SPI
URXC przerwanie układu sprzętowego UART – odebranie znaku
UTXC przerwanie układu sprzętowego UART – wysłanie znaku
UDRE przerwanie układu sprzętowego UART – bufor pusty
ACI przerwanie wewnętrznego komparatora
Ilość i źródła przerwań są ściśle związane z budową użytego procesora AVR. Nazwy możliwych przerwań można znaleźć w pliku rejestrów wybranego procesora. Na przykład w pliku 2313def.dat podano, że istnieje źródło przerwania nazwane COMPARE1 (patrz na końcu pliku).
Procedura obsługi musi się kończyć instrukcją RETURN, co spowoduje, że na końcu procedury zostanie umieszczona instrukcja maszynowa RETI.
Instrukcja RETURN może występować w kilku miejscach podprogramu. W przypadku podprogramów obsługi przerwań tylko pierwsza instrukcja RETURN zostanie przetłumaczona na sekwencję powrotu z przerwania (tj. odtworzenie stanu rejestrów i wykonanie RETI). Przy czym nie może ona występować w połączeniu z instrukcja warunkową. Wszystkie dalsze instrukcje RETURN zostaną skompilowane do zwykłego RET.
Określenie parametru NOSAVE spowoduje, że zawartość rejestrów nie będzie zapamiętana przed wejściem do procedury przerwania i odtworzona na jej końcu. Dlatego też, gdy podano NOSAVE należy zapewnić by zawartość rejestrów została zapamiętana i otworzona. Służą do tego instrukcje PUSHALL i POPALL.
Gdy parametr NOSAVE nie występuje, zawartość wszystkich rejestrów zostanie automatycznie zapamiętana i odtworzona. Dotyczy to tylko rejestrów użytkowych R31-R16, R11-R10 i rejestru SREG.
Jeśli w procedurze obsługi przerwania wykonywane są operacje na liczbach typu Single (nie zalecane!), należy zapamiętać a potem odtworzyć zawartość rejestrów R12-R15. Na przykład:
Moja_ISR:
Push R12 'zapamiętaj rejestry na stosie
Push R13
Push R14
Push R15
Single = single + 1 'używamy operacji zmiennoprzecinkowej
Pop R15 'odtwarzamy zawartość rejestrów
Pop R14
Pop R13
Pop R12
Return
Zrozumieć przerwania
By przybliżyć idee działania przerwań, można sobie wyobrazić następującą sytuację: W dość dużym domu z ogrodem jest zatrudniona osoba zajmująca się pracą w ogrodzie jak i w roli kamerdynera. Kamerdyner gdy nie ma co robić strzyże żywopłot lub pracuje w ogrodzie. Gdy ktokolwiek zadzwoni do drzwi frontowych obowiązkiem kamerdynera jest zostawienie nożyc w ogrodzie, zrzucenie ubrania roboczego i przystąpienie do obowiązków przyjmowania gości.
Gdy wszystkie grzeczności zostaną już zakończone, kamerdyner znów wraca do miejsca w którym przerwał pracę ogrodnika i zostawił nożyce.
W powyższym przykładzie (przytoczonym przez tłumacza) źródłem przerwania jest dzwonek u drzwi, a procedurą obsługi są wszystkie działania kamerdynera począwszy od usłyszenia sygnału dzwonka, a skończywszy na powrocie do pracy ogrodnika.
W przełożeniu na język BASCOM BASIC, wygenerowanie sygnału przerwania spowoduje wstrzymanie działania programu głównego, gdyż procesor przechodzi do wykonywania procedury obsługi przerwania. Po zakończeniu procedury procesor wraca do miejsca w którym zatrzymał program główny. Można na przykład stworzyć pustą pętlę DO..LOOP, która będzie przerywana, gdy na określonej końcówce pojawi się stan niski.
Najlepszym przykładem wykorzystania przerwań jest program zegara. Można zaprogramować któryś z liczników, by co 10ms generował przerwanie. Procedura jego obsługi będzie zliczać te impulsy. Naliczenie 100 impulsów oznacza, że upłynęła właśnie jedna sekunda i trzeba licznik sekund zwiększyć. Gdy przepełni się licznik sekund (>59), zwiększany będzie licznik minut, itd.
Program główny będzie się zajmował tylko obsługą klawiatury i wyświetlacza, nie zważając na to co robi procedura przerwania.
Używanie przerwań w języku BASCOM BASIC.
By używać przerwań we własnych programach należy obowiązkowo włączyć globalny system przerwań instrukcją ENABLE INTERRUPTS, oraz włączyć odpowiednie źródło przerwania. Na przykład:
Enable Timer0
spowoduje, że będą generowane przerwania przepełnienia licznika TIMER0. Instrukcją DISABLE można wyłączyć system przerwań jak i poszczególne ich źródła.
Gdy procesor stwierdzi, że wystąpiło przerwanie, skacze pod ustalony adres, umieszczony na początku pamięci FlashROM. Adresy te i powiązane z nimi źródła przerwań są zdefiniowane przez projektantów z firmy Atmel. Przeglądając plik .DAT można dowiedzieć się, o które adresy dokładnie chodzi.
Normalnie pod tymi adresami kompilator BASCOM BASIC umieszcza instrukcje RETI, więc po wygenerowaniu przerwania, nic się nie dzieje i procesor natychmiast wraca do programu głównego.
Gdy jednak w programie umieszczona będzie instrukcja ON INTERRUPT, wtedy pod odpowiednim adresem procedury obsługi przerwania zostanie umieszczony skok do podprogramu, którego adres określa podana etykieta.
Przed wykonaniem jednak zawartego pod podaną etykietą kodu, zostanie zapamiętana zawartość rejestru SREG i rejestrów użytkowych. Zostaną one później przed wykonaniem właściwej instrukcji RETURN odtworzone. Chodzi o to, by po powrocie z przerwania stan procesora był dokładnie taki sam jak tuż przed wystąpieniem przerwania. Inaczej mogłoby dojść do zakłóceń w działaniu programu głównego. Zakończyło by się to pewnie – w żargonie programistów - “pójściem w maliny” programu.
Gdy procesor jest w trakcie wykonywania procedury przerwania, następne przerwanie nie będzie przyjęte, gdyż procesor (nie kompilator!) zeruję flagę globalnego zezwolenia na przerwania. Tak samo flaga bieżącego przerwania (tego, którego procedura obsługi jest wykonywana) zostaje automatycznie wyzerowana. Po zakończeniu przerwania flaga globalnego zezwolenia jest na powrót ustawiana i procesor może przyjąć następne przerwanie.
W procesorach AVR nie jest zatem możliwe swobodne ustawienie priorytetu źródeł przerwań. Standardowo priorytet jest ustawiany według adresów programów obsługi. Dlatego przerwania o niższym adresie stoją wyżej w hierarchii (mają wyższy priorytet)!
Wskazówki dotyczące obsługi przerwań
· Gdy wykorzystano przerwania w celu generacji impulsów, np. co 10ms, należy się upewnić czy procedura obsługi będzie w stanie zakończyć się w czasie krótszym niż 10ms. Inaczej można doprowadzić do zapętlenia się przerwań!
· Polecane jest utworzenie flagi (widocznej w programie głównym), która byłaby ustawiana w trakcie działania podprogramu przerwania i zerowana przed wyjściem z procedury. Pozwala to na podanie parametru NOSAVE, co w rezultacie spowoduje mniejsze rozrastanie się stosu oraz zredukuje użytą pamięć programu. Należy jednak zadbać by zapamiętać i odtworzyć zawartość rejestrów R24 i SREG.
Zobacz także: ENABLE , DISABLE
Przykład:
Enable Interrupts
Enable Int0 'włączenie przerwania
On Int0 Label2 Nosave 'nastąpi skok do Label2 gdy wystąpi przerwanie
Do 'nieskończona pętla
Loop
End
Label2:
Dim a As Byte
If a > 1 Then
Return 'zastąpione będzie przez RET, gdyż
'jest powiązanie z instrukcja IF
End if
Return 'zostanie przetłumaczone na RETI, gdyż
'jest to pierwsza instrukcja RETURN
Return 'zostanie przetłumaczone na RET, gdyż
'jest to następna instrukcja RETURN
(c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005
Jeśli trudno to porzuć programowanie - są łatwiejsze profesje.