PROCESORY SYGNAŁOWE - LABORATORIUM. Ćwiczenie nr 02. Programowanie układu kontroli przerwań do obsługi układu licznika

Podobne dokumenty
PROCESORY SYGNAŁOWE - LABORATORIUM. Ćwiczenie nr 03

Metody obsługi zdarzeń

Przerwania, polling, timery - wykład 9

Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej. Instrukcja do zajęć laboratoryjnych z przedmiotu:

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

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Mikroprocesor Operacje wejścia / wyjścia

Wykład PASCAL - Pliki tekstowe

Organizacja typowego mikroprocesora

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej. Instrukcja do zajęć laboratoryjnych z przedmiotu:

Mechanizmy pracy równoległej. Jarosław Kuchta

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

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

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Kurs Podstawowy S7. Spis treści. Dzień 1

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Mechanizm przerwań i menadżer zdarzeń procesora sygnałowego F/C240

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Przetwornik ADC procesora sygnałowego F/C240 i DAC C240 EVM

Podstawy programowania skrót z wykładów:

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

Pomoc dla użytkowników systemu asix 6. Strategia buforowa

Kompilator języka C na procesor 8051 RC51 implementacja

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

Aplikacja Sieciowa wątki po stronie klienta

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Mikrokontroler ATmega32. Język symboliczny

asix5 Podręcznik użytkownika Strategia buforowa

Wykład 2 Składnia języka C# (cz. 1)

asix4 Podręcznik użytkownika DMS500 - drajwer protokołu analizatorów DURAG DMS 500 Podręcznik użytkownika

Podstawy Programowania C++

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

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

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Programowanie mikrokontrolerów - laboratorium

2. Code Composer Studio v4 zintegrowane środowisko projektowe... 41

TRX API opis funkcji interfejsu

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

asix4 Podręcznik użytkownika CtMus04 - drajwer do wymiany danych z urządzeniami sterującymi MUS-04 firmy ELEKTORMETAL S.A.

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

Instytut Teleinformatyki

Rok akademicki: 2013/2014 Kod: JFT s Punkty ECTS: 5. Poziom studiów: Studia I stopnia Forma i tryb studiów: Stacjonarne

UKŁAD EDMA I MODULACJA AMPLITUDOWA

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Hardware mikrokontrolera X51

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Technika mikroprocesorowa. Konsola do gier

Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

MIKROKONTROLERY I MIKROPROCESORY

PMiK Programowanie Mikrokontrolera 8051

Spis treści. 1 Moduł Modbus TCP 4

Kurs SIMATIC S7-300/400 i TIA Portal - Podstawowy. Spis treści. Dzień 1. I System SIEMENS SIMATIC S7 - wprowadzenie (wersja 1503)

Kurs Zaawansowany S7. Spis treści. Dzień 1

Wstęp. do języka C na procesor (kompilator RC51)

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy Informatyki Układ przerwań

MIKROPROCESORY architektura i programowanie

Start Bity Bit Stop 1 Bit Par Rys. 1

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Szkolenia specjalistyczne

Spis treści. Dzień 1. I Konfiguracja sterownika (wersja 1410) II Edycja programu (wersja 1406) III Środowisko TIA Portal (wersja 1410)

Wstępdo assemblera MA51

Instytut Teleinformatyki

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Język C++ zajęcia nr 2

Język C++ Różnice między C a C++

PLC1: Programowanie sterowników logicznych SIEMENS SIMATIC S7-300/400 - kurs podstawowy

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

2. Architektura mikrokontrolerów PIC16F8x... 13

Język FBD w systemie Concept

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Pliki. Operacje na plikach w Pascalu

Instrukcja do ćwiczeń

Instrukcja użytkownika

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Wykład 3 Składnia języka C# (cz. 2)

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Temat: Projektowanie i badanie liczników synchronicznych i asynchronicznych. Wstęp:

Materiały dodatkowe Krótka charakterystyka protokołu MODBUS

Rozdział ten zawiera informacje na temat zarządzania Modułem Modbus TCP oraz jego konfiguracji.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Obługa czujników do robota śledzącego linie. Michał Wendland czerwca 2011

Klient-Serwer Komunikacja przy pomocy gniazd

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Wprowadzenie do projektu QualitySpy

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Transkrypt:

