Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Podobne dokumenty
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Programowanie mikrokontrolerów. 5 grudnia 2007

SYSTEM PRZERWAŃ ATmega 32

Mikroprocesory i Mikrosterowniki Liczniki Timer Counter T/C0, T/C1, T/C2

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

PROGRAMOWALNE SYSTEMY MECHATRONIKI

(Rysunek z książki T.Starecki. Mikokontrolery jednoukładowe rodziny 51. NOZOMI W-wa 1996)

Metody obsługi zdarzeń

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

AGH Akademia Górniczo- Hutnicza w Krakowie Katedra Elektroniki WIET

Przerwanie. Źródła przerwań

Programowanie mikrokontrolerów. 3 stycznia 2008

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Programowanie mikrokontrolerów. 8 listopada 2007

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Wbudowane układy peryferyjne cz. 1 Wykład 7

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Przerwania, polling, timery - wykład 9

Omówimy przykłady 8-mio bitowego licznika z wyposażenia ADuC812 (CISC 51) oraz mikrokontrolera ATMega128 należącego do rodziny AVR.

Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET

Hardware mikrokontrolera X51

Przerwania w architekturze mikrokontrolera X51

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Instytut Teleinformatyki

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

PRZERWANIA. P1 - Procedura obslugi przerwania. Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1

Instytut Teleinformatyki

ad a) Konfiguracja licznika T1 Niech nasz program składa się z dwóch fragmentów kodu: inicjacja licznika T1 pętla główna

Wbudowane układy peryferyjne cz. 2 Wykład 8

Układy czasowe / liczniki (timers/counters)

Podstawy Techniki Mikroprocesorowej Laboratorium

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania. Sterowniki Urządzeń Mechatronicznych laboratorium. Ćw. 3: Timer v1.0

Przerwania w systemie mikroprocesorowym. Obsługa urządzeo wejścia/wyjścia

Instytut Teleinformatyki

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Układy czasowo-licznikowe w systemach mikroprocesorowych

Instytut Teleinformatyki

Komunikacja w mikrokontrolerach Laboratorium

Laboratorium mikrokontrolerów

Język C. Wykład 9: Mikrokontrolery cz.2. Łukasz Gaweł Chemia C pokój 307

LOW ENERGY TIMER, BURTC

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Uproszczony schemat blokowy zespołu 8-bitowego timera przedstawiono na rys.1

Programowanie mikrokontrolerów 2.0

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

OPIS PROGRAMU USTAWIANIA NADAJNIKA TA105

Mikrokontrolery AVR Wprowadzenie

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

LABORATORIUM. TIMERY w mikrokontrolerach Atmega16-32

CW-HC08 Programowanie mikrokontrolera MC9S08QD4 [2]

KOMUNIKACJA Z OTOCZENIEM MIKROKONTROLERA

MARM. Laboratorium 1 system zegarów, porty wejścia/wyjścia. M. Suchenek

MIKROKONTROLERY I MIKROPROCESORY

Programowanie Mikrokontrolerów

2. Architektura mikrokontrolerów PIC16F8x... 13

Szkolenia specjalistyczne

Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)

Przetworniki analogowo-cyfrowe (A/C)

Instytut Teleinformatyki

Przerwania w systemie mikroprocesorowym

Schemat blokowy architektury AVR

3.2. Zegar/kalendarz z pamięcią statyczną RAM 256 x 8

SYSTEM PRZERWA Ń MCS 51

Układy czasowo-licznikowe w systemach mikroprocesorowych

ZAPRASZAMY NA NASZE AUKCJE SCIGANY81 (c) Copyright

Instytut Teleinformatyki

Programowanie mikrokontrolerów - laboratorium

INSTRUKCJA OBSŁUGI. Przekaźnik czasowy ETM ELEKTROTECH Dzierżoniów. 1. Zastosowanie

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Układy zegarowe w systemie mikroprocesorowym

DEKODER FUNKCJI SPECJALNYCH

TECHNIKA MIKROPROCESOROWA II

Instytut Teleinformatyki

Mikroprocesory i Mikrosterowniki

LabVIEW PLATFORMA EDUKACYJNA Lekcja 5 LabVIEW i Arduino konfiguracja środowiska i pierwszy program

