Temat: System przerwań, liczniki i wyświetlacz w STRC51. Ćwiczenie 3.

Podobne dokumenty
Temat: System przerwań, liczniki i wyświetlacz w STRC51. Ćwiczenie 3.

Start Bity Bit Stop 1 Bit Par Rys. 1

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

MIKROPROCESORY architektura i programowanie

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

Instytut Teleinformatyki

MIKROPROCESORY architektura i programowanie

Architektura mikrokontrolera MCS51

Architektura mikrokontrolera MCS51

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

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

PMiK Programowanie Mikrokontrolera 8051

Hardware mikrokontrolera X51

Programowanie w językach asemblera i C

LABORATORIUM nr 2. Temat: Obsługa wyświetlacza siedmiosegmentowego LED

CYKL ROZKAZOWY = 1 lub 2(4) cykle maszynowe

Gdzie przyjęto, że: IR7...IR4 to starsze bity przesyłanej danej lub rozkazu, IR3...IR0 to młodsze bity przesyłanej danej lub rozkazu.

Opis procedur asemblera AVR

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

MODBUS RTU wersja M1.14 protokół komunikacyjny wyświetlaczy LDN

Kompilator języka C na procesor 8051 RC51 implementacja

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

Instytut Teleinformatyki

Temat: Obsługa portu komunikacji szeregowej RS232 w systemie STRC51. Ćwiczenie 2. (sd)

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Ćwiczenie 9 Częstościomierz oparty na µc 8051(8052)

Pracownia elektryczno-elektroniczna klasa IV

interfejs szeregowy wyświetlaczy do systemów PLC

Programowanie mikrokontrolerów AVR z rodziny ATmega.

architektura komputerów w 1 1

Przerwania w architekturze mikrokontrolera X51

Instrukcja programu użytkownika OmegaUW.Exe. Program obsługuje następujące drukarki fiskalne: ELZAB OMEGA II generacji ELZAB OMEGA F, MERA, MERA F.

ĆWICZENIE. TEMAT: OBSŁUGA PRZETWORNIKA A/C W ukontrolerze 80C535 KEILuVISON

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

Instytut Teleinformatyki

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

Programowanie w języku Python. Grażyna Koba

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

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Zewnętrzne układy peryferyjne cz. 1 Wykład 12

Systemy wbudowane. Wprowadzenie. Wprowadzenie. Mikrokontroler 8051 Budowa

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

2. Architektura mikrokontrolerów PIC16F8x... 13

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Wstęp Architektura... 13

1 Moduł Neuronu Cyfrowego SM

Przemysłowy odtwarzacz plików MP3

Modelowanie liczników w języku Verilog i ich implementacja w strukturze FPGA

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

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

Mikroprocesory i Mikrosterowniki Laboratorium

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

Organizacja typowego mikroprocesora

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

Mikroprocesor Operacje wejścia / wyjścia

Instytut Teleinformatyki

Zmienne, stałe i operatory

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

Ćwiczenie 7 Matryca RGB

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

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

1 Moduł Neuronu Cyfrowego

1 Moduł Inteligentnego Głośnika

Komunikacja w mikrokontrolerach Laboratorium

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

1 Moduł Inteligentnego Głośnika 3

TECHNIKA MIKROPROCESOROWA

Struktura programu w asemblerze mikrokontrolera 8051

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Przerwania, polling, timery - wykład 9

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Politechnika Warszawska

Instrukcja do ćwiczeń

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

SZYMAŃSKI ŁÓDŹ Ul. Wiskicka 22 Tel./fax. (042) Tel./fax. (042) Kom

OBSŁUGA ZA POMOCĄ PROGRAMU MAMOS.EXE

PROTOKÓŁ MQTT (uzupełnienie do instrukcji obsługi miernika ND30)

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Układy czasowo-licznikowe w systemach mikroprocesorowych

2 Przygotował: mgr inż. Maciej Lasota

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Spis treści. 1 Moduł Modbus TCP 4

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

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