PROCESORY SYGNAŁOWE - LABORATORIUM Ćwiczenie nr 02 Programowanie układu kontroli przerwań do obsługi układu licznika 1. Konfiguracja układu kontroli przerwań. Zadaniem układu kontroli przerwań jest skalowalna i asynchroniczna obsługa urządzeń współpracujących z układem mikroprocesorowym (do tej grupy nie zalicza się pamięci procesora). To urządzenie, zgłaszając przerwanie, wyzwala reakcję procesora. Każdy układ kontroli przerwań umożliwia: przypisanie urządzeń do dostępnych przerwań, ustalenie priorytetu obsługi urządzeń (ustalenie kolejności, w jakiej będą obsługiwane urządzenia, gdy zgłoszą przerwanie jednocześnie), definicję funkcji obsługi przerwania (określenie sekwencji instrukcji, która ma zostać wykonana w momencie zgłoszenia przerwania), zdefiniowanie, które przerwania będą w danej chwili obsługiwane, a które nie (maskowanie przerwań). Do konfiguracji układu kontroli przerwań zostanie wykorzystana biblioteka CSL (ang. Chip Support Library) opracowana przez firmę Texas Instruments. Zanim użyje się jakiejkolwiek funkcji z tej biblioteki, należy wywołać funkcję CSL_init(), która inicjalizuje wewnętrzny stan biblioteki (statyczne zmienne wykorzystywane w bibliotece). Do konfiguracji układu kontroli przerwań konieczne są następujące funkcje zadeklarowane w pliku nagłówkowym csl_irq.h: IRQ_clear IRQ_config IRQ_configArgs IRQ_disable IRQ_enable IRQ_globalDisable IRQ_globalEnable IRQ_globalRestore IRQ_reset IRQ_restore

IRQ_setVecs IRQ_test Opis każdej z tych funkcji można znaleźć w dokumentacji dostępnej na stronie internetowej laboratorium (TMS320C6000 Chip Support Library API Reference Guide). Przygotowując się do laboratorium, należy opracować opis funkcji służących do konfiguracji układu kontroli przerwań, użytych w projekcie Scheduler (plik scheduler.zip do pobrania ze strony laboratorium DSP). Funkcje te są wywołane w modułach main.c i timer.c. Opis powinien być sporządzony według podanego poniżej wzoru i okazany w formie odręcznej notatki lub wydruku na początku zajęć. Wzór opisu. void IRQ_clear( Uint32 EventId) Lista argumentów. Nazwa argumentu- EventId. Typ argumentu- Uint32. Opisu argumentu- identyfikator zdarzenia. Zwracana wartość. Funkcja nie zwraca żadnej wartości. Opis funkcji. Zeruje flagę przerwania dla danego zdarzenia w rejestrze IFR procesora. Jeżeli zdarzenie nie jest przypisane do żadnego numeru przerwania, funkcja nie wykonuje żadnej akcji. Konfiguracja układu kontroli przerwań składa się z następujących etapów: stworzenie tablicy wektorów przerwań (16 elementowej tablicy zawierającej pakiety ośmiu instrukcji wczytywane w momencie wywołania danego przerwania) i przypisanie jej adresu do rejestru ISTP układu kontroli przerwań, przypisanie numeru przerwania do zdarzenia pochodzącego od obsługiwanego urządzenia (mapowanie przerwania), zezwolenie na obsługę wybranych przerwań (maskowanie przerwań).

Etap pierwszy W etapie pierwszym w pliku z rozszerzeniem *.asm definiuje się symbole globalne związane z funkcjami obsługi przerwań jak i samej tablicy wektorów przerwań. Definicja symboli globalnych odbywa się z wykorzystaniem słowa kluczowego global. Na przykład:.global _vectors,.global _przerwanie definiuje symbole globalne, które mogą być użyte jako nazwy funkcji lub zmiennych w modułach napisanych w języku C. Znak podkreślenia na początku symbolu jest charakterystyczny dla symboli deklarowanych w modułach napisanych w języku C. Na przykład: void vectors() void przerwanie() Symbol global może być użyty do odwołania się do funkcji i zmiennych zdefiniowanych w języku C lub zadeklarowania, że etykieta zdefiniowana w module *.asm będzie używana poza tym modułem. W projekcie Schedular w module IRQ.asm zadeklarowano trzy symbole jako globalne: _c_int00, _IRQ_service i _timer_int. _c_int00 jest nazwą funkcji obsługi przerwania od sygnału RESET zdefiniowaną w bibliotece rts_6700.lib dołączanej do każdego projektu. _IRQ_service jest symbolem zdefiniowanym w pliku IRQ.asm jako początek tablicy wektorów przerwań. W pliku main.c odwołano się do tego symbolu deklarując funkcję o nazwie IRQ_service. W main.c znajduje się tylko deklaracja tej funkcji, ponieważ jej sens określony jest w module IRQ.asm jako początek tablicy wektorów przerwań. Adres tej funkcji jest wpisywany do rejestru ISTP procesora za pomocą funkcji IRQ_setVecs(). Symbol _timer_int jest odwołaniem się do funkcji timer_int() zdefiniowanej w module timer.c. Funkcja ta jest funkcją obsługi przerwania od licznika i steruje taktowaniem programowych liczników zdefiniowanych strukturą SOFTTIMER. Symbolu _timer_int użyto w module IRQ.asm do wykonania skoku z pakietu instrukcji obsługującego przerwanie 14 do funkcji obsługi przerwania timer_int(). Aby skrócić zapis definicji tablicy wektorów przerwań (_IRQ_service) w pliku IRQ.asm stworzono asemblerową makrodefinicję VEC_ENTRY, która umożliwia efektywne wykonanie skoku do funkcji obsługi przerwania. Za pomocą instrukcji stw b0,*--b15 zapisano stan rejestru b0 na stosie (rejestr b15 jest przez środowisko uruchomieniowe języka C używany jako wskaźnik stosu). Do tego rejestru przypisywany jest adres, pod który ma być wykonany