Q3 Autonomiczny czytnik kart i zamek kodowy z kontrolerem dostępu, przyciskiem dzwonka i interfejsem Wiegand

dokument DOK wersja 1.0

Mikroprocesory i Mikrosterowniki

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Struktura i działanie jednostki centralnej

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Konfiguracja i programowanie sterownika GE Fanuc VersaMax z modelem procesu przepływów i mieszania cieczy

dv-2ps INSTRUKCJA OBSŁUGI

Mikrokontroler AVR ATmega32 - wykład 9

Synchronizowanie czasu kontrolera PACSystems do urządzeń HMI

Commander

1. Tworzenie nowego projektu.

Procesory rodziny x86. Dariusz Chaberski

A-100WP ELEKTRONICZNY WANDALOODPORNY ZEWNĘTRZNY ZAMEK SZYFROWY DO MONTAŻU NADTYNKOWEGO

Dodatek D. Układ współpracy z klawiaturą i wyświetlaczem 8279

INSTRUKCJA OBSŁUGI K3-3. Czytnik kart i zamek kodowy z kontrolerem dostępu i interfejsem Wiegand. Copyright Domster T. Szydłowski

Komputery klasy PC. Dariusz Chaberski

AGH Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Transkrypt:

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki Laboratorium mikrokontrolerów Ćwiczenie 7 Przerwania Autor: Paweł Russek Tłumaczenie: Sebastian Koryciak http://www.fpga.agh.edu.pl/tm ver. 8.06.15 1/13

1. Wprowadzenie 1.1. Cel ćwiczenia Głównym celem ćwiczenia jest przedstawienie koncepcji przerwań oraz ich programowania dla mikrokontrolerów z rodziny AVR. Na początku laboratorium zostaną przedstawione główne ich zalety. Następnie zaprezentowane zostaną dostępne źródła przerwań dla mikrokontrolera ATmega32. Później omówimy rejestry i obsługę przerwań. Szczególną uwagę zwrócono na przerwania od timerów oraz od zdarzeń zewnętrznych. W trakcie ćwiczeń student wykona proste zadania weryfikujące nabytą wiedzę i umiejętności. 1.2. Konieczne wiadomości wstępne Zaliczenie ćwiczeń laboratoryjnych 1, 2, 3, 4, 5, oraz 6. 1.3. Przygotowanie płytki ZL2AVR 2. Podstawy przerwań 2.1. Przerwania a odpytywanie Do tej pory sami musieliśmy wykonywać testy dotyczące konkretnych wydarzeń. Przykładowo aby rozstrzygnąć czy przycisk jest wciśnięty sprawdzaliśmy odpowiedni bit w rejestrze PinX. Metodę tą nazywamy odpytywaniem (ang. polling). W trakcie tej procedury mikrokontroler w trybie ciągłym monitoruje status danego urządzenia, na przykład przycisku. Odpytywanie nie jest metodą optymalną, ponieważ marnuje większość dostępnego przez procesor czasu oraz niepotrzebnie zużywa energię. Podejściem alternatywnym jest procedura przerwań. W tej metodzie urządzenia, które wymagają obsługi przez mikrokontroler informują go o tym po przez aktywowanie sygnału przerwania. Mikrokontroler po otrzymaniu takiego sygnału zatrzymuje wykonywanie rutynowych operacji i uruchamia program związany z danym przerwaniem. Program taki nazywany jest procedurą obsługi przerwania (ang. interrupt service routine (ISR)) lub "interrupt handler", czyli obsługą przerwania. W przeciwieństwie do metody odpytywania, procedura przerwań pozwala na zastosowanie priorytetów. Tym sposobem, jeżeli w danym momencie wystąpi więcej niż jedno przerwanie, jako pierwsze zostanie obsłużone o wyższym priorytecie. 2.2. Tok postępowania przy wykonywaniu przerwania Mikrokontroler po aktywowaniu przerwania: 1. dokańcza aktualnie wykonywaną instrukcję i zapisuje adres kolejnej instrukcji na stosie, 2. skacze do tablicy wektorów przerwań, która go kieruje pod adres wybranej procedury obsługi przerwania, 3. wykonuje całą procedurą obsługi przerwania, aż do ostatniej instrukcji, którą jest wyjście z obsługi przerwania (RETI). 4. Po wykonaniu instrukcji RETI mikrokontroler wraca do miejsca, w którym mu 2/13