Protokół komunikacyjny sondy cyfrowej CS-26/RS-485 (lub RS-232)

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

Metody obsługi zdarzeń

Technika mikroprocesorowa I Wykład 4

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

Łukasz Wieczorek Paweł Zaleski Grupa I3 [REFLEKSOMETR] Systemy wbudowane projekt laboratoryjny.

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

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

1. Poznanie właściwości i zasady działania rejestrów przesuwnych. 2. Poznanie właściwości i zasady działania liczników pierścieniowych.

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

Konfiguracja parametrów pozycjonowania GPS /5

Programowanie mikrokontrolerów. 8 listopada 2007

Transkrypt:

1. Mechanizm przerwań w procesorze C51 Przerwania są mechanizmem umożliwiającym połączenie zdarzeń (sygnałów) z odpowiednim wykonaniem fragmentu programu - wywoływanymi niezależnie od aktualnie wykonywanego kodu. Procedura obsługi przerwania musi być zapisany w specjalny sposób. W języku maszynowym wymagane jest na początku procedury przerwania zapamiętanie stanu przerwanego programu, a na końcu przywrócenie tego stanu. Pisząc programy w językach wysokiego poziomu (takich jak C), część pracy przejmuje na siebie kompilator. Pakiet SDCC umożliwia włączanie takich procedur w następujący sposób: void func_isr (void) interrupt 2 { Należy ten zapis rozumieć jako przypisanie do podprogramu obsługi przerwania numer 2 kodu opisanego miedzy klamrami. Wnętrze podprogramu obsługi przerwania powinno być jak najbardziej zwięzłe. Szczególnie należy zwrócić uwagę czy przed pojawieniem się następnego przerwania, obecna obsługa zostanie zakończona (co mogło by powodować nieprzewidywalne działanie programu). Z tego powodu jest dalece nie zalecane używanie konstrukcji opóźniających wykonywanie kodu wewnątrz procedur obsługi przerwania. Jednym ze sposobów uniknięcia złego kodowania, jest przekazywanie danych wytworzonych w przerwaniu do kolejki danych która jest obsługiwana poza procedurą obsługi przerwania. W procesorze C51 możliwe jest stosowanie jako źródeł przerwania następujących sygnałów: - zmiana stanu logicznego na wejściu INT0 (pin 12), - zmiana stanu logicznego na wejściu INT1 (pin 13), - przepełnienie licznika T0 (pin 14), - przepełnienie licznika T1 (pin 15), - odebranie znaku lub zakończenie wysłania znaku przez port transmisji szeregowej. W wersjach bogatszych np.: C52, C515, C517, obsługiwane są również przerwania od takich peryferii jak: -zegar czasu rzeczywistego, -modułu obsługi interfejsu I2C, -przetworników A/C, -wielu innych (zależnych od wersji mikrokontrolera). Każdy z podprogramów obsługi przerwań jest umieszczany w innym miejscu pamięci kodu (CODE): Numer przerwania Nazwa Adres podprogramu obsługi 0 Wejście INT 0 0x0003 1 Licznik Timer 0 0x000B 2 Wejście INT 1 0x0013 3 Licznik Timer 1 0x001B 4 Obsługa portu transmisji szeregowej 0x0023 Kompilując program w języku C, linker umieszcza funkcje obsługi przerwań w odpowiednich miejscach pamięci kodu. Obserwując w jaki sposób został przetłumaczony kod zapisany w C do postaci ASM (kompilator tłumaczy przejściowo z C na ASM, potem na kod relokowalny.rel),

można zauważyć duży nadmiar instrukcji w okolicach początku i końca kodu obsługi przerwania. Jest on związany z odpowiednio zapamiętaniem i odtworzeniem stanu przerwanego programu. Nadmiar ten może wpływać niekorzystnie na szybkość reakcji na fizyczne zdarzenie przez kod obsługi przerwania. Rozwiązaniem tego problemu jest pisanie procedur obsługi przerwania jako tak zwanych gołych (ang. nacked) czyli pozbawionych czasochłonnych wstawek na początku i końcu. Definicja takiego podprogramu wygląda tak: void nakedinterrupt(void) interrupt 2 _naked { Pisanie takiego typu podprogramów, jest stosunkowo trudne wymaga znajomości asemblera tego procesora. Dlatego w większości przypadków w kod takiej funkcji wprowadza się wyłącznie wstawki asemblerowe: void nakedinterrupt(void) interrupt 2 _naked { _asm _endasm; 2. Sekcje krytyczne i dzielenie zasobów. Pisząc programy wykorzystujące przerwania należy uwzględnić asynchroniczną naturę przerwań względem wykonywanego programu. Odwołania do zasobów przez podprogram przerwania i przerwany program mogą doprowadzać do niejednoznaczności, czy wręcz losowego działania całości. Dla przykładu gdy program główny wykonuje sekwencje: if (++p == 100){ A podprogram obsługi przerwania w swoim kodzie modyfikuje zmienną p w następujący sposób: p--; To gdy przerwanie wystąpi tuż po operacji ++p ale przed sprawdzeniem warunku == może zostać podjęta mylna decyzja o prawdziwości warunku. Aby zabezpieczyć się przed tego typu sytuacjami, możliwe jest używanie sekcji krytycznych. Ogólna postać takiego zapisu wygląda następująco: int funkcja() critical { Oczywiście najważniejsze słowo tutaj to critical. Dla kompilatora oznacza to że podczas trwania funkcji należy tak skonstruować kod aby niemożliwe było przerwanie go. Nie należy umieszczać zbyt długo trwających fragmentów programu w sekcjach krytycznych w trakcie ich trwania przerwania nie są obsługiwane ani kolejkowane, a co może prowadzać do gubienia istotnych informacji. 2

3. Uruchamianie przerwań Przed rozważaniem systemu przerwań warto wspomnieć, że większość rejestrów opisywanych dalej będących rejestrami specjalnego przeznaczenia jest zdefiniowanych w pliku nagłówkowym 8051.h w pakiecie SDCC (katalog: sdcc\share\sdcc\include). Nie należy ich zatem definiować za każdym razem w każdym swoim programie. System obsługi przerwań w C51 jest związany z bitem EA umiejscowionym w rejestrze wewnętrznym procesora o nazwie: IE (ulokowanym pod adresem 0xA8). Aby z poziomu języka C można odwoływać się do tego rejestru należy użyć następującą definicję: sbit at 0xAF EA; Ustawiając zmienną EA na 1 (zmienna ta może przyjmować wartości: 0 lub 1), możemy zezwolić na przyjmowanie przerwań. Następnie trzeba dla obsługiwanych przerwań ustawić odpowiednie bity w rejestrze IE o deklaracji: sfr at 0xA8 IE; Mający następujące pola: 7 6 5 4 3 2 1 0 EA - - ES ET1 EX1 ET0 EX0 EA replika bitu EA zdefiniowanego, ES bit zezwolenia na obsługę przerwań związanych z portem szeregowym, ET1 bit zezwolenia na obsługę przerwań związanych z licznikiem T1, EX1 bit zezwolenia na obsługę przerwań związanych z wejściem /INT1, ET0 bit zezwolenia na obsługę przerwań związanych z licznikiem T0, EX0 bit zezwolenia na obsługę przerwań związanych z wejściem /INT0, Do bitów tych można odwołać się bezpośrednio dzięki definicji pozostałych bitów wyglądającej następująco: sbit at 0xAC ES; sbit at 0xAB ET1; sbit at 0xAA EX1; sbit at 0xA9 ET0; sbit at 0xA8 EX0; 4. Liczniki Jednym z najprostszych sposobów generowania przerwań jest ustawienie jednego z liczników w taki sposób aby jego przepełnienie (osiągniecie wartości maksymalnej) wywołało podprogram obsługi przerwania. Układy liczników (w podstawowej wersji C51 mamy do dyspozycji dwa takie liczniki), mogą być ustawione w czterech trybach: 0 tryb pracy 13 bitowy, stan licznika określają rejestry TH0 i TH1, gdzie odliczanie przebiega od wartości wpisanej przed włączeniem licznika, do wartości 0 co równocześnie może generować przerwanie, 1 tryb pracy 16 bitowy, poza liczbą bitów identycznie działającym jak w trybie 0, 2 tryb pracy 8 bitowy z przeładowaniem (po osiągnięciu wartości 0 następuje wpisanie do TL0 zawartości z TH0 z równoczesnym wygenerowaniem przerwania i ponowne odliczanie), 3

3 tryb pracy 8 bitowy z niezależnym odliczaniem TH0 i TL0 bez możliwości przeładowywania. Aby ustawić w tryb pracy danego licznika należy, zadeklarować w C rejestr TMOD: sfr at 0x89 TMOD; Który posiada następującą strukturę: 7 6 5 4 3 2 1 0 GATE_1 C/T_1 M1_1 M0_1 GATE_0 C/T_0 M1_0 M0_0 GATE_1 bit bramkujący licznik T1 ustawiony na 1 powoduje zliczanie sygnałów pod warunkiem ustawienia wejścia /INT1 (wyzerowanie tego bitu uniezależni zliczanie od stanu tego pinu), C/T_1 bit wybierający sygnał zliczania, dla ustawionego na 1 pobierany z wejścia T1, dla wyzerowanego pobierany z generatora synchronizującego pracę procesora podzielonego przez 12, M1_1, M0_1 wybiera tryb pracy licznika: M1_1 M0_1 0 0 - tryb 0, 0 1 - tryb 1, 1 0 - tryb 2, 1 1 - tryb 3, Ważne jest także aby ustawić bit TR0 zadeklarowany jako: sbit at 0x8C TR0; Który ustawiony, włącza układ licznikowy T0. Dla układu licznikowego T1 analogicznie. Schemat na rys.1 pokazuje konfiguracje trybu pracy 1 licznika 0: Rys. 1. Schemat wewnętrznej struktury generacji przerwań Inne tryby pracy jak i działanie licznika T1 są niemal identyczne (różnice wynikają z sposobu zliczania, a nie dostarczania sygnałów pobudzeń). 5. Przepełnienie liczników - źródło przerwań. Jak widać na rysunku 1, przepełnienie jest sygnalizowane zmianą wartości bitu TF0 (umieszczony w rejestrze TCON o deklaracji: sbit at 0x8D TF0;). 4

Można w tzw. poolingu analizować stan licznika dla wychwycenia ewentualnego przepełnienia, bardziej jednak efektywną metodą jest włączenie obsługi przerwań. W takim trybie po osiągnięciu maksymalnej wartości licznik wygeneruje przerwanie. Aby to jednak było realizowane konieczne jest ustawienie bitu ET0 w rejestrze EA. Należy także zauważyć, że w trybach: 0 i 1, każdy z liczników liczy od wartości ustawionej do maksymalnej po której następuje przejście do wartości 0 i ponowne liczenie do wartości maksymalnej. W efekcie może generować inną liczbę przerwań niż spodziewaną. Aby temu zapobiec wymagane jest ustawianie wartości od jakiej licznik ma zliczać po każdym jego przepełnieniu, najlepiej zatem jest ustawiać dany licznik w procedurze obsługi przerwania związanej z nim. Natomiast w trybie 2, czynności związane z ustawieniem licznika wykonuje system automatycznie po każdorazowym jego przepełnieniu. We wszystkich trybach wpisywanie liczby zliczanych impulsów, dokonuje się przez wpisanie odpowiedniej wartości bezpośrednio do rejestrów TL0 i TH0 (i TL1 i TH1). Wartość wpisywana do tych rejestrów nie jest liczbą impulsów jakie muszą być zliczone lecz od jakiej wartości maja one być zliczane aż do wartości maksymalnej (w przypadku trybów 16 bitowych, ilości zliczonych impulsów wynosi: 65535-THL0/1, a w trybie 8 bitowym: 255-TH0/1). Deklaracje rejestrów są następujące: Licznik Starszy bajt Młodszy bajt T0 sfr at 0x8C TH0; sfr at 0x8A TL0; T1 sfr at 0x8D TH1; sfr at 0x8B TL1; 6. Wyświetlacz LED Schemat rys.2, przedstawia schemat wyświetlacza LED podłączony do magistrali procesora za pośrednictwem rejestrów U10 i U15. Rys. 2. Schemat obwodu sterującego wyświetlaczem LED Rejestry te są umieszczone w przestrzeni pamięci danych. W języku C można je zadeklarować jako (uwaga! 80C51.h nie zawiera ich definicji): xdata at 0x8000 unsigned char U15; xdata at 0xFFFF unsigned char U10; 5

Rejestry te służą wyłącznie do zapisu, nie ma sensu wywołanie typu: if(u10 & 0x10) czy: U10 &= 0x01; W tabeli poniżej pokazano definicje i maski jakie trzeba wysłać do układu U10 aby włączyć poszczególne segmenty każdego z wyświetlaczy. Definicja: #define SEG_A 0x02 #define SEG_B 0x04 #define SEG_C 0x40 #define SEG_D 0x10 #define SEG_E 0x08 #define SEG_F 0x01 #define SEG_G 0x20 #define SEG_H 0x80 Oznaczenie segmentów: a --- f g b --- e c --- d.h Dla łatwiejszego definiowania kształtu wyświetlanych znaków warto użyć preprocesingu języka C, w następujący sposób: #define CYFRA_1 SEG_B SEG_C #define CYFRA_2 SEG_A SEG_B SEG_G SEG_E SEG_D Po takim zdefiniowaniu symboli, dla przykładu aby wyświetlić znak o kształcie 2 na pozycji cyfry 4 należy wykonać następujący kod: U15=0xBF; //włączenie wyświetlacza na pozycji 4 U10=CYFRA_2;//włączenie takich segmentów aby cyfra wyglądała jak 2 Włączanie poszczególnych cyfr wyświetlacza odbywa się przez wysyłanie do układu U15 wartości z wyzerowanym bitem (jednym z czterech najstarszych bitów): 7 6 5 4 3 2 1 0 Cyfra 3 Cyfra 4 Cyfra 1 Cyfra 2 - - - - 0x7F 0xBF 0xDF 0xEF - - - - W dolnej linii powyższej tabeli podano przykładowe wartości do wysłania na układ U15 aby włączyć możliwość wyświetlenia informacji na pojedynczym wyświetlaczu. Wyłączenie więcej niż jednego z podanych bitów w U15 spowoduje włączenie dwóch lub więcej cyfr co z reguły jest nie pożądane. Jednym ze sposobów wypisywania na wyświetlaczu informacji jest wyzerowanie kolejno jednego z czterech bitów wysyłanych do U15 i odpowiedniego wysterowania bitów wysyłanych do U10, takie rozwiązanie wymaga ciągłego i często powtarzanego, gaszenia i zapalania cyfr na kolejnych pozycjach (przemiatanie). Przez swoją szybkość proces ten może być niezauważalny dla oka ludzkiego. Przy bardzo dużej szybkości przemiatania wymagane jest przed zmianą cyfry (wyzerowanie następnego bitu w U15) wpisanie do U10 samych zer zapobiega to smurzeniu wyświetlacza. 6

Na rysunkach 3,4,5,6 pokazano kolejne fazy budowania napisu 1234, w całości pokazanego na rysunku 7. Czas przejścia między kolejnymi fazami w takim procesie musi być bardzo krótki (rzędu 10ms) aby oko ludzkie nie zauważyło przejść między wyświetlaczami. Rys. 3. Rys. 4. Rys. 5. Rys. 6. Rys. 7. 7