skok. Następnie wywoływana jest instrukcja skoku (b b0), po której stan rejestru b0 jest odtwarzany ze stosu (ldw *b15++,b0). Warto zauważyć, że po instrukcji skoku wykonanych zostanie jeszcze 5 następnych instrukcji. Z tego powodu umieszczono instrukcje puste nop. Pierwsza z nich czeka 2 cykle, a pozostałe dwie po jednym cyklu. Nie można użyć pojedynczej instrukcji nop odczekującej 4 cykle, z tego względu, że cały pakiet obsługi przerwania musi składać się z 8 instrukcji. Etykiety Default i DefaultNMI stanowią adresy domyślnych funkcji obsługi przerwań odpowiednio maskowalnego i niemaskowalnego. Dzięki makrodefinicji VEC_ENTRY pojedynczy wpis w tablicy wektorów przerwań staje się prostym wywołaniem makra z adresem funkcji przerwania, do której ma być wykonany skok (VEC_ENTRY _timer_int lub VEC_ENTRY Default). Aktualna tablica wektorów przerwań zawiera odwołania do funkcji domyślnych, funkcji _c_int00 i _timer_int. Do realizacji pierwszego zadania trzeba będzie dodać wpis wywołujący funkcję obsługi przerwania od drugiego licznika. Funkcje obsługi przerwania definiujemy z użyciem słowa kluczowego interrupt (zobacz funkcja timer_int() w module timer.c). Słowo to wymusza, aby powrót z funkcji był realizowany rozkazem b irp zamiast rozkazem b b3. b3 jest rejestrem, którego środowisko uruchomieniowe języka C używa do przechowywania adresu powrotu z wywołania zwykłej funkcji języka C. Etap drugi W etapie drugim następuje powiązanie urządzenia z funkcją obsługi przerwania z nim związaną. Kluczowa jest w tym miejscu funkcja typu...get_eventid() (np. TIMER_getEventId() użyta w module timer.c). Umożliwia ona pobranie identyfikatora zdarzenia od urządzenia (zmiennej typu Uint32), który następnie jest powiązany z numerem przerwania za pomocą funkcji IRQ_map(). Należy pamiętać, że numery przerwań zaczynają się od 0 i kończą numerem 15. Dodatkowo numery przerwań 2 i 3 są zarezerwowane i nie mogą być użyte do obsługi żadnych urządzeń. Powiązanie zdarzenia od urządzenia z numerem przerwania konfiguruje układ kontroli przerwań w taki sposób, że w momencie wystąpienia danego zdarzenia zostaje wywołana funkcja obsługi przerwania przypisana do zmapowanego numeru (np. w projekcie Scheduler IRQ_map(tid0,14) wiąże zdarzenie tid0 licznika nr 0 z funkcją obsługi przerwania timer_int). Dzieje się tak dlatego, że w tablicy wektorów przerwań IRQ_service na pozycji 14 znajduje się wpis VEC_ENTRY _timer_int. Żeby obsłużyć nowe urządzenie trzeba: zdefiniować dla niego funkcję obsługi przerwania (np. przerwanie()),