Uwaga przerwano. Przywraca ze stosu licznik programu (PC) i od tego adresu wykonuje kolejne instrukcje. Stos spełnia bardzo krytyczną rolę w trakcie obsługi przerwania. Podczas wykonywania procedury obsługi przerwania należy zwrócić szczególną uwagę aby ilość instrukcji pop i push była taka sama. Należy również przypilnować aby każdy rejestr wykorzystywany podczas ISR był na samym początku obsługi zrzucony na stos, a pod koniec przywrócony, tak aby nie zakłócić pracy przerwanych programów. 3. Źródła przerwań dla AVR Istnieje szereg wydarzeń, które mogą automatycznie ostrzec nas, gdy tylko nastąpią. Każde źródło przerwania musi mieć swoją procedurę obsługi przerwania. W procesorach AVR dla każdego przerwania przewidziana jest lokacja w pamięci, która przechowuje adres programu ISR. Cała przestrzeń w pamięci zawierająca adresy procedur obsługi przerwań nazywana jest tablicą wektorów przerwań (ang. interrupt vector table). Poniżej znajduje się fragment tablicy wektorów przerwań dla ATmega32. Rodzaj przerwania Reset $0000 lokalizacja w EEPROM etykieta.equ External Interrupt request 0 $0002 INT0addr External Interrupt request 1 $0004 INT1addr External Interrupt request 2 $0006 INT2addr Timer/Counter2 Compare Match $0008 OC2addr Timer/Counter2 Overflow $000A OVF2addr Timer/Counter1 Capture Event $000C ICP1addr Timer/Counter1 Compare Match A $000E OC1Aaddr Timer/Counter1 Compare Match B $0010 OC1Baddr Timer/Counter1 Overflow $0012 OVF1addr Timer/Counter0 Compare Match $0014 OC0addr Timer/Counter0 Overflow $0016 OVF0addr Kod poniżej przedstawia typowe i najczęściej spotykane ustawienie dla obsługi Resetu i wybranych adresów wektorów przerwań dla ATmega32. Zawarta w nim jest obsługa następujących przerwań: External Interrupt request 0, Timer/Counter0 Compare Match, oraz Timer/Counter0 Overflow. Obsługa innych w danym momencie wymaganych przerwań również może zostać dodana zgodnie z nazwami w powyższej tabeli. 3/13

Example..include "m32def.inc".org 0 jmp reset.org INT0addr ; External Interrupt Request 0.org OC0addr jmp external_interrupt_0 jmp timer0_compare_match.org OVF0addr reset: jmp timer0_overflow ldi r16,high(ramend) out SPH,r16 ldi r16,low(ramend) out SPL,r16 ;... some code external_interrupt_0: ;... some code reti timer0_compare_match ;... some code reti timer0_overflow: ;... some code reti ; Timer/Counter0 Compare Match ; Timer/Counter0 Overflow ; Main program start ; Set Stack Pointer to top of RAM 4. Globalne włączanie i wyłączanie przerwań Wszystkie przerwania mogą zostać dezaktywowane (wyłączone). Oznacza to, że mikrokontroler na nie nie zareaguje. Przerwania muszą być aktywowane (włączone) w oprogramowaniu. Bit D7 w rejestrze statusowym (sreg) jest odpowiedzialny za globalne włączanie i wyłączanie przerwań. Bit ten nazywa się interrupt bit i. W diagramie poniżej przedstawiono bity rejestru statusowego. Bit 7 6 5 4 3 2 1 0 sreg i 4/13

