- Dlaczego potrzebujemy przerwania?
- Rodzaje przerwań w MSP430
- Przerwanie kontroli programu w MSP430
- Obwód MSP430 do testowania przerwania GPIO
- Programowanie MSP430 na przerwania
- Przesyłanie programu do MSP430 z CCS
- Program przerwania na MSP430
Rozważ prosty zegarek cyfrowy zaprogramowany tak, aby pokazywał tylko czas, a teraz wyobraź sobie, że chcesz zmienić jego strefę czasową. Co byś zrobił? Wystarczy nacisnąć przycisk, który zmienia się w menu, które umożliwia zmianę strefy czasowej. W tym przypadku system nie może przewidzieć twojego zewnętrznego przerwania dla procesów utrzymujących czas i nie może poprosić cię o czekanie, ponieważ jest zajęty zwiększaniem wartości sekund na zegarku. Tutaj przydają się przerwania.
Przerwania nie zawsze muszą być zewnętrzne; może być również wewnętrzny. W większości przypadków przerwanie wbudowane ułatwia również komunikację między dwoma urządzeniami peryferyjnymi procesora. Rozważmy, że wstępnie ustawiony zegar jest resetowany i przerywanie jest wyzwalane, gdy czas osiągnie wartość w rejestrze timera. Obsługa przerwań może być używana do inicjowania innych urządzeń peryferyjnych, takich jak DMA.
W tym samouczku użyliśmy zewnętrznych przerwań na MSP430 do przełączania różnych diod LED. Kiedy zewnętrzne przerwanie jest podawane przez zmianę stanu za pomocą przycisku, sterowanie jest przenoszone (z wyprzedzeniem) do ISR i robi to samo. Aby poznać podstawy, takie jak konfiguracja środowiska CCS dla startera MSP430G2, skorzystaj z tego łącza, aby rozpocząć pracę z MSP430 przy użyciu CCS, ponieważ nie będziemy wchodzić w szczegóły tego w tym samouczku. Sprawdź także inne samouczki oparte na MSP430 przy użyciu Energia IDE i CCS, klikając łącze.
Dlaczego potrzebujemy przerwania?
Przerwania są potrzebne do zaoszczędzenia narzutu związanego z odpytywaniem w systemie wbudowanym. Są one wywoływane, gdy zadania o wyższym priorytecie muszą zostać wykonane przez uprzedzenie aktualnie uruchomionego zadania. Może być również używany do wybudzania procesora z trybów niskiego zużycia energii. Kiedy jest budzony przez przejście zbocza sygnału zewnętrznego przez port GPIO, ISR jest wykonywany, a procesor ponownie powraca do trybu niskiego zużycia energii.
Rodzaje przerwań w MSP430
Do przerwania w MSP430 się pod następującym types-
- Reset systemu
- Niemaskowalne przerwanie
- Maskable Interrupt
- Przerwania wektorowe i bez wektorów
Reset systemu:
Może wystąpić z powodu napięcia zasilania (Vcc) i z powodu niskiego sygnału na pinie RST / NMI z wybranym trybem resetowania, a także może wystąpić z przyczyn takich jak przepełnienie timera watchdog i naruszenie klucza bezpieczeństwa.
Niemaskowalne przerwanie:
Te przerwania nie mogą być maskowane przez instrukcje procesora. Po włączeniu przerwania ogólnego przerwanie niemaskowalne nie może zostać skierowane do przetwarzania. Jest to generowane przez źródła takie jak usterki oscylatora i krawędź ręcznie przekazana do RST / NMI (w trybie NMI).
Maskowalne przerwanie:
Kiedy pojawia się przerwanie i jeśli można je zamaskować instrukcją CPU, jest to przerwanie maskowalne. Nie zawsze muszą być zewnętrzne. Zależą również od urządzeń peryferyjnych i ich funkcji. Zastosowane tutaj przerwania portu zewnętrznego należą do tej kategorii.
Przerwania wektorowe i nie wektorowe:
Vectored: W tym przypadku urządzenia, które przerywają, dostarczają nam źródło przerwania, przekazując adres wektora przerwania. Tutaj adres ISR jest ustalony i sterowanie jest przekazywane na ten adres, a ISR zajmuje się resztą.
Non-Vectored: Tutaj wszystkie przerwania mają wspólny ISR. Gdy przerwanie występuje ze źródła niewektorowanego, sterowanie jest przekazywane na wspólny adres, do którego są współdzielone wszystkie przerwania niewektorowane.
Przerwanie kontroli programu w MSP430
Kiedy wystąpi przerwanie, MCLK jest włączany i CPU jest wywoływany z powrotem ze stanu OFF. Ponieważ sterowanie programem jest przenoszone na adres ISR po wystąpieniu przerwania, wartości w liczniku programu i rejestrze stanu są przenoszone na stos.
Po kolei rejestr statusu jest czyszczony, tym samym usuwając GIE i kończąc tryb niskiego poboru mocy. Przerwanie o najwyższym priorytecie jest wybierane i wykonywane przez umieszczenie adresu wektora przerwania w liczniku programu. Zanim przejdziemy do naszego przykładowego kodu przerwania GPIO MSP430, ważne jest, aby zrozumieć działanie rejestrów portów związanych z tym kodem.
Rejestry portów do sterowania GPIO na MSP430:
PxDIR: Jest to rejestr sterujący kierunkiem portu. Pozwala programiście na konkretny wybór swojej funkcji poprzez wpisanie 0 lub 1. Jeśli pin jest wybrany jako 1, wtedy działa jako wyjście. Rozważmy port 1 jako port 8-bitowy, a jeśli piny 2 i 3 mają być przypisane jako porty wyjściowe, to rejestr P1DIR należy ustawić na wartość 0x0C.
PxIN: Jest to rejestr tylko do odczytu i przy użyciu tego rejestru można odczytać bieżące wartości w porcie.
PxOUT: Ten konkretny rejestr może służyć do bezpośredniego zapisywania wartości do portów. Jest to możliwe tylko wtedy, gdy rejestr pullup / pulldown jest wyłączony.
PxREN: Jest to 8-bitowy rejestr używany do włączania lub wyłączania rejestru pullup / pulldown. Gdy pin jest ustawiony jako 1 w obu rejestrach PxREN i PxOUT, to określony pin jest wyciągany.
PxDIR |
PxREN |
PxOUT |
Konfiguracja we / wy |
0 |
0 |
X |
Wejście z wyłączonymi rezystorami |
0 |
1 |
0 |
Wejście z włączonym wewnętrznym rozwijaniem |
0 |
1 |
1 |
Wejście z włączonym wewnętrznym podciąganiem |
1 |
X |
X |
Wyjście - PxREN nie działa |
PxSEL i PxSEL2: Ponieważ wszystkie piny w MSP430 są multipleksowane, przed użyciem należy wybrać określoną funkcję. Gdy oba rejestry PxSEL i PxSEL2 są ustawione na 0 dla określonego pinu, wówczas wybierane jest We / Wy ogólnego przeznaczenia. Gdy PxSEL jest ustawiony na 1, wybierana jest podstawowa funkcja peryferyjna i tak dalej.
PxIE: Włącza lub wyłącza przerwania dla określonego pinu w porcie x.
PxIES: Wybiera krawędź, przy której generowane jest przerwanie. Dla 0 wybiera się zbocze narastające, a dla 1 zbocze opadające.
Obwód MSP430 do testowania przerwania GPIO
Obwód MSP430 używany do testowania naszego przykładowego kodu przerwania MSP430 pokazano poniżej.
Uziemienie płytki służy do uziemienia zarówno diody LED, jak i przycisku. Znajdujące się po przekątnej boki przycisku są normalnie otwartymi zaciskami i łączą się, gdy przycisk jest wciśnięty. Rezystor jest podłączony przed diodą LED, aby uniknąć dużego zużycia prądu przez diodę LED. Zwykle stosowane są rezystory o niskiej wartości w zakresie 100 - 220 omów.
Używamy 3 różnych kodów, aby lepiej zrozumieć przerwania portu. Pierwsze dwa kody używają tego samego obwodu, co na schemacie obwodu 1. Zanurzmy się w kodzie. Po wykonaniu połączeń moja konfiguracja wygląda następująco.
Programowanie MSP430 na przerwania
Pełny program przerywający MSP430 można znaleźć na dole tej strony, a wyjaśnienie kodu jest następujące.
Poniższy wiersz zatrzymuje działanie timera watchdog. Zegar kontrolny zwykle wykonuje dwie operacje. Jednym z nich jest ochrona kontrolera przed nieskończonymi pętlami poprzez resetowanie kontrolera, a drugim jest to, że wyzwala on okresowe zdarzenia za pomocą wbudowanego zegara. Kiedy mikrokontroler jest resetowany (lub włączany), znajduje się w trybie timera i ma tendencję do resetowania MCU po 32 milisekundach. Ta linia zatrzymuje kontroler przed zrobieniem tego.
WDTCTL = WDTPW + WDTHOLD;
Ustawienie rejestru P1DIR na wartość 0x07 ustawia kierunek pin0, pin1 i pin2 jako wyjście. Ustawienie P1OUT na 0x30 konfiguruje wejście z wewnętrznymi rezystorami pullup włączonymi na pin4 i pin5. Ustawienie P1REN na 0x30 włącza wewnętrzne podciąganie na tych kołkach. P1IE włącza przerwanie, gdzie P1IES wybiera przejście z wysokiego na niskie jako krawędź przerwania na tych pinach.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Następna linia włącza tryb niskiego poboru mocy i włącza GIE w rejestrze stanu, aby można było odbierać przerwania.
__bis_SR_register (LPM4bits + GIE)
Licznik programu jest ustawiany adresem wektora portu 1 za pomocą makra.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Poniższy kod przełącza kolejno każdą z diod LED podłączonych do pin0, pin1, pin2.
if (liczba% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; liczyć ++; } else if (liczba% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; liczyć ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; liczyć ++; }
Schemat obwodu 2:
Podobnie, wypróbujmy inny pin, aby lepiej zrozumieć koncepcję. Więc tutaj przycisk jest podłączony do pinu 2.0 zamiast pinu 1.5. zmodyfikowany obwód jest następujący. Ponownie obwód ten jest używany do testowania programu przerywania przyciskiem MSP430.
Tutaj port 2 jest używany do wprowadzania danych. Trzeba więc użyć innego wektora przerwań. P1.4 i P2.0 przyjmują wejścia.
Ponieważ port 2 jest używany tylko dla wejścia, P2DIR jest ustawiony na 0. Aby ustawić pin0 portu 2 jako wejście z włączonymi wewnętrznymi rezystorami podciągającymi, rejestry P2OUT i P2REN muszą być ustawione na wartość 1. Aby włączyć przerwania na pin0 portu 2, a także w celu wybrania krawędzi przerwania, P2IE i P2IES są ustawiane na wartość 1. Aby zresetować flagę w porcie 2, P2IFG jest wyczyszczone, aby flaga mogła być ponownie ustawiona na wystąpienie przerwania.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Gdy źródło przerwań pochodzi z portu 1, to dioda LED podłączona do styku 1 portu 1 świeci. Gdy źródło przerwań należy do portu 2, to dioda LED podłączona do styku 2 portu 1 świeci.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; dla (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; dla (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Przesyłanie programu do MSP430 z CCS
Aby załadować projekt do startera i debugować go, wybierz projekt i kliknij ikonę debugowania na pasku narzędzi. Alternatywnie naciśnij klawisz F11 lub kliknij opcję RunàDebug, aby przejść do trybu debugowania.
Po wejściu w tryb debugowania naciśnij zielony przycisk uruchamiania, aby swobodnie uruchomić załadowany kod w MCU. Teraz, gdy przycisk jest wciśnięty, zmiana zbocza wyzwalane jest przerwanie, co powoduje zmianę stanu diody LED.
Program przerwania na MSP430
Po pomyślnym przesłaniu kodu możemy go przetestować, używając po prostu przycisku. Wzór diod LED zmieni się zgodnie z naszym programem po każdym przerwaniu za pomocą przycisku.
Pełną pracę można znaleźć w poniższym filmie wideo. Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się czegoś przydatnego. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy lub skorzystaj z naszych forów, aby uzyskać odpowiedzi na inne pytania techniczne.