zamienić wpis w tablicy IRQ_service pod wybranym numerem (np. 12) z VEC_ENTRY Default na VEC_ENTRY _przerwanie, pobrać odpowiednie zdarzenie (np. zdarzenie) za pomocą fukcji typu...geteventid(), powiązać to zdarzenie z numerem przerwania za pomocą funkcji (np. IRQ_map(zdarzenie,12)). Etap trzeci Ostatni etap polega na zezwoleniu na obsługę wybranych przerwań. W tym celu należy: zezwolić na obsługę wybranych zdarzeń za pomocą funkcji IRQ_enable() (np. IRQ_enable(tid0) w module timer.c), zezwolić na obsługę przerwań niemaskowalnych poprzez wywołanie funkcji IRQ_nmiEnable() (patrz moduł main.c), zezwolić na globalną obsługę przerwań za pomocą funkcji IRQ_globalEnable(), ustawiającą flagę GIE w rejestrze CSR procesora. W module timer.c wywołano również funkcję IRQ_reset(tid0), która czyści flagę IF14 w rejestrze IFR usuwając ewentualne poprzednie zgłoszenie przerwania 14. Podobną funkcję ma IRQ_resetAll() wywołana w module main.c, z tym że ta funkcja kasuje historię wszystkich przerwań w rejestrze IFR. Dzięki wywołaniu funkcji typu IRQ_reset... mamy pewność, że po zezwoleniu na obsługę przerwań wywołane zostaną właściwe funkcje obsługi dla właściwych urządzeń. 2. Obsługa urządzeń zewnętrznych z wykorzystaniem biblioteki CSL Biblioteka CSL zawiera funkcje języka C umożliwiające obsługę urządzeń zewnętrznych w standaryzowany sposób. Dzięki temu ułatwia migrację kodu na dowolny procesor z zaimplementowaną formą tej biblioteki. Obsługa urządzenia rozpoczyna się od jego otwarcia za pomocą funkcji typu..._open().(np. TIMER_open() w module timer.c). Funkcja ta tworzy specjalnych uchwyt - wartość typu _Handle (np. TIMER_Handle ht0 w module timer.c) - do obsługi urządzenia. Uchwyt ten następnie jest wykorzystywany do konfiguracji za pomocą funkcji typu _config() lub _configargs() (np. TIMER_configArgs() w module timer.c). W ćwiczeniu nr 2 programowanym urządzeniem jest układ licznika. W dokumentacji biblioteki CSL

udostępnionej na stronie internetowej laboratorium znajduje się opis wszystkich funkcji związanych z obsługą liczników. Przygotowując się do laboratorium należy przygotować opis funkcji użytych w module timer.c zgodnie z wzorem podanym przy konfiguracji układu kontroli przerwań (forma notatki odręcznej lub wydruku do okazania na początku laboratorium). 3. Krótki opis projektu Scheduler Udostępniony na stronie laboratorium projekt Scheduler jest symulatorem nadajnika i odbiornika protokołu komunikacyjnego opisanego w instrukcji do ćwiczenia nr 1. Symulator ten wykorzystuje przerwanie od licznika do taktowania maszyn stanów odbiornika (moduł receiver.c), nadajnika (moduł transmitter.c) i sygnalizatora diodowego (moduł signals.c). W ramach przygotowania do ćwiczenia nr 2 należy sporządzić diagramy stanów tych trzech maszyn i okazać w formie notatki odręcznej lub wydruku na początku zajęć. Symulowane urządzenie ma następujące rejestry: xsr -rejestr danych nadajnika (char xsr), rdr -rejestr danych odbiornika (char rdr), csr -rejestr kontrolno statusowy nadajnika i odbiornika (char csr), dostępne jako zmienne globalne zdefiniowane w module port.c. W pliku nagłówkowym port.h natomiast zdefiniowane zostały stałe i makrodefinicje związane z polami bitowymi w symulowanym rejestrze csr. Operacje bitowe zostały zaimplementowane za pomocą makrodefinicji do operacji bitowych zdefiniowanych w pliku nagłówkowym bit_ops.h. Makrodefinicje te umożliwiają w czytelny dla programisty sposób zdefiniowanie operacji na polach bitowych wykorzystywanych w programowaniu urządzeń. W ramach przygotowania do ćwiczenia nr 2 należy przeanalizować makrodefinicje zdefiniowane w pliku bit_ops.h. W oparciu o wyniki analizy należy przygotować opis tych makrodefinicji w pliku nagłówkowym port.h, które wykorzystują makra zdefiniowane w pliku bit_ops.h. Opis należy sporządzić w formie notatki odręcznej lub wydruku i okazać na początku zajęć. W module comm.c znajduje się definicja funkcji communication(), która realizuje funkcję kanału komunikacyjnego. W sytuacji, gdy rejestr danych odbiornika jest wolny, a rejestr nadajnika zawiera bajt do przesłania, następuje przepisanie danych z rejestru xsr nadajnika do rejestru rdr odbiornika. W module timer.c znajdują się definicje softwarowych liczników (4 elementowa tablica struktur SOFTTIMER). Struktura SOFTTIMER zawiera następujące pola:

cnt- licznik zwiększany za każdym wywołaniem funkcji inc_timer(), prd- rejestr z wartością, przy której ma nastąpić przekręcenie licznika cnt oraz generacja sygnału trigger, wartość tego pola ustawiana jest za pomocą funkcji set_soft_timer_period(), go- flaga pozwalająca zatrzymać i wznowić pracę softwarowego licznika za pomocą funkcji star_timer() i stop_timer(). trigger- pole umożliwiające wyzwolenie dowolnej funkcji poprzez użycie funkcji soft_timer_trigger() (patrz pętla while w module main.c). Zdefiniowana w module timer.c funkcja setuptimer0() konfiguruje licznik nr 0 procesora TMS320C6713. Stałe zdefiniowane w pliku timer.h umożliwiają wywołanie przerwania od licznika co 1 ms, 10 ms, 100 ms lub co 1 s. Dodatkowo w module main.c funkcje set_soft_timer_period() konfigurują 4 liczniki softwarowe w taki sposób, aby maszyny stanów odbiornika, nadajnika i sygnałowa wywoływane były co określoną liczbę taktów licznika hardwarowego. Ponadto osobny licznik softwarowy wyzwala wywołanie funkcji communication() symulującej kanał komunikacyjny. W ramach wstępnego zapoznania się z działaniem programu Scheduler należy uruchomić projekt i zaobserwować wpływ zmiany okresów liczników softwarowych i licznika hardwarowego na działanie zaimplementowanych maszyn stanu. 4. Opis zadań do wykonania Zadanie 1 Do modułu timer.c dodać funkcję setuptimer1(), konfigurującą drugi układ hardwarowego licznika. Licznik ten ma generować przerwanie wywołujące funkcję timer_int1(). Funkcja obsługi przerwania timer_int1() powinna co 10 ms zakłócać kanał komunikacyjny symulowany przez funkcję communication(). Zakłócenie polegać będzie na zamianie aktualnie przesyłanego znaku na znak 1, powodując błąd przysłania pakietu w maszynie stanów odbiornika. Błąd ten zostanie zasygnalizowany przez sygnalizator diodowy mruganiem diody nr 1. Zadanie 2 Zmodyfikuj funkcję timer_int1() z zadania 1 w taki sposób, aby naprzemiennie przez 1s kanał komunikacyjny był sprawny, a przez kolejną ustawiał najstarszy bit każdego przesyłanego bajtu na 1. Zatem co drugą sekundę nie będzie można przesłać bajtu końca ramki ( 0 ma kod ASCII 0x30), co spowoduje przepełnienie tymczasowego bufora

curr_rmess w maszynie stanów odbiornika. W ramach zadania 2 należy tak zmodyfikować maszynę stanów odbiornika, aby uniknąć problemu przepełnienia bufora tymczasowego. Zadanie 3 Zmodyfikuj funkcję symulującą kanał komunikacyjny w taki sposób, aby nieodczytanie znaku w odbiorniku przed wysłaniem kolejnego znaku z nadajnika (przepełnienie bufora odbiornika) było sygnalizowane bitem nr 4 w rejestrze csr portu komunikacyjnego. Zdefiniuj makra RECEIVER_DATA_FULL, CLEAR_RECEIVER_DATA_FULL, SET_RECEIVER_DATA_FULL do odczytu i modyfikacji tego bitu podobne do tych zdefiniowanych dla bitu DATA_READY w pliku nagłówkowym port.h. Zmodyfikuj maszynę stanów odbiornika w taki sposób, aby po pojawieniu się tego problemu zasygnalizowała błąd przepełnienia (jednoczesne mruganie diodą nr 0 i 1) i rozpoczęła oczekiwanie na odbiór następnego pakietu. Kolejne dane z bieżącego pakietu będą interpretowane jako błędny pakiet sygnalizowany mruganiem diody nr 1. W funkcji obsługi przerwania timer_int1 należy co 10 s zmieniać częstotliwość wywołania maszyny stanów odbiornika symulując chwilowe spowolnienie jej działania i generację błędu przepełnienia bufora odbiornika.