4.1. Instrukcja Set interrupts (sei) Ustawia flagę Global Interrupt (i) w sreg (rejestr statusowy). Instrukcja następująca po sei będzie wykonana przed jakimkolwiek oczekującym przerwaniem. sei ; set global interrupt enable 4.2. Instrukcja Clear interrupts (cli) Zeruje flagę Global Interrupt (i) w sreg (rejestr statusowy). Przerwania zostaną natychmiast wyłączone. Żadne przerwanie po instrukcji cli nie zostanie obsłużone, nawet jeżeli wystąpi jednocześnie z nią. Pojedynczą instrukcją cli możemy zabezpieczyć naszą krytyczną część kodu przed przerwaniem. cli ; disable all interrupts 4.3. Instrukcja Sleep (sleep) Instrukcja ta pozwala na uśpienie procesora. sleep ; put MCU in sleep mode Example: sei ; set global interrupt enable sleep ; enter sleep, waiting for interrupt 5. Przerwania od Timera W ćwiczeniu 6 poznaliśmy zasady posługiwania się timerem 0 i timerem 1 za pomocą procedury odpytywania. Przykładowo możemy sprawdzać bit tov0 poprzez instrukcję sbrs aby monitorować przepełnienie timera 0. Podobnie możemy sprawdzać bit ocf0 aby stwierdzić wystąpienie zgodności z wartością porównywaną dla timera 0 (ang. compare match). Metody te w dużym stopniu ograniczają możliwości obliczeniowe naszego mikrokontrolera. Z wykorzystaniem przerwań od timerów możemy znieść te ograniczenia. Aby włączyć przerwanie od przepełnienia timera, bit timer overflow interrupt enable (toien) w rejestrze timer interrupt mask (timsk) musi być ustawiony. Włączenie przerwania od wystąpienia zgodności z wartością porównywaną dla timera następuje poprzez ustawienie bitu output compare match interrupt enable (ocien) w rejestrze timsk. Example ldi r20, (1<<toie0) out timsk, r20 ;enable Timer0 overflow interrupt 5/13

5.1. Rejestr Timer interrupt mask (timsk) Bit 7 6 5 4 3 2 1 0 timsk ocie2 toie2 ocie1a ocie1b toie1 ocie0 toie0 ocie2 D7 Timer/Counter2 Output Compare Match Interrupt Enable toie2 D6 Timer/Counter2 Overflow Interrupt Enable ocie1a D4 Timer/Counter1, Output Compare A Match Interrupt Enable ocie1b D3 Timer/Counter1, Output Compare B Match Interrupt Enable toie1 D2 Timer/Counter1, Overflow Interrupt Enable ocie0 D1 Timer/Counter0 Output Compare Match Interrupt Enable toie0 D0 Timer/Counter0 Overflow Interrupt Enable Zadanie 7.1 Uwzględniając fakt, że procesor ATmega jest taktowany przez zegar 1MHz oraz wykorzystując Timer1 napisz i uruchom program, który będzie migał diodą LED co sekundę. Wykorzystaj przerwanie od compare match w timerze 1. Podpowiedź: Użyj programu timer1_1sec.asm z ćwiczenia 6 jako bazę do budowy nowego rozwiązania. Gdy skończysz zapisz program pod nazwą timer1_1sec_int.asm. Zadanie 7.2 Napisz program zliczający ilość wciśnięć przycisku. W tym zadaniu należy zaproponować rozwiązanie eliminatora drgań ze styków przycisku (ang. debouncer). Wskazówki. 1. Użyj przerwania od timera 0 do odczytu stanu przycisku co 5ms. 2. W procedurze obsługi przerwania skopiuj stan przycisku do rejestru ogólnego przeznaczenia. Użyj tego rejestru w głównej pętli programu do analizy aktualnego stanu na styku z przyciskiem. 3. Aby brać pod uwagę jedynie pojedyncze wciśnięcia przycisku wykrywaj w programie moment jego wciśnięcia ale poczekaj na jego zwolnienie ze wznowieniem procedury. 6. Przerwania od zdarzeń zewnętrznych W procesorze ATmega32 występują trzy sprzętowe przerwania od zdarzeń zewnętrznych: Int0, Int1 i Int2. Znajdują się one na wybranych pinach portów. Przerwania te muszą zostać aktywowane zanim będą mogły zostać wykorzystane. Do tego celu wykorzystuje się bit intn zlokalizowany w rejestrze gicr. 6/13

