- Wymagane materiały:
- Co to są przerwania i gdzie ich używać:
- Schemat obwodu i wyjaśnienie:
- Symulacja przerwań w mikrokontrolerze PIC:
- Objaśnienie kodu:
- Działanie przerwań PIC16F877A:
W tym samouczku nauczymy się, jak używać zewnętrznego przerwania w mikrokontrolerze PIC i dlaczego / gdzie będziemy ich potrzebować. Jest to część sekwencji samouczków PIC, w których zaczęliśmy od podstaw uczyć się mikrokontrolerów PIC; stąd w tym samouczku założono, że wiesz, jak zaprogramować mikrokontroler PIC przy użyciu MPLABX i jak połączyć wyświetlacz LCD z PIC. Jeśli nie, wróć do odpowiednich linków i przeczytaj je, ponieważ pominę większość informacji, które zostały tam już omówione.
Wymagane materiały:
- PIC16F877A Płyta perf
- Wyświetlacz LCD 16x2
- Naciśnij przycisk
- Podłączanie przewodów
- Deska do chleba
- PicKit 3
Co to są przerwania i gdzie ich używać:
Zanim przejdziemy do programowania przerwań mikrokontrolera PIC, zrozummy, czym właściwie jest przerwanie i gdzie musielibyśmy ich użyć. Ponadto istnieje wiele rodzajów przerwań w mikrokontrolerze, a PIC16F877A ma ich około 15. Nie mylmy ich wszystkich na razie w głowie.
Więc! co to jest przerwanie w mikrokontrolerach?
Jak wszyscy wiemy, mikrokontrolery służą do wykonywania zestawu predefiniowanych (zaprogramowanych) pobudzeń, które wyzwalają niezbędne wyjścia na podstawie wejścia. Ale podczas gdy twój mikrokontroler jest zajęty wykonywaniem jednego fragmentu kodu, może wystąpić sytuacja awaryjna, w której inny fragment kodu wymaga natychmiastowej uwagi. Ten drugi fragment kodu, który wymaga natychmiastowej uwagi, należy traktować jako przerwanie.
Na przykład: weźmy pod uwagę, że grasz w swoją ulubioną grę na telefonie komórkowym, a kontroler (założenie) w telefonie jest zajęty rzucaniem całej grafiki, która jest potrzebna, abyś mógł cieszyć się grą. Ale nagle twoja dziewczyna dzwoni na twój numer. Teraz najgorsze, co może się wydarzyć, to zaniedbanie kontrolera telefonu komórkowego, ponieważ jesteś zajęty grą. Aby zapobiec wystąpieniu tego koszmaru, używamy czegoś, co nazywa się przerwaniami.
Przerwania te zawsze będą aktywnym listowaniem określonych działań, które mają się wydarzyć, a kiedy wystąpią, wykonują fragment kodu, a następnie wrócą do normalnej funkcji. Ten fragment kodu nazywany jest procedurą obsługi przerwań (ISR). Jednym z praktycznych projektów, w którym przerwanie jest obowiązkowe, jest „Obwód cyfrowego prędkościomierza i drogomierza wykorzystujący mikrokontroler PIC”
W mikrokontrolerach istnieją dwa główne typy przerwań. Są to: Przerwanie zewnętrzne i Przerwanie wewnętrzne. Przerwania wewnętrzne pojawiają się wewnątrz mikronowego sterownika w celu wykonania zadania, na przykład przerwania timera, przerwania ADC itp. Przerwania te są wyzwalane przez oprogramowanie w celu zakończenia operacji timera lub ADC odpowiednio.
Przerwanie zewnętrzne to takie, które może zostać wyzwolone przez użytkownika. W tym programie nauczymy się, jak używać przerwania zewnętrznego, używając przycisku do wywołania przerwania. Będziemy używać wyświetlacza LCD do wyświetlania liczb rosnących od 0 do 1000, a po wyzwoleniu przerwania powinniśmy powiadomić o tym z ISR procedury obsługi przerwania, a następnie kontynuować zwiększanie liczby.
Schemat obwodu i wyjaśnienie:
Schemat obwodu do wykorzystania przerwań PIC16F877 jest przedstawiony na powyższym obrazku. Musisz po prostu podłączyć LCD do PIC, tak jak to zrobiliśmy w samouczku interfejsu LCD.
Teraz, aby podłączyć pin przerwania, powinniśmy spojrzeć na arkusz danych, aby wiedzieć, który pin PIC jest używany do przerwania zewnętrznego. I w tym przypadku n PIC16F877A 33- rd kołek R BO / INT służy do zewnętrznego przerwania. Nie możesz użyć innego pinezki niż ten pin. Połączenie pinów dla tego schematu obwodu pokazano w poniższej tabeli.
S.No: |
Kod PIN |
Nazwa pinu |
Połączony z |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E z LCD |
3 |
27 |
RD4 |
D4 wyświetlacza LCD |
4 |
28 |
RD5 |
D5 wyświetlacza LCD |
5 |
29 |
RD6 |
D6 wyświetlacza LCD |
6 |
30 |
RD7 |
D7 wyświetlacza LCD |
7 |
33 |
RBO / INT |
Naciśnij przycisk |
Włączyliśmy wewnętrzne rezystory podciągające na PORCIE B, dzięki czemu możemy bezpośrednio podłączyć pin RB0 do masy za pomocą przycisku. Więc gdy ten pin stanie się LOW, zostanie wyzwolone przerwanie.
Połączenia można wykonać na płycie do chleba, jak pokazano poniżej.
Jeśli korzystałeś z naszych samouczków, powinieneś zapoznać się z tablicą wyników, której tutaj użyłem. Jeśli nie, nie musisz dużo o tym myśleć, po prostu postępuj zgodnie ze schematem obwodu, a wszystko zadziała.
Symulacja przerwań w mikrokontrolerze PIC:
Symulacja dla tego projektu jest wykonana przy użyciu programu Proteus.
Podczas symulacji projektu na wyświetlaczu LCD powinna pojawić się kolejność rosnących liczb. Dzieje się to wewnątrz głównej pętli i po każdym naciśnięciu przycisku na wyświetlaczu LCD powinien pojawić się komunikat, że został on wprowadzony do ISR. Możesz wprowadzić modyfikacje w kodzie i spróbować przetestować go tutaj.
Objaśnienie kodu:
Pełny kod tego projektu można znaleźć na końcu tego samouczka. Jednak program jest podzielony na ważne części i wyjaśniony poniżej dla lepszego zrozumienia.
Podobnie jak wszystkie programy, kod musimy rozpocząć od zdefiniowania konfiguracji pinów, których używamy w naszym programie. Również tutaj musimy zdefiniować, że używamy RB0 / INT jako zewnętrznego pinu przerwania, a nie jako pinu wejściowego lub wyjściowego. Poniższy wiersz kodu włącza wewnętrzny rezystor podciągający w porcie B, ustawiając siódmy bit na 0.
OPTION_REG = 0b00000000;
Następnie włączamy przerwania Global / Peripheral i deklarujemy, że używamy RB0 jako zewnętrznego pinu przerwania.
GIE = 1; // Włącz globalne przerwanie PEIE = 1; // Włącz przerwanie peryferyjne INTE = 1; // Włącz RB0 jako zewnętrzny pin przerwania
Gdy pin RB0 zostanie zdefiniowany jako zewnętrzny pin przerwania, za każdym razem, gdy osiągnie niski poziom, flaga INTF zewnętrznego przerwania zmieni się na 1, a kod wewnątrz funkcji przerwania void zostanie wykonany, ponieważ zostanie wywołana procedura obsługi przerwania (ISR).
nieważne przerwanie ISR_example () {if (INTF == 1) // Wykryto zewnętrzne przerwanie {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Wprowadzony ISR"); INTF = 0; // wyczyść flagę przerwania po zakończeniu __delay_ms (2000); Lcd_Clear (); }}
Jak widać, nazwałem funkcję przerwania jako ISR_example. Możesz nazwać go według własnego uznania. Wewnątrz funkcji przerwania sprawdzimy, czy flaga INTF jest wysoka i wykonamy potrzebne akcje. Bardzo ważne jest, aby wyczyścić flagę przerwania po zakończeniu procedury. Dopiero wtedy program powróci do pustej funkcji głównej. To rozliczenie musi być wykonane przez oprogramowanie korzystające z linii
INTF = 0; // wyczyść flagę przerwania po zakończeniu
Wewnątrz funkcji głównej po prostu zwiększamy liczbę co 500 ms i wyświetlamy ją na ekranie LCD. Nie mamy żadnej konkretnej linii do sprawdzenia statusu pinu RB0. Przerwanie pozostanie zawsze aktywne i po każdym naciśnięciu przycisku wyskoczy z pustego maina i wykona linie w ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Wewnątrz głównej pętli"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Number:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); liczba ++;
Działanie przerwań PIC16F877A:
Gdy zrozumiesz, jak działa przerwanie, możesz wypróbować je na sprzęcie i bawić się nim. Ten program podany tutaj jest bardzo podstawowym przykładem zewnętrznego przerwania, w którym po prostu zmienia wyświetlanie ekranu LCD po wykryciu przerwania.
Pełne działanie projektu można znaleźć na poniższym filmie Mam nadzieję, że rozumiesz o przerwach i gdzie / jak ich używać. Jeśli masz jakiekolwiek wątpliwości, możesz skontaktować się ze mną za pośrednictwem forów lub sekcji komentarzy.