Ext. interrupt Pin location Int. vector location Enable bit location Int0 Port D.2 $0002 gicr.6 Int1 Port D.3 $0004 gicr.7 Int2 Port B.2 $0006 gicr.5 Example ldi r20, (1<<int0) ;enable external interrupt 0 out gicr, r20 6.1. Rejestr General Interrupt Control (gicr) Przerwania zewnętrzne można włączać niezależnie przy pomocy bitów w rejestrze General Interrupt Control (gicr). Bit 7 6 5 4 3 2 1 0 gicr int1 Int0 int2 int1 D7 =0 disabled external interrupt 1 =1 enables external interrupt 1 int0 D6 =0 disabled external interrupt 0 =1 enables external interrupt 0 int2 D5 =0 disabled external interrupt 2 =1 enables external interrupt 2 Bity te wraz z bitem i z rejestru sreg muszą być ustawione na poziom wysoki aby mikrokontroler zareagował na przerwania. 6.2. Przerwania wyzwalane zboczem a poziomem Int2 jest jedynym przerwaniem wyzwalanym zboczem, podczas gdy Int0 i Int1 mogą zostać zaprogramowane do wyzwalania zboczem bądź poziomem. W przypadku trybu wyzwalania przerwania poziomem, jeżeli chcemy aby procedura ISR była uruchamiana tylko raz, pin odpowiedzialny za przerwanie musi być dezaktywowany zanim zastanie wykonana instrukcja reti. Zaraz po resecie procesora przerwania Int0 i Int1 pracują w trybie wyzwalania poziomem niskim. Jeżeli chcemy zmienić tryb wyzwalania musimy zaprogramować odpowiednie bity Interrupt Sense Control (isc) w rejestrze mcucr. Bit 7 6 5 4 3 2 1 0 mcucr isc11 isc10 isc01 isc00 7/13

Bity Isc01 i isc00 są odpowiedzialne za tryb wyzwalania dla przerwania Int0. isc01 isc00 Description 0 0 Low-level of Int0 pin 0 1 Any logical change on Int0 pin 1 0 Falling edge of Int0 pin 1 1 Rising edge of Int0 pin Bity Isc11 i isc10 są odpowiedzialne za tryb wyzwalania dla przerwania Int1. isc11 isc10 Description 0 0 Low-level of Int1 pin 0 1 Any logical change on Int1 pin 1 0 Falling edge of Int1 pin 1 1 Rising edge of Int1 pin Bit Isc2 w rejestrze mcucsr określa czy przerwanie Int2 będzie aktywowane zboczem narastającym czy opadającym. Bit 7 6 5 4 3 2 1 0 mcucsr isc2 isc2 Description 0 Falling edge of Int2 pin 1 Rising edge of Int2 pin Example ;make Int0 rising-edge active ldi r20, (1<<isc01) (1<<isc00) out mcucr, r20 6.3. Rejestr General Interrupt Flag (gifr) Rejestr gifr zawiera flagi wszystkich zewnętrznych zdarzeń dla procesora ATMega. Każdy z tych bitów jest niezależnie ustawiany na poziom wysoki w momencie kiedy nastąpi dane zdarzenie związane z przerwaniem. Należy zwrócić uwagę, że bity te są ustawiane niezależnie 8/13

od tego czy zostały aktywowane. Aby anulować wszystkie wcześniejsze zewnętrzne wydarzenia należy wyzerować wszystkie flagi w momencie włączania przerwań. Bit 7 6 5 4 3 2 1 0 gifr intf1 intf0 intf2 Bity intf0, intf1, i intf2 są ustawiane w momencie wystąpienia danego przerwania. Flagi te są automatycznie zerowane zaraz po uruchomieniu danej procedury obsługi przerwania. Mogą one zostać również wyzerowane przez nas ręcznie poprzez ustawienie bitów w rejestrze gifr. Example ;clear intf1 flag ldi r20, (1<<intf1) out gifr, r20 7. Kolejne podejście do klawiatura ZL3AVR Do tej pory w ćwiczeniach używaliśmy klawiatury ZL2AVR w trybie wersji małej (zwarta zworka JP3). Nadszedł czas aby wykorzystać naszą klawiaturę w pełni. Chcemy być w stanie odczytać wszystkie 16 przycisków. W tym celu musimy stworzyć specjalną procedurę, która uwzględni podłączenie przycisków w charakterze matrycy 4x4. Aby zdekodować który przycisk został wciśnięty musimy ustalić jednocześnie, która kolumna i który wiersz zostały aktywowane poprzez klawiaturę. Do odczytu która kolumna jest aktywna musimy ustawić linie wierszy (W1..W4) jako wyjścia, a linie kolumn (K1..K4) jako wejścia. Ustawiamy niski poziom na liniach wierszy i odczytujemy linie kolumn. Aktywną kolumnę odczytamy z niskim stanem. Do odczytu który wiersz jest aktywny musimy ustawić linie kolumn (K1..K4) jako wyjścia, a linie wierszy (W1..W4) jako wejścia. Ustawiamy niski poziom na liniach kolumn i odczytujemy linie wierszy. Aktywny wiersz odczytamy z niskim stanem. Następnie na podstawie odczytanych współrzędnych określamy wciśnięty przycisk. Dodatkowo klawiatura jest w stanie wygenerować sygnał logiczny w momencie wciśnięcia któregokolwiek przycisku. Sygnał ten może nam posłużyć jako zewnętrzne przerwanie. Jeżeli linie wierszy (W1..W4) są ustawione jako wyjścia oraz mają stan niski, na JP13 wystąpi niski poziom logiczny w momencie naciśnięcia któregokolwiek przycisku. 9/13

Zadanie 7.3 Napisz program, który wskaże który przycisk z klawiatury został wciśnięty. Wykorzystaj przerwanie od zdarzenia zewnętrznego aby uruchomić procedurę dekodowania. Wyświetl kod wciśniętego przycisku na diodach LED. Aby uprościć program można założyć, że kod przycisku będzie składał się z kodu wiersza na wyższych 4 bitach, oraz kodu kolumny na 4 niższych bitach. Jako kody wierszy i kolumn można wykorzystać odwrotność kodowania 1 z N (pozycja 0 determinuje zakodowaną wartość). 7.. 4 3.. 0 Column code (one cold) Row code (one cold) Row no. Code Column no. Code 1 '0111' 1 '0111' 2 '1011' 2 '1011' 3 '1101' 3 '1101' 4 '1110' 4 '1110' Podłącz diody LED do portu A, a klawiaturę do portu D. Port A.0=D0 Port A.1=D1 Port A.2=D2 Port A.3=D3 Port A.4=D4 Port D.0=K4 Port D.1=K3 Port D.2=K2 Port D.3=K1 Port D.4=W4 10/13

Port A.5=D5 Port A.6=D6 Port A.7=D7 Port D.5=W3 Port D.6=W2 Port D.7=W1 Użyj zewnętrznego przerwania Int2 do uruchomienia procedury dekodowania klawiatury. Upewnij się, czy jako źródło zegarowe dla procesora ATmega wybrany jest wewnętrzny oscylator zaprogramowany na częstotliwość 1MHz. Poniżej przedstawioną propozycję ułożenia kodu programu dla tego zadania..include"m32def.inc".cseg.org 0 jmp start.org INT2addr jmp keypad_isr ;Keyoad External Interrupt Request 2.def button_code=r20 ; Main program start start: ; Set Stack Pointer to top of RAM ;Set up port A as output for LED controls ; Clear intf2 flag ldi r16, out gifr, r16 ; Enable Int2 ldi r16, out gicr, r16 ; Set Int2 active on falling edge ldi r16, out mcucr, r16 ;Set rows as inputs and columns as outputs ;Set rows to high (pull ups) and columns to low to activate JP13 11/13

;Global Enable Interrupt ;Set up infinite loop loop: ;read button code from r20 and send to port A rjmp loop ;Keypad Interrupt Service Routine keypad_isr: ;Disable interrupts ;Store registers that are to be used in ISR on stack ;Set rows as outputs and columns as inputs on Port D ;Set rows to low and columns to high (pull up) on Port D ;Read Port D. Column code in lower nibble nop ;!!!! ;Store column code to r20 on lower nibble ;Set rows as inputs and columns as outputs on Port D ;Set rows to high (pull up) and columns to low on Port D ;Read Port D. Row code in higher nibble nop ;!!!!! in r16, ;Store row code to r20 on higher nibble 12/13

;Set rows as inputs and columns as outputs ;Set rows to high and columns to low to activate JP13 Clear intf2 flag ldi r16, out gifr, r16 ;Restore registers from stack (in opposite order) pop pop ;Enable interrupts globally reti 13/13