Systemy wbudowane - krótki przewodnik

System

System to układ, w którym wszystkie składające się na niego jednostki współpracują zgodnie z zestawem reguł. Można go również zdefiniować jako sposób pracy, organizowania lub wykonywania jednego lub wielu zadań według ustalonego planu. Na przykład zegarek to system wyświetlania czasu. Jego składniki są zgodne z zestawem reguł, aby pokazać czas. Jeśli jedna z jego części ulegnie awarii, zegarek przestanie działać. Można więc powiedzieć, że w systemie wszystkie jego składniki zależne są od siebie nawzajem.

Wbudowany system

Jak sama nazwa wskazuje, „osadzony” oznacza coś, co jest połączone z inną rzeczą. System wbudowany można traktować jako system sprzętu komputerowego z wbudowanym oprogramowaniem. System wbudowany może być niezależnym systemem lub częścią dużego systemu. System wbudowany to system oparty na mikrokontrolerze lub mikroprocesorze, który jest przeznaczony do wykonywania określonego zadania. Na przykład alarm pożarowy to system wbudowany; wyczuje tylko dym.

System wbudowany składa się z trzech komponentów -

  • Ma sprzęt.

  • Posiada oprogramowanie aplikacyjne.

  • Posiada system operacyjny czasu rzeczywistego (RTOS), który nadzoruje oprogramowanie aplikacji i zapewnia mechanizm umożliwiający procesorowi uruchamianie procesu zgodnie z harmonogramem, zgodnie z planem kontrolowania opóźnień. RTOS definiuje sposób działania systemu. Ustala zasady wykonywania aplikacji. System wbudowany na małą skalę może nie mieć systemu RTOS.

Możemy więc zdefiniować system wbudowany jako oparty na mikrokontrolerze, oparty na oprogramowaniu, niezawodny system sterowania w czasie rzeczywistym.

Charakterystyka systemu wbudowanego

  • Single-functioned- System wbudowany zwykle wykonuje wyspecjalizowaną operację i robi to wielokrotnie. Na przykład: pager zawsze działa jako pager.

  • Tightly constrained- Wszystkie systemy komputerowe mają ograniczenia dotyczące wskaźników projektowych, ale systemy wbudowane mogą być szczególnie ograniczone. Metryki projektowe są miarą cech implementacji, takich jak koszt, rozmiar, moc i wydajność. Musi mieć rozmiar pozwalający na umieszczenie go na pojedynczym chipie, działać wystarczająco szybko, aby przetwarzać dane w czasie rzeczywistym i zużywać minimalną ilość energii, aby przedłużyć żywotność baterii.

  • Reactive and Real time- Wiele systemów wbudowanych musi stale reagować na zmiany w środowisku systemu i musi obliczać określone wyniki w czasie rzeczywistym bez żadnych opóźnień. Rozważ przykład kontrolera prędkości samochodu; Stale monitoruje i reaguje na czujniki prędkości i hamulca. Musi ona wielokrotnie obliczać przyspieszenie lub zmniejszenie przyspieszenia w ograniczonym czasie; Opóźnienie obliczeń może spowodować utratę kontroli nad samochodem.

  • Microprocessors based - Musi być oparty na mikroprocesorze lub mikrokontrolerze.

  • Memory- Musi mieć pamięć, ponieważ jej oprogramowanie zwykle jest osadzone w pamięci ROM. Nie potrzebuje dodatkowej pamięci w komputerze.

  • Connected - Musi mieć podłączone urządzenia peryferyjne, aby podłączyć urządzenia wejściowe i wyjściowe.

  • HW-SW systems- Oprogramowanie zapewnia więcej funkcji i elastyczność. Sprzęt jest używany do wydajności i bezpieczeństwa.

Zalety

  • Łatwo konfigurowalny
  • Niskie zużycie energii
  • Niska cena
  • Zwiększyć wydajność

Niedogodności

  • Wysoki wysiłek rozwojowy
  • Dłuższy czas wprowadzenia na rynek

Podstawowa struktura systemu wbudowanego

Poniższa ilustracja przedstawia podstawową strukturę systemu wbudowanego -

  • Sensor- Mierzy wielkość fizyczną i przekształca ją w sygnał elektryczny, który może być odczytany przez obserwatora lub za pomocą dowolnego instrumentu elektronicznego, takiego jak konwerter A2D. Czujnik przechowuje zmierzoną wielkość w pamięci.

  • A-D Converter - Przetwornik analogowo-cyfrowy przetwarza sygnał analogowy wysyłany przez czujnik na sygnał cyfrowy.

  • Processor & ASICs - Procesory przetwarzają dane w celu zmierzenia danych wyjściowych i przechowywania ich w pamięci.

  • D-A Converter - Przetwornik cyfrowo-analogowy konwertuje dane cyfrowe podawane przez procesor na dane analogowe

  • Actuator - Siłownik porównuje moc wyjściową podaną przez przetwornik DA z rzeczywistą (oczekiwaną) przechowywaną w nim mocą wyjściową i zapisuje zatwierdzoną moc.

Procesor to serce systemu wbudowanego. Jest to podstawowa jednostka, która przyjmuje dane wejściowe i generuje dane wyjściowe po przetworzeniu danych. Dla projektanta systemów wbudowanych niezbędna jest znajomość zarówno mikroprocesorów, jak i mikrokontrolerów.

Procesory w systemie

Procesor ma dwie podstawowe jednostki -

  • Jednostka sterująca przepływem programu (CU)
  • Jednostka Wykonawcza (UE)

Jednostka CU zawiera jednostkę pobierania do pobierania instrukcji z pamięci. UE posiada obwody, które wdrażają instrukcje dotyczące operacji przesyłania danych i konwersji danych z jednej formy do drugiej.

UE obejmuje jednostkę arytmetyczno-logiczną (ALU), a także obwody, które wykonują instrukcje dla zadania sterowania programem, takiego jak przerwanie lub skok do innego zestawu instrukcji.

Procesor wykonuje cykle pobierania i wykonuje instrukcje w tej samej kolejności, w jakiej są pobierane z pamięci.

Rodzaje procesorów

Procesory mogą należeć do następujących kategorii -

  • Procesor ogólnego przeznaczenia (GPP)

    • Microprocessor
    • Microcontroller
    • Wbudowany procesor
    • Cyfrowy procesor sygnału
    • Procesor multimediów
  • Procesor systemowy dla aplikacji (ASSP)

  • Procesory instrukcji specyficznych dla aplikacji (ASIP)

  • Rdzeń (y) GPP lub rdzeń (y) ASIP w obwodzie scalonym specyficznym dla aplikacji (ASIC) lub obwodzie integracji o bardzo dużej skali (VLSI).

Mikroprocesor

Mikroprocesor to pojedynczy układ VLSI z procesorem. Ponadto może mieć również inne jednostki, takie jak formatki, jednostki arytmetyczne przetwarzania zmiennoprzecinkowego i jednostki przetwarzania potokowego, które pomagają w szybszym przetwarzaniu instrukcji.

Cykl pobierania i wykonywania w mikroprocesorach wcześniejszej generacji był sterowany częstotliwością zegara rzędu ~ 1 MHz. Procesory działają teraz z częstotliwością zegara 2 GHz

Mikrokontroler

Mikrokontroler to jednoukładowa jednostka VLSI (nazywana również microcomputer) który, chociaż ma ograniczone możliwości obliczeniowe, posiada zwiększoną zdolność wejścia / wyjścia i pewną liczbę wbudowanych w chip jednostek funkcjonalnych.

procesor Baran ROM
Port we / wy Regulator czasowy Szeregowy port COM

Mikrokontrolery są szczególnie używane w systemach wbudowanych do aplikacji sterowania w czasie rzeczywistym z wbudowaną pamięcią programową i urządzeniami.

Mikroprocesor a mikrokontroler

Przyjrzyjmy się teraz najważniejszym różnicom między mikroprocesorem a mikrokontrolerem.

Mikroprocesor Mikrokontroler
Mikroprocesory są z natury wielozadaniowe. Może wykonywać wiele zadań jednocześnie. Na przykład na komputerze możemy odtwarzać muzykę podczas pisania tekstu w edytorze tekstu. Zorientowany na jedno zadanie. Na przykład pralka jest przeznaczona tylko do prania ubrań.
Pamięć RAM, ROM, porty I / O i timery mogą być dodawane zewnętrznie i mogą się różnić. Pamięci RAM, ROM, portów I / O i timerów nie można dodawać zewnętrznie. Te komponenty mają być osadzone razem na chipie i są ustalone liczbowo.
Projektanci mogą zdecydować o liczbie potrzebnych pamięci lub portów I / O. Stała liczba pamięci lub we / wy sprawia, że ​​mikrokontroler jest idealny do ograniczonego, ale konkretnego zadania.
Zewnętrzna obsługa pamięci zewnętrznej i portów I / O sprawia, że ​​system oparty na mikroprocesorze jest cięższy i droższy. Mikrokontrolery są lekkie i tańsze niż mikroprocesor.
Urządzenia zewnętrzne wymagają więcej miejsca, a ich zużycie energii jest większe. System oparty na mikrokontrolerze zużywa mniej energii i zajmuje mniej miejsca.

Mikrokontrolery 8051 pracują z 8-bitową szyną danych. Dzięki temu mogą obsługiwać zewnętrzną pamięć danych do 64 KB i zewnętrzną pamięć programu w najlepszym przypadku 64 KB. Łącznie mikrokontrolery 8051 mogą adresować 128k pamięci zewnętrznej.

Gdy dane i kod znajdują się w różnych blokach pamięci, wówczas architektura jest określana jako Harvard architecture. W przypadku, gdy dane i kod znajdują się w tym samym bloku pamięci, wówczas architektura jest określana jakoVon Neumann architecture.

Architektura von Neumanna

Architektura von Neumanna została po raz pierwszy zaproponowana przez informatyka Johna von Neumanna. W tej architekturze istnieje jedna ścieżka lub magistrala danych dla instrukcji i danych. W rezultacie procesor wykonuje jedną operację na raz. Pobiera instrukcję z pamięci lub wykonuje operację odczytu / zapisu danych. Zatem pobranie instrukcji i operacja na danych nie mogą wystąpić jednocześnie, współużytkując wspólną magistralę.

Architektura Von-Neumanna obsługuje prosty sprzęt. Pozwala na użycie pojedynczej, sekwencyjnej pamięci. Dzisiejsze szybkości przetwarzania znacznie przewyższają czasy dostępu do pamięci, a my stosujemy bardzo szybką, ale niewielką ilość pamięci (cache) lokalnej procesora.

Architektura Harvardu

Architektura Harvardu oferuje oddzielne szyny pamięci i sygnałowe dla instrukcji i danych. Ta architektura ma pamięć danych całkowicie zawartą w CPU i nie ma dostępu do pamięci instrukcji w postaci danych. Komputery mają oddzielne obszary pamięci dla instrukcji programu i danych przy użyciu wewnętrznych szyn danych, umożliwiając jednoczesny dostęp zarówno do instrukcji, jak i danych.

Programy potrzebne do załadowania przez operatora; procesor nie mógł się uruchomić. W architekturze Harvardu nie ma potrzeby, aby te dwie pamięci miały wspólne właściwości.

Architektura Von-Neumanna a architektura Harvardu

Poniższe punkty odróżniają architekturę von Neumanna od architektury harwardzkiej.

Architektura von Neumanna Architektura Harvardu
Pojedyncza pamięć współużytkowana przez kod i dane. Oddzielne pamięci na kod i dane.
Procesor musi pobrać kod w oddzielnym cyklu zegara, a dane w innym cyklu zegara. Więc wymaga dwóch cykli zegara. Pojedynczy cykl zegara jest wystarczający, ponieważ oddzielne magistrale są używane do dostępu do kodu i danych.
Większa prędkość, a więc mniej czasochłonna. Wolniejsza prędkość, przez co bardziej czasochłonna.
Prosty projekt. Złożony projekt.

CISC i RISC

CISC jest komputerem ze złożonym zestawem rozkazów. Jest to komputer, który może adresować dużą liczbę instrukcji.

We wczesnych latach osiemdziesiątych projektanci komputerów zalecali, aby komputery używały mniejszej liczby instrukcji z prostymi konstrukcjami, tak aby można je było wykonywać znacznie szybciej w procesorze bez konieczności używania pamięci. Takie komputery są klasyfikowane jako komputer ze zredukowanym zestawem instrukcji lub RISC.

CISC vs RISC

Poniższe punkty odróżniają CISC od RISC -

CISC RISC
Większy zestaw instrukcji. Łatwe do zaprogramowania Mniejszy zestaw instrukcji. Trudne do zaprogramowania.
Prostszy projekt kompilatora, biorąc pod uwagę większy zestaw instrukcji. Złożony projekt kompilatora.
Wiele trybów adresowania powodujących złożone formaty instrukcji. Kilka trybów adresowania, naprawiony format instrukcji.
Długość instrukcji jest zmienna. Długość instrukcji jest różna.
Wyższe cykle zegara na sekundę. Niski cykl zegara na sekundę.
Nacisk kładziony jest na sprzęt. Nacisk kładziony jest na oprogramowanie.
Jednostka sterująca realizuje duży zestaw instrukcji za pomocą jednostki mikroprogramu. Każda instrukcja ma być wykonana sprzętowo.
Wolniejsze wykonanie, ponieważ instrukcje mają być odczytywane z pamięci i dekodowane przez jednostkę dekodera. Szybsze wykonanie, ponieważ każda instrukcja ma być wykonywana sprzętowo.
Rurociągi nie są możliwe. Potokowanie instrukcji jest możliwe, biorąc pod uwagę pojedynczy cykl zegara.

Kompilatory i asemblery

Kompilator

Kompilator to program komputerowy (lub zestaw programów), który przekształca kod źródłowy napisany w języku programowania (języku źródłowym) na inny język komputerowy (zwykle format binarny). Najczęstszym powodem konwersji jest utworzenie programu wykonywalnego. Nazwa „kompilator” jest używana głównie w przypadku programów, które tłumaczą kod źródłowy z języka programowania wysokiego poziomu na język niskiego poziomu (np. Język asemblera lub kod maszynowy).

Kompilator krzyżowy

Jeśli skompilowany program może działać na komputerze z innym procesorem lub systemem operacyjnym niż komputer, na którym kompilator skompilował program, wówczas ten kompilator jest znany jako kompilator krzyżowy.

Dekompilator

Program, który może przetłumaczyć program z języka niskiego poziomu na język wysokiego poziomu, nazywany jest dekompilatorem.

Konwerter języka

Program, który tłumaczy programy napisane w różnych językach wysokiego poziomu, jest zwykle nazywany tłumaczem języka, tłumaczem źródła na źródło lub konwerterem języka.

Kompilator prawdopodobnie wykona następujące operacje -

  • Preprocessing
  • Parsing
  • Analiza semantyczna (tłumaczenie sterowane składnią)
  • Generowanie kodu
  • Optymalizacja kodu

Monterzy

Asembler to program, który pobiera podstawowe instrukcje komputerowe (zwane językiem asemblera) i konwertuje je na wzór bitów, których procesor komputera może używać do wykonywania podstawowych operacji. Asembler tworzy kod obiektowy, tłumacząc mnemoniki instrukcji asemblera na kody operacyjne, tłumacząc nazwy symboliczne na lokalizacje w pamięci. Język asemblera używa mnemonika do reprezentowania każdej operacji maszyny niskiego poziomu (kodu operacji).

Narzędzia do debugowania w systemie wbudowanym

Debugowanie to metodyczny proces mający na celu znalezienie i zmniejszenie liczby błędów w programie komputerowym lub elemencie sprzętu elektronicznego, tak aby działał zgodnie z oczekiwaniami. Debugowanie jest trudne, gdy podsystemy są ściśle powiązane, ponieważ niewielka zmiana w jednym podsystemie może powodować błędy w innym. Narzędzia do debugowania używane w systemach wbudowanych różnią się znacznie pod względem czasu opracowywania i funkcji debugowania. Omówimy tutaj następujące narzędzia do debugowania -

  • Simulators
  • Zestawy startowe mikrokontrolerów
  • Emulator

Symulatory

Kod jest testowany pod kątem MCU / systemu, symulując go na komputerze głównym używanym do tworzenia kodu. Symulatory próbują modelować zachowanie całego mikrokontrolera w oprogramowaniu.

Funkcje symulatorów

Symulator spełnia następujące funkcje -

  • Definiuje rodzinę procesorów lub urządzeń przetwarzających oraz ich różne wersje dla systemu docelowego.

  • Monitoruje szczegółowe informacje o części kodu źródłowego z etykietami i symbolicznymi argumentami w miarę wykonywania każdego kroku.

  • Zapewnia stan pamięci RAM i symulowanych portów systemu docelowego dla każdego pojedynczego kroku wykonania.

  • Monitoruje odpowiedź systemu i określa przepustowość.

  • Zapewnia śledzenie wyjścia zawartości licznika programu w porównaniu z rejestrami procesora.

  • Zawiera szczegółowe znaczenie bieżącego polecenia.

  • Monitoruje szczegółowe informacje o poleceniach symulatora wprowadzanych z klawiatury lub wybieranych z menu.

  • Obsługuje warunki (do 8 lub 16 lub 32 warunków) i bezwarunkowe punkty przerwania.

  • Zapewnia punkty przerwania i ślad, które razem stanowią ważne narzędzie do testowania i debugowania.

  • Ułatwia synchronizację wewnętrznych urządzeń peryferyjnych i opóźnień.

Zestaw startowy mikrokontrolera

Zestaw startowy mikrokontrolera składa się z -

  • Płyta sprzętowa (płyta ewaluacyjna)
  • Programator w systemie
  • Niektóre narzędzia programowe, takie jak kompilator, asembler, konsolidator itp.
  • Czasami wersja ewaluacyjna kompilatora o ograniczonym rozmiarze IDE i kodu.

Dużą zaletą tych zestawów w stosunku do symulatorów jest to, że działają w czasie rzeczywistym, a tym samym umożliwiają łatwą weryfikację funkcjonalności wejścia / wyjścia. Zestawy startowe są jednak w zupełności wystarczające i najtańszą opcją do tworzenia prostych projektów mikrokontrolerów.

Emulatory

Emulator to zestaw sprzętowy lub program lub może to być oba, które emulują funkcje jednego systemu komputerowego (gościa) w innym systemie komputerowym (host), innym niż pierwszy, tak że emulowane zachowanie jest bardzo podobne do zachowania rzeczywistego systemu (gościa).

Emulacja odnosi się do zdolności programu komputerowego w urządzeniu elektronicznym do emulacji (imitowania) innego programu lub urządzenia. Emulacja skupia się na odtworzeniu oryginalnego środowiska komputerowego. Emulatory mają możliwość zachowania bliższego związku z autentycznością obiektu cyfrowego. Emulator pomaga użytkownikowi pracować na dowolnej aplikacji lub systemie operacyjnym na platformie w podobny sposób, jak oprogramowanie działa jak w oryginalnym środowisku.

Urządzenia peryferyjne w systemach wbudowanych

Systemy wbudowane komunikują się ze światem zewnętrznym za pośrednictwem swoich urządzeń peryferyjnych, takich jak śledzenie & min;

  • Szeregowe interfejsy komunikacyjne (SCI), takie jak RS-232, RS-422, RS-485 itp.
  • Synchroniczny interfejs komunikacji szeregowej, taki jak I2C, SPI, SSC i ESSI
  • Uniwersalna magistrala szeregowa (USB)
  • Karty multimedialne (karty SD, Compact Flash itp.)
  • Sieci takie jak Ethernet, LonWorks itp.
  • Magistrale polowe, takie jak CAN-Bus, LIN-Bus, PROFIBUS itp.
  • imers, takie jak PLL (s), Capture / Compare i Time Processing Units.
  • Dyskretne wejścia / wyjścia, czyli wejścia / wyjścia ogólnego przeznaczenia (GPIO)
  • Analogowo-cyfrowo / Cyfrowo-analogowo (ADC / DAC)
  • Debugowanie, takie jak porty JTAG, ISP, ICSP, BDM, BITP i DP9

Kryteria wyboru mikrokontrolera

Wybierając mikrokontroler, upewnij się, że spełnia on postawione zadanie i jest opłacalny. Musimy sprawdzić, czy mikrokontroler 8-bitowy, 16-bitowy lub 32-bitowy najlepiej poradzi sobie z obliczeniowymi potrzebami zadania. Dodatkowo przy wyborze mikrokontrolera należy mieć na uwadze następujące punkty -

  • Speed - Jaka jest najwyższa prędkość obsługiwana przez mikrokontroler?

  • Packaging- Czy jest to 40-pinowy DIP (pakiet podwójny w linii) czy QFP (pakiet poczwórny)? Jest to ważne z punktu widzenia przestrzeni, montażu i prototypowania produktu końcowego.

  • Power Consumption - To ważne kryterium dla produktów zasilanych bateryjnie.

  • Amount of RAM and ROM na chipie.

  • Count of I/O pins and Timers na chipie.

  • Cost per Unit - Ma to znaczenie ze względu na ostateczny koszt produktu, w którym ma być zastosowany mikrokontroler.

Ponadto upewnij się, że masz narzędzia, takie jak kompilatory, debugery i asemblery, dostępne z mikrokontrolerem. Przede wszystkim należy zakupić mikrokontroler z pewnego źródła.

Krótka historia 8051

Pierwszy mikroprocesor 4004 został wynaleziony przez Intel Corporation. 8085 i 8086mikroprocesory zostały również wynalezione przez firmę Intel. W 1981 roku Intel wprowadził 8-bitowy mikrokontroler o nazwie8051. To było określane jakosystem on a chipponieważ miał 128 bajtów pamięci RAM, 4 KB wbudowanej pamięci ROM, dwa timery, jeden port szeregowy i 4 porty (o szerokości 8 bitów), wszystko na jednym chipie. Kiedy stał się bardzo popularny, Intel pozwolił innym producentom tworzyć i sprzedawać różne smaki 8051 z jego kodem kompatybilnym z 8051. Oznacza to, że jeśli napiszesz swój program dla jednego ze smaków 8051, będzie on również działał na innych smakach, niezależnie od producent. Doprowadziło to do powstania kilku wersji z różnymi prędkościami i ilościami wbudowanej pamięci RAM.

8051 Smaki / Członkowie

  • 8052 microcontroller- 8052 ma wszystkie standardowe funkcje mikrokontrolera 8051, a także dodatkowe 128 bajtów pamięci RAM i dodatkowy zegar. Ma również 8 KB wbudowanej pamięci ROM programu zamiast 4 KB.

  • 8031 microcontroller- To kolejny członek rodziny 8051. Ten układ jest często określany jako 8051 bez pamięci ROM, ponieważ ma 0 KB wbudowanej pamięci ROM. Musisz dodać do niego zewnętrzną pamięć ROM, aby z niej korzystać, która zawiera program do pobrania i wykonania. Ten program może mieć nawet 64 KB. Ale w trakcie dodawania zewnętrznej pamięci ROM do 8031 ​​stracił 2 porty z 4 portów. Aby rozwiązać ten problem, możemy dodać zewnętrzne we / wy do 8031

Porównanie 8051 członków rodziny

W poniższej tabeli porównano funkcje dostępne w wersjach 8051, 8052 i 8031.

Funkcja 8051 8052 8031
ROM (bajty) 4K 8K 0K
RAM (bajty) 128 256 128
Timery 2 3 2
Piny I / O 32 32 32
Port szeregowy 1 1 1
Źródła przerwań 6 8 6

Cechy mikrokontrolera 8051

Mikrokontroler 8051 jest dostarczany w pakiecie z następującymi funkcjami -

  • 4KB bajtów wbudowanej pamięci programu (ROM)
  • 128 bajtów wbudowanej pamięci danych (RAM)
  • Cztery banki rejestrowe
  • 128 flag oprogramowania zdefiniowanych przez użytkownika
  • 8-bitowa dwukierunkowa magistrala danych
  • 16-bitowa jednokierunkowa magistrala adresowa
  • 32 rejestry ogólnego przeznaczenia, każdy po 8 bitów
  • 16-bitowe timery (zwykle 2, ale może mieć więcej lub mniej)
  • Trzy wewnętrzne i dwa zewnętrzne przerwania
  • Cztery porty 8-bitowe (krótki model ma dwa porty 8-bitowe)
  • 16-bitowy licznik programu i wskaźnik danych
  • 8051 może mieć również wiele specjalnych funkcji, takich jak UART, ADC, wzmacniacz operacyjny itp.

Schemat blokowy mikrokontrolera 8051

Poniższa ilustracja przedstawia schemat blokowy mikrokontrolera 8051 -

W 8051 operacje we / wy są wykonywane przy użyciu czterech portów i 40 pinów. Poniższy schemat pinów przedstawia szczegóły 40 pinów. Port operacji we / wy rezerwuje 32 piny, z których każdy ma 8 styków. Pozostałe 8 pinów jest oznaczonych jako V cc , GND, XTAL1, XTAL2, RST, EA (bar), ALE / PROG (bar) i PSEN (bar).

Jest to 40-pinowy pakiet PDIP (plastikowy podwójny zestaw w linii)

Note- W pakiecie DIP pierwszy i ostatni pin można rozpoznać po nacięciu na środku układu scalonego. Pierwsza szpilka znajduje się po lewej stronie tego nacięcia, a ostatnia szpilka (tj. 40- ty szpilka w tym przypadku) znajduje się na prawo od nacięcia.

Porty we / wy i ich funkcje

Cztery porty P0, P1, P2 i P3, każdy używa 8 pinów, co czyni je 8-bitowymi portami. Po zresetowaniu wszystkie porty są skonfigurowane jako wejścia, gotowe do użycia jako porty wejściowe. Kiedy pierwsze 0 jest zapisywane na porcie, staje się wyjściem. Aby zmienić konfigurację jako wejście, należy wysłać 1 do portu.

Port 0 (styk nr 32 - styk nr 39)

Posiada 8 pinów (od 32 do 39). Może być używany jako wejście lub wyjście. W przeciwieństwie do portów P1, P2 i P3, zwykle podłączamy P0 do rezystorów podciągających 10 kiloomów, aby używać go jako portu wejściowego lub wyjściowego będącego otwartym drenem.

Jest również oznaczony jako AD0-AD7, dzięki czemu może być używany zarówno jako adres, jak i dane. W przypadku 8031 ​​(tj. Bez ROM-u Chip), kiedy potrzebujemy dostępu do zewnętrznej pamięci ROM, wówczas P0 będzie używany zarówno dla adresu, jak i magistrali danych. ALE (Pin nr 31) wskazuje, czy P0 ma adres lub dane. Gdy ALE = 0, dostarcza dane D0-D7, ale gdy ALE = 1, ma adres A0-A7. W przypadku braku połączenia z pamięcią zewnętrzną, P0 należy podłączyć zewnętrznie do rezystora podwyższającego 10 kiloomów.

MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)  

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

Port 1 (styki 1 do 8)

Jest to port 8-bitowy (styki od 1 do 8) i może być używany jako wejście lub wyjście. Nie wymaga rezystorów podciągających, ponieważ są one już wewnętrznie połączone. Po zresetowaniu Port 1 jest konfigurowany jako port wejściowy. Poniższego kodu można użyć do wysyłania naprzemiennych wartości 55H i AAH do portu 1.

;Toggle all bits of continuously 
MOV     A,#55 
BACK:    

MOV     P2,A 
ACALL   DELAY 
CPL     A      ;complement(invert) reg. A 
SJMP    BACK

Jeśli Port 1 jest skonfigurowany do używania jako portu wyjściowego, to aby użyć go ponownie jako portu wejściowego, zaprogramuj go, zapisując 1 do wszystkich jego bitów, jak w poniższym kodzie.

;Toggle all bits of continuously 

MOV     A ,#0FFH    ;A = FF hex 
MOV     P1,A        ;Make P1 an input port                     
MOV     A,P1        ;get data from P1 
MOV     R7,A        ;save it in Reg R7 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R6,A        ;save it in R6 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R5,A        ;save it in R5

Port 2 (piny od 21 do 28)

Port 2 zajmuje łącznie 8 pinów (piny od 21 do 28) i może być używany zarówno do operacji wejścia, jak i wyjścia. Podobnie jak P1 (Port 1), P2 również nie wymaga zewnętrznych rezystorów podciągających, ponieważ są one już wewnętrznie połączone. Musi być używany razem z P0, aby zapewnić 16-bitowy adres dla pamięci zewnętrznej. Więc jest również oznaczony jako (A0 – A7), jak pokazano na schemacie pinów. Gdy 8051 jest podłączony do pamięci zewnętrznej, zapewnia ścieżkę dla górnych 8-bitów adresu 16-bitowego i nie może być używany jako we / wy. Po zresetowaniu Port 2 jest konfigurowany jako port wejściowy. Poniższego kodu można użyć do wysyłania naprzemiennych wartości 55H i AAH do portu 2.

;Toggle all bits of continuously 
MOV     A,#55 
BACK: 
MOV     P2,A 
ACALL   DELAY 
CPL     A         ; complement(invert) reg. A 
SJMP    BACK

Jeśli Port 2 jest skonfigurowany do użycia jako port wyjściowy, to aby użyć go ponownie jako portu wejściowego, zaprogramuj go, zapisując 1 do wszystkich jego bitów, jak w poniższym kodzie.

;Get a byte from P2 and send it to P1 
MOV    A,#0FFH    ;A = FF hex 
MOV    P2,A       ;make P2 an input port 
BACK: 
MOV    A,P2       ;get data from P2 
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

Port 3 (piny od 10 do 17)

Jest również 8-bitowy i może być używany jako wejście / wyjście. Ten port dostarcza kilka niezwykle ważnych sygnałów. P3.0 i P3.1 to odpowiednio RxD (odbiornik) i TxD (nadajnik) i są łącznie używane do komunikacji szeregowej. Kołki P3.2 i P3.3 służą do przerwań zewnętrznych. P3.4 i P3.5 są używane odpowiednio dla timerów T0 i T1. P3.6 i P3.7 to styki zapisu (WR) i odczytu (RD). Są to aktywne niskie piny, co oznacza, że ​​będą aktywne, gdy zostanie im podane 0 i są one używane do zapewnienia operacji odczytu i zapisu do zewnętrznej pamięci ROM w systemach opartych na 8031.

P3 Bit Funkcjonować Kołek
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < Uzupełnienie INT0 12
P3.3 < INT1 13
P3.4 < T0 14
P3,5 < T1 15
P3.6 < WR 16
P3.7 < Uzupełnienie RD 17

Podwójna rola portu 0 i portu 2

  • Dual role of Port 0- Port 0 jest również oznaczony jako AD0 – AD7, ponieważ może być używany zarówno do obsługi danych, jak i adresów. Podłączając 8051 do pamięci zewnętrznej, Port 0 może dostarczyć zarówno adres, jak i dane. Następnie mikrokontroler 8051 multipleksuje wejście jako adres lub dane w celu zapisania pinów.

  • Dual role of Port 2- Oprócz pracy jako I / O, Port P2 jest również używany do dostarczania 16-bitowej szyny adresowej dla pamięci zewnętrznej wraz z Portem 0. Port P2 jest również oznaczony jako (A8– A15), podczas gdy Port 0 zapewnia niższe 8-bitowe A0 – A7. Innymi słowy, możemy powiedzieć, że kiedy 8051 jest podłączony do pamięci zewnętrznej (ROM), która może mieć maksymalnie 64KB i jest to możliwe dzięki 16-bitowej szynie adresowej, ponieważ wiemy, że 216 = 64KB. Port2 jest używany dla górnego 8-bitowego z 16-bitowego adresu i nie może być używany do we / wy i w ten sposób adresowany jest dowolny kod programu z zewnętrznej pamięci ROM.

Połączenie sprzętowe pinów

  • Vcc - Pin 40 zapewnia zasilanie chipa i wynosi +5 V.

  • Gnd - Pin 20 zapewnia masę odniesienia.

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 ma wbudowany oscylator, ale wymaga zewnętrznego zegara do jego uruchomienia. Kryształ kwarcu jest podłączony między pinami XTAL1 i XTAL2 chipa. Ten kryształ potrzebuje również dwóch kondensatorów 30 pF do generowania sygnału o żądanej częstotliwości. Jedna strona każdego kondensatora jest podłączona do masy. 8051 IC jest dostępny z różnymi prędkościami i wszystko zależy od tego kryształu kwarcu, na przykład mikrokontroler 20 MHz wymaga kryształu o częstotliwości nie większej niż 20 MHz.

  • RST (Pin No. 9)- Jest to pin wejściowy i aktywny pin wysoki. Po podaniu wysokiego impulsu na ten pin, czyli 1, mikrokontroler zresetuje i zakończy wszystkie czynności. Ten proces jest znany jakoPower-On Reset. Aktywacja resetowania po włączeniu zasilania spowoduje utratę wszystkich wartości w rejestrze. Ustawi licznik programu na wszystkie zera. Aby zapewnić prawidłowe wejście Reset, wysoki impuls musi być wysoki przez co najmniej dwa cykle maszyny, zanim będzie mógł spaść do stanu niskiego, co zależy od wartości kondensatora i szybkości ładowania. (Machine Cycle jest minimalną częstotliwością wymaganą przez pojedynczą instrukcję).

  • EA or External Access (Pin No. 31)- To jest pin wejściowy. Ten pin jest aktywnym niskim pinem; po przyłożeniu niskiego impulsu uaktywnia się. W przypadku mikrokontrolera (8051/52) z wbudowaną pamięcią ROM, pin EA (pręt) jest podłączony do V cc . Ale w mikrokontrolerze 8031, który nie ma wbudowanej pamięci ROM, kod jest przechowywany w zewnętrznej pamięci ROM, a następnie pobierany przez mikrokontroler. W takim przypadku musimy podłączyć (pin nr 31) EA do Gnd, aby wskazać, że kod programu jest przechowywany na zewnątrz.

  • PSEN or Program store Enable (Pin No 29)- Jest to również aktywny pin niski, tzn. Uaktywnia się po przyłożeniu niskiego impulsu. Jest to pin wyjściowy i używany razem z pinem EA w systemach opartych na 8031 ​​(tj. BEZRAMOWYCH), aby umożliwić przechowywanie kodu programu w zewnętrznej pamięci ROM.

  • ALE or (Address Latch Enable)- To jest pin wyjściowy i jest aktywny w stanie wysokim. Jest szczególnie używany do układu scalonego 8031, aby podłączyć go do pamięci zewnętrznej. Można go wykorzystać przy podejmowaniu decyzji, czy piny P0 będą używane jako magistrala adresowa czy magistrala danych. Gdy ALE = 1, to kołki P0 działają jako magistrala danych, a gdy ALE = 0, to kołki P0 działają jako magistrala adresowa.

Porty we / wy i adresowalność bitów

Jest to najczęściej używana funkcja 8051 podczas pisania kodu dla 8051. Czasami potrzebujemy dostępu tylko do 1 lub 2 bitów portu zamiast do całego 8-bitowego. 8051 zapewnia możliwość dostępu do poszczególnych bitów portów.

Uzyskując dostęp do portu w sposób jednobitowy, używamy składni „SETB X. Y”, gdzie X to numer portu (od 0 do 3), a Y to numer bitu (od 0 do 7) dla bitów danych D0-D7 gdzie D0 to LSB, a D7 to MSB. Na przykład „SETB P1.5” ustawia wysoki bit 5 portu 1.

Poniższy kod pokazuje, jak możemy przełączać bit P1.2 w sposób ciągły.

AGAIN: 
SETB    P1.2
ACALL   DELAY    
CLR     P1.2      
ACALL   DELAY 
SJMP    AGAIN

Instrukcje jednobitowe

Instrukcje Funkcjonować
Bit SETB Ustaw bit (bit = 1)
Bit CLR wyczyść bit (bit = 0)
Bit CPL uzupełnij bit (bit = NIE bit)
Bit JB, cel skocz do celu, jeśli bit = 1 (przeskocz, jeśli bit)
Bit JNB, cel skocz do celu, jeśli bit = 0 (przeskocz, jeśli nie ma bitu)
Bit JBC, cel skocz do celu, jeśli bit = 1, wyczyść bit (przeskocz, jeśli bit, a następnie wyczyść)

Licznik programu

Licznik programu jest 16- lub 32-bitowym rejestrem, który zawiera adres następnej instrukcji do wykonania. Komputer automatycznie przechodzi do następnej sekwencyjnej lokalizacji pamięci za każdym razem, gdy pobierana jest instrukcja. Operacje rozgałęzienia, skoku i przerwania ładują Licznik Programu z adresem innym niż następna kolejna lokalizacja.

Aktywacja resetowania po włączeniu zasilania spowoduje utratę wszystkich wartości w rejestrze. Oznacza to, że wartość komputera PC (licznik programu) wynosi 0 po zresetowaniu, zmuszając procesor do pobrania pierwszego kodu operacji z lokalizacji pamięci ROM 0000. Oznacza to, że musimy umieścić pierwszy bajt kodu upcode w lokalizacji ROM 0000, ponieważ to właśnie tam CPU oczekuje, że znajdzie pierwszą instrukcję

Zresetuj wektor

Znaczenie wektora resetowania polega na tym, że wskazuje on procesorowi adres pamięci, który zawiera pierwszą instrukcję oprogramowania układowego. Bez wektora resetowania procesor nie wiedziałby, gdzie rozpocząć wykonywanie. Po zresetowaniu procesor ładuje licznik programu (PC) z wartością wektora resetowania z predefiniowanej lokalizacji pamięci. W architekturze CPU08 jest to lokalizacja$FFFE:$FFFF.

Gdy wektor resetowania nie jest konieczny, programiści zwykle przyjmują go za pewnik i nie programują w ostatecznym obrazie. W rezultacie procesor nie uruchamia się na produkcie końcowym. Jest to częsty błąd, który ma miejsce podczas fazy debugowania.

Wskaźnik stosu

Stos jest zaimplementowany w pamięci RAM, a rejestr procesora jest używany, aby uzyskać do niego dostęp, zwany rejestrem SP (wskaźnik stosu). Rejestr SP jest rejestrem 8-bitowym i może adresować adresy pamięci z zakresu od 00h do FFh. Początkowo rejestr SP zawiera wartość 07 wskazującą na lokalizację 08 jako pierwszą lokalizację używaną dla stosu przez 8051.

Kiedy zawartość rejestru procesora jest przechowywana w stosie, nazywa się to operacją PUSH. Gdy zawartość stosu jest przechowywana w rejestrze procesora, nazywa się to operacją POP. Innymi słowy, rejestr jest umieszczany na stosie, aby go zapisać i zdejmowany ze stosu, aby go odzyskać.

Nieskończona pętla

Nieskończoną pętlę lub nieskończoną pętlę można zidentyfikować jako sekwencję instrukcji w programie komputerowym, która jest wykonywana bez końca w pętli, z następujących powodów:

  • pętla bez warunku zakończenia.
  • pętla z warunkiem zakończenia, którego nigdy nie można spełnić.
  • pętla z warunkiem zakończenia, który powoduje, że pętla zaczyna się od nowa.

Takie nieskończone pętle zwykle powodowały, że starsze systemy operacyjne przestały odpowiadać, ponieważ nieskończona pętla pochłania cały dostępny czas procesora. Operacje we / wy oczekujące na dane wejściowe użytkownika są również nazywane „nieskończonymi pętlami”. Jedną z możliwych przyczyn "zawieszania się" komputera jest nieskończona pętla; inne przyczyny obejmujądeadlock i access violations.

Systemy wbudowane, w przeciwieństwie do komputerów PC, nigdy nie „zamykają” aplikacji. Bezczynnie przechodzą przez nieskończoną pętlę, czekając, aż zdarzenie nastąpi w postaci przerwania lub plikupre-scheduled task. Aby oszczędzać energię, niektóre procesory wchodzą w specjalnesleep lub wait modes zamiast pracować na biegu jałowym przez nieskończoną pętlę, ale wyjdą z tego trybu albo po odliczeniu czasu, albo po zewnętrznym przerwaniu.

Przerwania

Przerwania to głównie mechanizmy sprzętowe, które instruują program, że wystąpiło zdarzenie. Mogą wystąpić w dowolnym momencie i dlatego są asynchroniczne z przepływem programu. Wymagają specjalnej obsługi przez procesor i ostatecznie są obsługiwane przez odpowiednią procedurę obsługi przerwania (ISR). Przerwania muszą być obsługiwane szybko. Jeśli obsługa przerwania zajmuje zbyt dużo czasu, możesz przegapić kolejne przerwanie.

Little Endian kontra Big Endian

Chociaż liczby są zawsze wyświetlane w ten sam sposób, nie są przechowywane w ten sam sposób w pamięci. Maszyny Big-Endian przechowują najbardziej znaczący bajt danych w najniższym adresie pamięci. Maszyna Big-Endian przechowuje 0x12345678 jako -

ADD+0: 0x12 
ADD+1: 0x34 
ADD+2: 0x56 
ADD+3: 0x78

Z drugiej strony maszyny Little-Endian przechowują najmniej znaczący bajt danych w najniższym adresie pamięci. Maszyna Little-Endian przechowuje 0x12345678 jako -

ADD+0: 0x78 
ADD+1: 0x56 
ADD+2: 0x34 
ADD+3: 0x12

Opracowano języki asemblera, aby zapewnić mnemonicslub symbole instrukcji kodowych na poziomie maszyny. Programy w języku asemblerowym składają się z mnemoników, dlatego powinny być przetłumaczone na kod maszynowy. Program odpowiedzialny za tę konwersję jest znany jakoassembler. Język asemblera jest często określany jako język niskiego poziomu, ponieważ bezpośrednio współpracuje z wewnętrzną strukturą procesora. Aby programować w języku asemblera, programista musi znać wszystkie rejestry CPU.

Różne języki programowania, takie jak C, C ++, Java i różne inne języki nazywane są językami wysokiego poziomu, ponieważ nie zajmują się wewnętrznymi szczegółami procesora. W przeciwieństwie do tego, asembler jest używany do tłumaczenia programu w języku asemblera na kod maszynowy (czasami nazywany równieżobject code lub opcode). Podobnie kompilator tłumaczy język wysokiego poziomu na kod maszynowy. Na przykład, aby napisać program w języku C, należy użyć kompilatora C, aby przetłumaczyć program na język maszynowy.

Struktura języka asemblera

Program w języku asemblerowym to seria instrukcji, które są albo instrukcjami języka asemblera, takimi jak ADD i MOV, albo instrukcjami nazwanymi directives.

Na instruction mówi procesorowi, co ma zrobić, a plik directive (nazywany również pseudo-instructions) podaje instrukcje asemblerowi. Na przykład instrukcje ADD i MOV to polecenia uruchamiane przez procesor, podczas gdy ORG i END są dyrektywami asemblera. Asembler umieszcza opcode w lokalizacji pamięci 0, gdy używana jest dyrektywa ORG, podczas gdy END wskazuje na koniec kodu źródłowego. Instrukcja języka programu składa się z następujących czterech pól -

[ label: ]   mnemonics  [ operands ]   [;comment ]

Nawias kwadratowy ([]) oznacza, że ​​pole jest opcjonalne.

  • Plik label fieldumożliwia programowi odwoływanie się do wiersza kodu według nazwy. Pola etykiet nie mogą przekraczać określonej liczby znaków.

  • Plik mnemonics i operands fieldswspólnie wykonują rzeczywistą pracę programu i realizują zadania. Instrukcje takie jak ADD A, C i MOV C, # 68, gdzie ADD i MOV to mnemoniki, które tworzą rozkazy; „A, C” i „C, # 68” to operandy. Te dwa pola mogą zawierać dyrektywy. Dyrektywy nie generują kodu maszynowego i są używane tylko przez asemblera, podczas gdy instrukcje są tłumaczone na kod maszynowy, aby procesor mógł je wykonać.

1.0000         ORG  0H            ;start (origin) at location 0 
2 0000 7D25    MOV  R5,#25H       ;load 25H into R5 
3.0002 7F34    MOV  R7,#34H       ;load 34H into  R7 
4.0004 7400    MOV  A,#0          ;load 0 into A 
5.0006 2D      ADD  A,R5          ;add contents of R5 to A 
6.0007 2F      ADD  A,R7          ;add contents of R7 to A
7.0008 2412    ADD  A,#12H        ;add to A value 12 H 
8.000A 80FE    HERE: SJMP HERE    ;stay in this loop 
9.000C END                        ;end of asm source file
  • Plik comment field zaczyna się średnikiem, który jest wskaźnikiem komentarza.

  • Zwróć uwagę na etykietę „TUTAJ” w programie. Po każdej etykiecie odnoszącej się do instrukcji należy umieścić dwukropek.

Składanie i uruchamianie programu 8051

Tutaj omówimy podstawową formę języka asemblera. Kroki tworzenia, asemblacji i uruchamiania programu w języku asemblerowym są następujące -

  • Najpierw używamy edytora, aby wpisać program podobny do powyższego programu. Do tworzenia lub edytowania programów można używać edytorów, takich jak program MS-DOS EDIT, który jest dostarczany ze wszystkimi systemami operacyjnymi firmy Microsoft. Edytor musi mieć możliwość utworzenia pliku ASCII. Rozszerzenie „asm” dla pliku źródłowego jest używane przez asemblera w następnym kroku.

  • Plik źródłowy „asm” zawiera kod programu utworzony w kroku 1. Jest on przekazywany do asemblera 8051. Następnie asembler konwertuje instrukcje języka asemblera na instrukcje kodu maszynowego i tworzy plik.obj file (plik obiektu) i plik .lst file(plik listy). Jest również nazywany jakosource file, dlatego niektóre asemblery wymagają, aby ten plik miał rozszerzenie „src”. Plik „lst” jest opcjonalny. Jest to bardzo przydatne dla programu, ponieważ zawiera listę wszystkich rozkazów i adresów, a także błędów, które wykryły asemblery.

  • Asemblery wymagają trzeciego kroku o nazwie linking. Program łączący pobiera jeden lub więcej plików obiektowych i tworzy absolutny plik obiektowy z rozszerzeniem „abs”.

  • Następnie plik „abs” jest przekazywany do programu o nazwie „OH” (konwerter obiektu na hex), który tworzy plik z rozszerzeniem „hex”, który jest gotowy do wypalenia w pamięci ROM.

Typ danych

Mikrokontroler 8051 zawiera pojedynczy typ danych 8-bitowych, a każdy rejestr ma również rozmiar 8-bitowy. Programista musi rozbić dane większe niż 8-bitowe (od 00 do FFH lub do 255 dziesiętnie), aby mogły być przetwarzane przez procesor.

DB (zdefiniuj bajt)

Dyrektywa DB jest najczęściej używaną dyrektywą danych w asemblerze. Służy do definiowania 8-bitowych danych. Może być również używany do definiowania danych w formacie dziesiętnym, binarnym, szesnastkowym lub ASCII. W przypadku liczb dziesiętnych litera „D” po liczbie dziesiętnej jest opcjonalna, ale jest wymagana w przypadku znaków „B” (binarne) i „Hl” (szesnastkowe).

Aby wskazać ASCII, po prostu umieść znaki w cudzysłowie („jak to”). Asembler automatycznie generuje kod ASCII dla liczb / znaków. Dyrektywa DB jest jedyną dyrektywą, której można użyć do zdefiniowania łańcuchów ASCII większych niż dwa znaki; dlatego powinien być używany dla wszystkich definicji danych ASCII. Kilka przykładów DB podano poniżej -

ORG  500H 
DATA1:  DB   28                     ;DECIMAL (1C in hex) 
DATA2:  DB   00110101B              ;BINARY  (35 in hex) 
DATA3:  DB   39H                    ;HEX 
        ORG  510H 
DATA4:  DB   "2591"                 ;ASCII  NUMBERS 
        ORG  520H                         
DATA6:  DA   "MY NAME IS Michael"   ;ASCII CHARACTERS

Wokół łańcuchów ASCII można używać pojedynczych lub podwójnych cudzysłowów. Baza danych jest również używana do przydzielania pamięci w fragmentach o wielkości bajtów.

Dyrektywy asemblera

Niektóre z dyrektyw 8051 są następujące -

  • ORG (origin)- Dyrektywa pochodzenia służy do wskazania początku adresu. Przyjmuje liczby w formacie szesnastkowym lub dziesiętnym. Jeśli po liczbie podano H, liczba jest traktowana jako szesnastkowa, w przeciwnym razie dziesiętna. Asembler konwertuje liczbę dziesiętną na szesnastkową.

  • EQU (equate)- Służy do definiowania stałej bez zajmowania miejsca w pamięci. EQU wiąże stałą wartość z etykietą danych, dzięki czemu etykieta pojawia się w programie, jej stała wartość zostanie zastąpiona etykietą. Podczas wykonywania instrukcji „MOV R3, #COUNT” do rejestru R3 zostanie załadowana wartość 25 (zwróć uwagę na znak #). Zaletą używania EQU jest to, że programista może go zmienić raz, a asembler zmieni wszystkie jego wystąpienia; programista nie musi przeszukiwać całego programu.

  • END directive- Wskazuje koniec pliku źródłowego (asm). Dyrektywa END to ostatnia linia programu; wszystko po dyrektywie END jest ignorowane przez asemblera.

Etykiety w języku asemblera

Wszystkie etykiety w języku asemblera muszą być zgodne z zasadami podanymi poniżej -

  • Każda nazwa etykiety musi być niepowtarzalna. Nazwy używane do etykiet w programowaniu w asemblerze składają się z liter alfabetu dużych i małych, cyfr od 0 do 9 oraz znaków specjalnych, takich jak znak zapytania (?), Kropka (.), W wysokości @, podkreślenie (_), i dolara ($).

  • Pierwsza litera powinna być zapisana alfabetycznie; nie może to być liczba.

  • Zarezerwowanych słów nie można używać jako etykiet w programie. Na przykład słowa ADD i MOV są słowami zastrzeżonymi, ponieważ są mnemonikami instrukcji.

Rejestry są wykorzystywane w CPU do tymczasowego przechowywania informacji, które mogą być danymi do przetworzenia lub adresu wskazującego dane, które mają być pobrane. W 8051 istnieje 8-bitowy typ danych, od MSB (najbardziej znaczący bit) D7 do LSB (najmniej znaczący bit) D0. W przypadku 8-bitowego typu danych każdy typ danych większy niż 8-bitowy musi zostać podzielony na 8-bitowe fragmenty przed przetworzeniem.

Najczęściej używane rejestry 8051 to A (akumulator), B, R0-R7, DPTR (wskaźnik danych) i PC (licznik programu). Wszystkie te rejestry są 8-bitowe, z wyjątkiem DPTR i PC.

Rejestry magazynowe w 8051

Omówimy tutaj następujące rodzaje rejestrów magazynowych -

  • Accumulator
  • Rejestr R.
  • Rejestr B.
  • Wskaźnik danych (DPTR)
  • Licznik programów (PC)
  • Wskaźnik stosu (SP)

Akumulator

Akumulator, rejestr A, jest używany do wszystkich operacji arytmetycznych i logicznych. Jeśli nie ma akumulatora, to każdy wynik każdego obliczenia (dodawanie, mnożenie, przesunięcie itp.) Ma być przechowywany w pamięci głównej. Dostęp do pamięci głównej jest wolniejszy niż dostęp do rejestru, takiego jak akumulator, ponieważ technologia używana w przypadku dużej pamięci głównej jest wolniejsza (ale tańsza) niż ta stosowana w przypadku rejestru.

Rejestry „R”

Rejestry „R” to zestaw ośmiu rejestrów, a mianowicie R0, R1 do R7. Rejestry te działają jako rejestry pomocnicze lub tymczasowe w wielu operacjach. Rozważmy przykład sumy 10 i 20. Przechowuj zmienną 10 w akumulatorze, a inną zmienną 20, powiedzmy, w rejestrze R4. Aby przetworzyć operację dodawania, wykonaj następujące polecenie -

ADD A,R4

Po wykonaniu tej instrukcji akumulator będzie zawierał wartość 30. Zatem rejestry "R" są bardzo ważnymi pomocniczymi lub helper registers. Sam akumulator nie byłby zbyt przydatny, gdyby nie te rejestry „R”. Rejestry „R” służą do tymczasowego przechowywania wartości.

Weźmy inny przykład. Dodamy razem wartości R1 i R2, a następnie od wyniku odejmiemy wartości R3 i R4.

MOV A,R3   ;Move the value of R3 into the accumulator 
ADD A,R4   ;Add the value of R4 
MOV R5,A   ;Store the resulting value temporarily in R5 
MOV A,R1   ;Move the value of R1 into the accumulator 
ADD A,R2   ;Add the value of R2 
SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)

Jak widać, użyliśmy R5 do tymczasowego przechowywania sumy R3 i R4. Oczywiście nie jest to najbardziej efektywny sposób obliczania (R1 + R2) - (R3 + R4), ale ilustruje użycie rejestrów „R” jako sposobu tymczasowego przechowywania wartości.

Rejestr „B”

Rejestr „B” jest bardzo podobny do akumulatora w tym sensie, że może zawierać 8-bitową (1-bajtową) wartość. Rejestr „B” jest używany tylko przez dwie instrukcje 8051:MUL AB i DIV AB. Aby szybko i łatwo pomnożyć lub podzielić A przez inną liczbę, możesz zapisać drugą liczbę w „B” i skorzystać z tych dwóch instrukcji. Oprócz stosowania instrukcji MUL i DIV, rejestr „B” jest często używany jako kolejny rejestr do tymczasowego przechowywania, podobnie jak dziewiąty rejestr R.

Wskaźnik danych

Wskaźnik danych (DPTR) to jedyny dostępny dla użytkownika 16-bitowy (2-bajtowy) rejestr 8051. Akumulator, rejestry R0 – R7 i rejestr B są 1-bajtowymi rejestrami wartości. DPTR służy do wskazywania danych. Jest używany przez 8051 do dostępu do pamięci zewnętrznej przy użyciu adresu wskazanego przez DPTR. DPTR jest jedynym dostępnym rejestrem 16-bitowym i jest często używany do przechowywania wartości 2-bajtowych.

Licznik programów

Licznik programu (PC) to 2-bajtowy adres, który informuje 8051, gdzie w pamięci można znaleźć następną instrukcję do wykonania. PC uruchamia się o 0000h, kiedy 8051 inicjalizuje się i jest zwiększany za każdym razem po wykonaniu instrukcji. PC nie zawsze jest zwiększany o 1. Niektóre instrukcje mogą wymagać 2 lub 3 bajtów; w takich przypadkach komputer zostanie zwiększony o 2 lub 3.

Branch, jump, i interruptoperacje ładują Licznik Programu z adresem innym niż następna kolejna lokalizacja. Aktywacja resetowania po włączeniu zasilania spowoduje utratę wszystkich wartości w rejestrze. Oznacza to, że wartość komputera wynosi 0 po zresetowaniu, zmuszając procesor do pobrania pierwszego kodu z lokalizacji ROM 0000. Oznacza to, że musimy umieścić pierwszy bajt kodu upcode w lokalizacji ROM 0000, ponieważ to właśnie tam procesor spodziewa się znaleźć pierwsza instrukcja.

Wskaźnik stosu (SP)

Wskaźnik stosu, podobnie jak wszystkie rejestry z wyjątkiem DPTR i PC, może zawierać 8-bitową (1-bajtową) wartość. Wskaźnik stosu wskazuje miejsce, z którego następna wartość ma zostać usunięta ze stosu. Gdy wartość jest umieszczana na stosie, wartość SP jest zwiększana, a następnie wartość jest przechowywana w wynikowej lokalizacji pamięci. Gdy wartość jest zdejmowana ze stosu, wartość jest zwracana z lokalizacji pamięci wskazanej przez SP, a następnie wartość SP jest zmniejszana.

Ta kolejność operacji jest ważna. SP zostanie zainicjowany na 07h, kiedy 8051 zostanie zainicjowany. Jeśli wartość zostanie umieszczona na stosie w tym samym czasie, wartość zostanie zapisana w wewnętrznym adresie RAM 08h, ponieważ 8051 najpierw zwiększy wartość SP (od 07h do 08h), a następnie zapisze przesuniętą wartość w tej pamięci adres (08h). SP jest modyfikowane bezpośrednio przez 8051 za pomocą sześciu instrukcji: PUSH, POP, ACALL, LCALL, RET i RETI.

ROM Space w 8051

Niektórzy członkowie rodziny 8051 mają tylko 4K bajtów wbudowanej pamięci ROM (np. 8751, AT8951); niektóre mają 8K ROM, jak AT89C52, i są niektórzy członkowie rodziny z 32K bajtami i 64K bajtami wbudowanej pamięci ROM, na przykład Dallas Semiconductor. Należy pamiętać, że żaden członek rodziny 8051 nie może uzyskać dostępu do więcej niż 64 KB kodu operacji, ponieważ licznik programu w 8051 jest rejestrem 16-bitowym (0000 do adresu FFFF).

Pierwsza lokalizacja pamięci ROM programu wewnątrz 8051 ma adres 0000H, podczas gdy ostatnia lokalizacja może się różnić w zależności od rozmiaru pamięci ROM w chipie. Wśród członków rodziny 8051, AT8951 ma $ k bajtów wbudowanej pamięci ROM o adresie pamięci od 0000 (pierwsza lokalizacja) do 0FFFH (ostatnia lokalizacja).

8051 Bity flagi i rejestr PSW

Rejestr słowa statusu programu (PSW) jest 8-bitowym rejestrem, znanym również jako flag register. Ma 8-bitową szerokość, ale jest używana tylko 6-bitowa. Dwa nieużywane bity touser-defined flags. Nazywa się cztery flagiconditional flagsco oznacza, że ​​wskazują warunek, który następuje po wykonaniu instrukcji. Te cztery sąCY (Nieść), AC (noszenie pomocnicze), P (parzystość) i OV(przelewowy). Bity RS0 i RS1 służą do zmiany rejestrów bankowych. Poniższy rysunek przedstawia rejestr słów statusu programu.

Rejestr PSW zawiera bity stanu, które odzwierciedlają bieżący stan CPU.

CY CA F0 RS1 RS0 OV - P.

CY PSW.7 Carry Flag
AC PSW.6 Pomocnicza flaga przenoszenia
F0 PSW.5 Flaga 0 dostępna dla użytkownika do celów ogólnych.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Flaga przepełnienia
- PSW.1 Definiowana przez użytkownika FLAGA
P. PSW.0 FLAGA parzystości. Ustawiane / kasowane sprzętowo podczas cyklu instrukcji w celu wskazania parzystej / nieparzystej liczby 1 bitu w akumulatorze.

Możemy wybrać odpowiedni bit banku rejestru za pomocą bitów RS0 i RS1.

RS1 RS2 Zarejestruj Bank Adres
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH
  • CY, the carry flag- Ta flaga przeniesienia jest ustawiana (1) za każdym razem, gdy jest przeprowadzane z bitu D7. Ma to wpływ po 8-bitowej operacji dodawania lub odejmowania. Można go również zresetować bezpośrednio do 1 lub 0 za pomocą instrukcji, takich jak „SETB C” i „CLR C”, gdzie „SETB” oznacza przeniesienie ustawionego bitu, a „CLR” oznacza wyraźne przenoszenie.

  • AC, auxiliary carry flag- Jeżeli występuje przeniesienie z D3 i D4 podczas operacji ADD lub SUB, ustawiany jest bit AC; w przeciwnym razie jest wyczyszczona. Służy do wykonywania arytmetyki dziesiętnej kodowanej binarnie.

  • P, the parity flag- Flaga parzystości reprezentuje liczbę jedynek tylko w rejestrze akumulatora. Jeśli rejestr A zawiera nieparzystą liczbę jedynek, to P = 1; a dla parzystej liczby jedynek P = 0.

  • OV, the overflow flag- Ta flaga jest ustawiana za każdym razem, gdy wynik operacji na liczbach ze znakiem jest zbyt duży, co powoduje przepełnienie najbardziej znaczącego bitu do bitu znaku. Służy tylko do wykrywania błędów w podpisanych operacjach arytmetycznych.

Przykład

Pokaż status flag CY, AC i P po dodaniu 9CH i 64H w poniższej instrukcji.

MOV A, nr 9CH

DODAJ A, # 64H

Solution:  9C   10011100 
          +64   01100100 
          100   00000000 
			 
CY = 1 since there is a carry beyond D7 bit  
AC = 0 since there is a carry from D3 to D4 
P  = 0 because the accumulator has even number of 1's

Mikrokontroler 8051 ma łącznie 128 bajtów pamięci RAM. Omówimy alokację tych 128 bajtów pamięci RAM i zbadamy ich użycie jako stosu i rejestru.

Alokacja miejsca w pamięci RAM w 8051

128 bajtów pamięci RAM w 8051 ma przypisane adresy od 00 do 7FH. Można uzyskać do nich bezpośredni dostęp jako lokalizacje pamięci i są podzielone na trzy różne grupy w następujący sposób -

  • 32 bajty od 00H do 1FH są zarezerwowane dla banków rejestrów i stosu.

  • 16 bajtów od 20H do 2FH jest zarezerwowanych na adresowalną bitowo pamięć do odczytu / zapisu.

  • 80 bajtów od 30H do 7FH jest używanych do odczytu i zapisu; nazywa się toscratch pad. Pamięć RAM tych 80 lokalizacji jest szeroko wykorzystywana do przechowywania danych i parametrów przez programistów 8051.

Zarejestruj banki w 8051

Łącznie 32 bajty pamięci RAM są zarezerwowane dla banków rejestrów i stosu. Te 32 bajty są podzielone na cztery banki rejestrów, w których każdy bank ma 8 rejestrów, R0 – R7. Lokalizacje RAM od 0 do 7 są zarezerwowane dla banku 0 R0 – R7, gdzie R0 to lokalizacja RAM 0, R1 to lokalizacja RAM 1, R2 to lokalizacja 2 itd., Aż do komórki pamięci 7, która należy do R7 banku 0.

Drugi bank rejestrów R0 – R7 zaczyna się w lokalizacji RAM 08 i przechodzi do lokalizacji OFH. Trzeci bank R0 – R7 zaczyna się od komórki pamięci 10H i przechodzi do lokacji do 17H. Wreszcie, lokalizacje RAM od 18H do 1FH są zarezerwowane dla czwartego banku R0 – R7.

Domyślny bank rejestru

Jeśli lokalizacje RAM 00–1F są zarezerwowane dla czterech banków rejestrów, do którego banku rejestru R0 – R7 mamy dostęp, gdy 8051 jest zasilany? Odpowiedź brzmi: bank rejestru 0; to znaczy, do lokalizacji RAM od 0 do 7 uzyskuje się dostęp pod nazwami R0 do R7 podczas programowania 8051. Ponieważ dużo łatwiej jest odnosić te lokalizacje RAM do nazw takich jak R0 do R7, niż przez ich lokalizacje w pamięci.

Jak zmienić banki rejestru

Bank rejestru 0 jest domyślny, gdy 8051 jest włączony. Do innych banków możemy przejść za pomocą rejestru PSW. Bity D4 i D3 PSW są używane do wyboru pożądanego banku rejestrów, ponieważ można uzyskać do nich dostęp za pomocą adresowalnych instrukcji bitowych SETB i CLR. Na przykład „SETB PSW.3” ustawi PSW.3 = 1 i wybierze rejestr banku 1.

RS1 RS2 Wybrano bank
0 0 Bank0
0 1 Bank1
1 0 Bank2
1 1 Bank3

Stos i jego operacje

Stos w 8051

Stos jest częścią pamięci RAM używanej przez procesor do tymczasowego przechowywania informacji, takich jak dane lub adres pamięci. CPU potrzebuje tego obszaru pamięci, biorąc pod uwagę ograniczoną liczbę rejestrów.

Jak uzyskuje się dostęp do stosów

Ponieważ stos jest częścią pamięci RAM, wewnątrz procesora znajdują się rejestry wskazujące na ten stos. Rejestr używany do uzyskania dostępu do stosu jest znany jako rejestr wskaźnika stosu. Wskaźnik stosu w 8051 ma szerokość 8 bitów i może przyjmować wartość od 00 do FFH. Podczas inicjalizacji 8051 rejestr SP zawiera wartość 07H. Oznacza to, że lokalizacja 08 w pamięci RAM jest pierwszą lokalizacją używaną dla stosu. Operacja przechowywania rejestru procesora w stosie jest znana jako plikPUSH, a pobranie zawartości ze stosu z powrotem do rejestru procesora nazywa się a POP.

Wepchnięcie do stosu

W 8051 wskaźnik stosu (SP) wskazuje ostatnio używaną lokalizację stosu. Kiedy dane są umieszczane na stosie, wskaźnik stosu (SP) jest zwiększany o 1. Gdy wykonywana jest funkcja PUSH, zawartość rejestru jest zapisywana na stosie, a SP jest zwiększana o 1. Aby wypchnąć rejestry na stos, muszą używać swoich adresów RAM. Na przykład instrukcja „PUSH 1” umieszcza rejestr R1 na stosie.

Wyskakujące ze stosu

Umieszczenie zawartości stosu z powrotem w danym rejestrze jest odwrotnością do procesu odkładania. Przy każdej operacji pop górny bajt stosu jest kopiowany do rejestru określonego przez instrukcję, a wskaźnik stosu jest zmniejszany raz.

Przepływ programu przebiega w sposób sekwencyjny, od jednej instrukcji do następnej, chyba że jest wykonywana sterująca instrukcja przekazu. Różne typy instrukcji transferu sterowania w języku asemblera obejmują skoki warunkowe lub bezwarunkowe i instrukcje wywołania.

Instrukcje pętli i skoku

Pętla w 8051

Powtarzanie sekwencji instrukcji określoną liczbę razy nazywa się a loop. InstrukcjaDJNZ reg, labelsłuży do wykonywania operacji w pętli. W tej instrukcji rejestr jest zmniejszany o 1; jeśli nie jest zerem, 8051 przeskakuje do adresu docelowego, do którego odnosi się etykieta.

Do rejestru ładowany jest licznik ilości powtórzeń przed rozpoczęciem pętli. W tej instrukcji zarówno dekrementacja rejestrów, jak i decyzja o skoku są połączone w jedną instrukcję. Rejestry mogą być dowolnymi rejestrami R0 – R7. Licznik może być również lokalizacją pamięci RAM.

Przykład

Multiply 25 by 10 using the technique of repeated addition.

Solution- Mnożenie można osiągnąć, dodając wielokrotnie mnożnik, tyle razy, ile jest mnożnik. Na przykład,

25 * 10 = 250 (FAH)

25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250

MOV A,#0             ;A = 0,clean ACC 
   MOV R2,#10           ; the multiplier is replaced in R2 
   Add A,#25            ;add the multiplicand to the ACC 
	
AGAIN:DJNZ R2, 
AGAIN:repeat  until R2 = 0 (10 times) 

   MOV R5 , A           ;save A in R5 ;R5 (FAH)

Drawback in 8051 - Pętla z instrukcją DJNZ Reg labeljest ograniczona tylko do 256 iteracji. Jeśli nie zostanie wykonany skok warunkowy, wykonywana jest instrukcja następująca po skoku.

Pętla wewnątrz pętli

Kiedy używamy pętli wewnątrz innej pętli, nazywa się to a nested loop. Dwa rejestry są używane do przechowywania licznika, gdy maksymalna liczba jest ograniczona do 256. Więc używamy tej metody, aby powtórzyć akcję więcej razy niż 256.

Example

Napisz program do -

  • Załaduj akumulator wartością 55H.
  • Uzupełnij ACC 700 razy.

Solution- Ponieważ 700 jest większe niż 255 (maksymalna pojemność dowolnego rejestru), dwa rejestry są używane do przechowywania licznika. Poniższy kod pokazuje, jak używać dwóch rejestrów, R2 i R3, do zliczania.

MOV A,#55H            ;A = 55H 
	
NEXT: MOV R3,#10         ;R3 the outer loop counter 
AGAIN:MOV R2,#70         ;R2 the inner loop counter 

   CPL A                 ;complement

Inne skoki warunkowe

Poniższa tabela zawiera listę skoków warunkowych używanych w 8051 -

Instrukcja Akcja
J Z Skocz, jeśli A = 0
JNZ Skocz, jeśli A ≠ 0
DJNZ Zmniejsz i przeskocz, jeśli rejestr ≠ 0
CJNE A, dane Skocz, jeśli dane A ≠
CJNE reg, #data Skocz, jeśli bajt ≠ dane
JC Skocz, jeśli CY = 1
JNC Skocz, jeśli CY ≠ 1
JB Skocz, jeśli bit = 1
JNB Skocz, jeśli bit = 0
JBC Skocz, jeśli bit = 1 i wyczyść bit
  • JZ (jump if A = 0)- W tej instrukcji sprawdzana jest zawartość akumulatora. Jeśli jest zero, 8051 przeskakuje pod adres docelowy. Instrukcja JZ może być używana tylko dla akumulatora, nie dotyczy żadnego innego rejestru.

  • JNZ (jump if A is not equal to 0)- W tej instrukcji zawartość akumulatora jest sprawdzana jako niezerowa. Jeśli nie jest zerem, 8051 przeskakuje do adresu docelowego.

  • JNC (Jump if no carry, jumps if CY = 0)- Bit flagi przenoszenia w rejestrze flagi (lub PSW) jest używany do podjęcia decyzji, czy przeskoczyć, czy nie, z „etykiety JNC”. Procesor patrzy na flagę przeniesienia, aby sprawdzić, czy jest podniesiona (CY = 1). Jeśli nie zostanie podniesiony, CPU zaczyna pobierać i wykonywać instrukcje z adresu etykiety. Jeśli CY = 1, nie przeskoczy, ale wykona następną instrukcję poniżej JNC.

  • JC (Jump if carry, jumps if CY = 1) - Jeśli CY = 1, przeskakuje do adresu docelowego.

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note - Należy zauważyć, że wszystkie skoki warunkowe są skokami krótkimi, tj. Adres celu musi znajdować się w zakresie od –128 do +127 bajtów zawartości licznika programu.

Bezwarunkowe instrukcje skoku

W 8051 są dwa bezwarunkowe skoki -

  • LJMP (long jump)- LJMP to 3-bajtowa instrukcja, w której pierwszy bajt reprezentuje kod operacji, a drugi i trzeci bajt reprezentują 16-bitowy adres lokalizacji docelowej. 2-bajtowy adres docelowy ma umożliwiać przejście do dowolnej lokalizacji pamięci od 0000 do FFFFH.

  • SJMP (short jump)- Jest to instrukcja 2-bajtowa, w której pierwszy bajt to kod operacji, a drugi bajt to adres względny lokalizacji docelowej. Względny adres mieści się w zakresie od 00H do FFH, który jest podzielony na skoki do przodu i do tyłu; to znaczy w zakresie od –128 do +127 bajtów pamięci w stosunku do adresu bieżącego komputera PC (licznik programu). W przypadku skoku do przodu adres docelowy może znajdować się w przestrzeni 127 bajtów od bieżącego komputera. W przypadku skoku wstecz, adres docelowy może znajdować się w granicach –128 bajtów od bieżącego komputera.

Obliczanie adresu krótkiego skoku

Wszystkie skoki warunkowe (JNC, JZ i DJNZ) są krótkimi skokami, ponieważ są to instrukcje 2-bajtowe. W tych instrukcjach pierwszy bajt reprezentuje kod operacji, a drugi bajt reprezentuje adres względny. Adres docelowy jest zawsze powiązany z wartością licznika programu. Aby obliczyć adres docelowy, drugi bajt jest dodawany do komputera PC instrukcji bezpośrednio pod skokiem. Spójrz na program podany poniżej -

Line   PC    Op-code   Mnemonic   Operand 
1      0000               ORG       0000 
2      0000  7800         MOV       R0,#003  
3      0002  7455         MOV       A,#55H0 
4      0004  6003         JZ        NEXT 
5      0006  08           INC       R0 
6      0007  04   AGAIN:  INC       A 
7      0008  04           INC       A 
8      0009  2477 NEXT:   ADD       A, #77h 
9      000B  5005         JNC       OVER 
10     000D  E4           CLR       A
11     000E  F8           MOV       R0, A 
12     000F  F9           MOV       R1, A 
13     0010  FA          MOV       R2, A 
14     0011  FB           MOV       R3, A 
15     0012  2B   OVER:   ADD       A, R3 
16     0013  50F2         JNC       AGAIN 
17     0015  80FE HERE:   SJMP      HERE 
18     0017             END

Obliczanie adresu docelowego skoku wstecznego

W przypadku skoku do przodu wartość przesunięcia jest liczbą dodatnią z zakresu od 0 do 127 (od 00 do 7F w zapisie szesnastkowym). Jednak w przypadku skoku do tyłu przemieszczenie ma wartość ujemną od 0 do –128.

Instrukcje ZADZWOŃ

CALL służy do wywołania podprogramu lub metody. Podprogramy są używane do wykonywania operacji lub zadań, które muszą być wykonywane często. To sprawia, że ​​program jest bardziej zorganizowany i oszczędza miejsce w pamięci. Istnieją dwie instrukcje - LCALL i ACALL.

LCALL (połączenie długie)

LCALL to 3-bajtowa instrukcja, w której pierwszy bajt reprezentuje kod operacji, a drugi i trzeci bajt są używane do podania adresu docelowej procedury. LCALL może być użyty do wywołania podprogramów, które są dostępne w 64-bajtowej przestrzeni adresowej 8051.

Aby pomyślnie wrócić do punktu po wykonaniu wywoływanego podprogramu, CPU zapisuje adres instrukcji bezpośrednio pod LCALL na stosie. Tak więc, kiedy wywoływany jest podprogram, sterowanie jest przenoszone do tego podprogramu, a procesor zapisuje komputer PC (licznik programu) na stosie i zaczyna pobierać instrukcje z nowej lokalizacji. Instrukcja RET (powrót) przekazuje sterowanie z powrotem do wywołującego po zakończeniu wykonywania podprogramu. Każdy podprogram używa RET jako ostatniej instrukcji.

ACALL (połączenie bezwzględne)

ACALL jest instrukcją 2-bajtową, w przeciwieństwie do LCALL, która ma 3 bajty. Docelowy adres podprogramu musi mieścić się w granicach 2 KB, ponieważ tylko 11 bitów z 2 bajtów jest używanych na adres. Różnica między ACALL i LCALL polega na tym, że adres docelowy dla LCALL może znajdować się w dowolnym miejscu w przestrzeni adresowej 64 kilobajtów 8051, podczas gdy adres docelowy CALL mieści się w zakresie 2 kilobajtów.

Na addressing modeodnosi się do tego, jak adresujesz daną lokalizację pamięci. Istnieje pięć różnych sposobów lub pięć trybów adresowania do wykonania tej instrukcji, które są następujące:

  • Tryb adresowania natychmiastowego
  • Tryb adresowania bezpośredniego
  • Zarejestruj tryb adresowania bezpośredniego
  • Zarejestruj tryb adresowania pośredniego
  • Tryb adresowania indeksowanego

Tryb natychmiastowego adresowania

Zacznijmy od przykładu.

MOV A, #6AH

Ogólnie możemy napisać,

MOV A, #data

Nazywa się to immediate ponieważ 8-bitowe dane są przesyłane natychmiast do akumulatora (operand docelowy).

Poniższa ilustracja przedstawia powyższą instrukcję i jej wykonanie. Kod operacji 74H jest zapisany pod adresem 0202. Dane 6AH są zapisywane pod adresem 0203 w pamięci programu. Po odczytaniu opkodu 74H, dane z następnego adresu pamięci programu są przesyłane do akumulatora A (E0H to adres akumulatora). Ponieważ instrukcja ma 2 bajty i jest wykonywana w jednym cyklu, licznik programu zostanie zwiększony o 2 i będzie wskazywał na 0204 pamięci programu.

Note- Symbol „#” przed 6AH wskazuje, że operand jest danymi (8 bitów). W przypadku braku znaku „#” jako adres zostanie przyjęta liczba szesnastkowa.

Tryb adresowania bezpośredniego

To jest inny sposób adresowania operandu. Tutaj adres danych (danych źródłowych) jest podany jako operand. Weźmy przykład.

MOV A, 04H

Bank rejestrów nr 0 (czwarty rejestr) ma adres 04H. Gdy wykonywana jest instrukcja MOV, dane przechowywane w rejestrze 04H są przenoszone do akumulatora. Ponieważ rejestr 04H przechowuje dane 1FH, 1FH jest przenoszony do akumulatora.

Note- Nie używaliśmy znaku „#” w trybie adresowania bezpośredniego, w przeciwieństwie do trybu bezpośredniego. Gdybyśmy użyli znaku '#', wartość danych 04H zostałaby przesłana do akumulatora zamiast 1FH.

Spójrzmy teraz na poniższą ilustrację. Pokazuje, jak instrukcja jest wykonywana.

Jak pokazano na powyższej ilustracji, jest to instrukcja 2-bajtowa, której wykonanie wymaga 1 cyklu. Komputer będzie zwiększany o 2 i wskaże 0204. Kod operacji dla instrukcji MOV A, adres to E5H. Kiedy wykonywana jest instrukcja pod numerem 0202 (E5H), akumulator jest aktywny i gotowy do odbioru danych. Następnie komputer PC przechodzi do następnego adresu jako 0203 i wyszukuje adres lokalizacji 04H, w której znajdują się dane źródłowe (do przesłania do akumulatora). W 04H układ sterowania znajduje dane 1F i przekazuje je do akumulatora, a tym samym wykonanie jest zakończone.

Zarejestruj tryb adresowania bezpośredniego

W tym trybie adresowania bezpośrednio używamy nazwy rejestru (jako argumentu źródłowego). Spróbujmy to zrozumieć na przykładzie.

MOV A, R4

W danym momencie rejestry mogą przyjmować wartości od R0 do R7. Istnieją 32 takie rejestry. Aby używać 32 rejestrów z zaledwie 8 zmiennymi do adresowania rejestrów, używane są banki rejestrów. Istnieją 4 banki rejestrów o nazwach od 0 do 3. Każdy bank składa się z 8 rejestrów o nazwach od R0 do R7.

W danym momencie można wybrać jeden bank rejestrów. Wybór banku rejestrowego jest możliwy poprzez aSpecial Function Register (SFR) o nazwie Processor Status Word(PSW). PSW to 8-bitowy SFR, w którym każdy bit można zaprogramować zgodnie z wymaganiami. Bity są oznaczone od PSW.0 do PSW.7. PSW.3 i PSW.4 służą do wyboru banków rejestrów.

Teraz spójrz na poniższą ilustrację, aby dobrze zrozumieć, jak to działa.

Opcode EC jest używany dla MOV A, R4. Kod operacji jest przechowywany pod adresem 0202, a po jego wykonaniu sterowanie przechodzi bezpośrednio do R4 odpowiedniego banku rejestrów (wybranego w PSW). Jeżeli wybrany jest bank rejestrów nr 0, to dane z R4 banku rejestrów nr 0 zostaną przeniesione do akumulatora. Tutaj 2F jest przechowywane w 04H. 04H oznacza adres R4 banku rejestrów nr 0.

Ruch danych (2F) jest wytłuszczony. 2F jest przesyłany do akumulatora z lokalizacji pamięci danych 0C H i jest pokazany linią przerywaną. 0CH to lokalizacja adresowa rejestru 4 (R4) banku rejestrów nr 1. Powyższa instrukcja ma 1 bajt i wymaga 1 cyklu do pełnego wykonania. Oznacza to, że można zaoszczędzić pamięć programu używając trybu bezpośredniego adresowania rejestru.

Zarejestruj tryb adresowania pośredniego

W tym trybie adresowania adres danych jest przechowywany w rejestrze jako argument.

MOV A, @R0

Tutaj wartość wewnątrz R0 jest traktowana jako adres, który przechowuje dane do przesłania do akumulatora. Example: Jeśli R0 ma wartość 20H, a dane 2FH są przechowywane pod adresem 20H, to po wykonaniu tej instrukcji wartość 2FH zostanie przesłana do akumulatora. Zobacz poniższą ilustrację.

Więc kod operacji MOV A, @R0jest E6H. Zakładając, że wybrany jest bank rejestrów nr 0, R0 banku rejestrów nr 0 przechowuje dane 20H. Sterowanie programowe przechodzi do 20H, gdzie lokalizuje dane 2FH i przekazuje 2FH do akumulatora. Jest to instrukcja 1-bajtowa, a licznik programu zwiększa się o 1 i przesuwa do 0203 pamięci programu.

Note- Tylko R0 i R1 mogą tworzyć instrukcję pośredniego adresowania rejestru. Innymi słowy, programista może stworzyć instrukcję używając @ R0 lub @ R1. Wszystkie banki rejestru są dozwolone.

Tryb adresowania indeksowanego

Weźmy dwa przykłady, aby zrozumieć koncepcję trybu adresowania indeksowanego. Spójrz na poniższe instrukcje -

MOVC A, @A+DPTR

i

MOVC A, @A+PC

gdzie DPTR to wskaźnik danych, a PC to licznik programu (oba są rejestrami 16-bitowymi). Rozważ pierwszy przykład.

MOVC A, @A+DPTR

Operand źródłowy to @ A + DPTR. Zawiera dane źródłowe z tej lokalizacji. Tutaj dodajemy zawartość DPTR z aktualną zawartością akumulatora. Ten dodatek da nowy adres, który jest adresem danych źródłowych. Dane wskazywane przez ten adres są następnie przesyłane do akumulatora.

Kod operacji to 93H. DPTR ma wartość 01FE, gdzie 01 znajduje się w DPH (wyższe 8 bitów), a FE znajduje się w DPL (niższe 8 bitów). Akumulator ma wartość 02H. Następnie wykonywane jest dodawanie 16-bitowe i 01FE H + 02H daje 0200 H. Dane w lokalizacji 0200H zostaną przesłane do akumulatora. Poprzednia wartość wewnątrz akumulatora (02H) zostanie zastąpiona nowymi danymi z 0200H. Nowe dane w akumulatorze są zaznaczone na ilustracji.

Jest to instrukcja 1-bajtowa z 2 cyklami potrzebnymi do wykonania, a czas wykonania tej instrukcji jest długi w porównaniu z poprzednimi instrukcjami (z których każda miała 1 cykl).

Inny przykład MOVC A, @A+PCdziała tak samo, jak w powyższym przykładzie. Zamiast dodawać DPTR z akumulatorem, tutaj dane z licznika programu (PC) są dodawane z akumulatorem w celu uzyskania adresu docelowego.

Rejestr funkcji specjalnych (lub rejestr specjalnego przeznaczenia lub po prostu rejestr specjalny) to rejestr w mikroprocesorze, który kontroluje lub monitoruje różne funkcje mikroprocesora. Ponieważ rejestry specjalne są ściśle powiązane z jakąś specjalną funkcją lub stanem procesora, mogą nie być bezpośrednio zapisywalne przez normalne instrukcje (takie jak dodawanie, przenoszenie itp.). Zamiast tego niektóre specjalne rejestry w niektórych architekturach procesorów wymagają specjalnych instrukcji, aby je zmodyfikować.

W 8051 rejestry A, B, DPTR i PSW są częścią grupy rejestrów powszechnie określanych jako SFR (rejestry funkcji specjalnych). Dostęp do SFR można uzyskać poprzez jego nazwę lub adres.

Poniższa tabela przedstawia listę SFR i ich adresów.

Adres w bajcie Adres bitowy
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0 b
E0 E7 E6 E5 E 4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
B8 - - - pne nocleg ze śniadaniem BA B9 B8 IP
B0 B7 B6 B5 B4 B3 B2 B1 B0 P3
A2 AF - - AC AB AA A9 A8 TO ZNACZY
A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
99 Nie bit adresowalny SBUF
98 9F 9E 9D 9C 9B 9A 99 98 SCON
90 97 96 95 94 93 92 91 90 P1
8D Nie bit adresowalny TH1
8C Nie bit adresowalny TH0
8B Nie bit adresowalny TL1
8A Nie bit adresowalny TL0
89 Nie bit adresowalny TMOD
88 8F 8E 8D 8C 8B 8A 89 88 TCON
87 Nie bit adresowalny PCON
83 Nie bit adresowalny DPH
82 Nie bit adresowalny DPL
81 Nie bit adresowalny SP
80 87 87 85 84 83 82 81 80 P0

Rozważ dwa poniższe punkty dotyczące adresów SFR.

  • Rejestr funkcji specjalnych może mieć adres od 80H do FFH. Adresy te są powyżej 80H, ponieważ adresy od 00 do 7FH to adresy pamięci RAM wewnątrz 8051.

  • Nie cała przestrzeń adresowa od 80 do FF jest używana przez SFR. Nieużywane lokalizacje, od 80H do FFH, są zarezerwowane i nie mogą być używane przez programistę 8051.

CY PSW.7 Carry Flag
AC PSW.6 Pomocnicza flaga przenoszenia
F0 PSW.5 Flaga 0 dostępna dla użytkownika do celów ogólnych.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Flaga przepełnienia
- PSW.1 Definiowana przez użytkownika FLAGA
P. PSW.0 FLAGA parzystości. Ustawiane / kasowane sprzętowo podczas cyklu instrukcji w celu wskazania parzystej / nieparzystej liczby 1 bitu w akumulatorze.

W poniższym przykładzie nazwy rejestrów SFR są zastępowane ich adresami.

CY AC F0 RS1 RS0 OV - P.

Możemy wybrać odpowiedni bit banku rejestru za pomocą bitów RS0 i RS1.

RS1 RS2 Zarejestruj Bank Adres
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH

Słowo statusu programu (PSW) zawiera bity statusu, które odzwierciedlają aktualny stan CPU. Warianty 8051 zapewniają jeden specjalny rejestr funkcji PSW z tą informacją o stanie. 8251 zapewnia dwie dodatkowe flagi stanu, Z i N, które są dostępne w drugim rejestrze funkcji specjalnych zwanym PSW1.

ZA timerto wyspecjalizowany rodzaj zegara, który służy do pomiaru odstępów czasu. Licznik czasu, który liczy od zera w górę do pomiaru upływającego czasu, jest często nazywany astopwatch. Jest to urządzenie, które odlicza od określonego czasu i służy do generowania opóźnienia czasowego, na przykład klepsydra to zegar.

ZA counterto urządzenie, które przechowuje (a czasami wyświetla), ile razy wystąpiło określone zdarzenie lub proces w odniesieniu do sygnału zegara. Służy do zliczania zdarzeń zachodzących poza mikrokontrolerem. W elektronice liczniki można dość łatwo zaimplementować za pomocą obwodów typu rejestrowego, takich jak przerzutnik.

Różnica między zegarem a licznikiem

Punkty, które odróżniają licznik czasu od licznika, są następujące:

Regulator czasowy Licznik
Rejestr wzrastał dla każdego cyklu maszyny. Rejestr jest zwiększany z uwzględnieniem zmiany z 1 na 0 w odpowiadającym mu zewnętrznym pinie wejściowym (T0, T1).
Maksymalna częstotliwość zliczania to 1/12 częstotliwości oscylatora. Maksymalna częstotliwość zliczania to 1/24 częstotliwości oscylatora.
Zegar wykorzystuje częstotliwość zegara wewnętrznego i generuje opóźnienie. Licznik wykorzystuje sygnał zewnętrzny do zliczania impulsów.

Liczniki czasu 8051 i ich powiązane rejestry

8051 ma dwa timery, Timer 0 i Timer 1. Mogą być używane jako timery lub jako liczniki zdarzeń. Zarówno Timer 0, jak i Timer 1 mają szerokość 16-bitową. Ponieważ 8051 opiera się na architekturze 8-bitowej, każdy 16-bitowy jest dostępny jako dwa oddzielne rejestry niskobajtowego i starszego bajtu.

Zegar 0 Zarejestruj

Dostęp do 16-bitowego rejestru Timera 0 uzyskuje się jako młodszy i starszy bajt. Rejestr niskobajtowy nazywa się TL0 (młodszy bajt timera 0), a rejestr starobajtowy - TH0 (starszy bajt timera 0). Dostęp do tych rejestrów można uzyskać jak do każdego innego rejestru. Na przykład instrukcjaMOV TL0, #4H przenosi wartość do młodszego bajtu Timera # 0.

Rejestr czasowy 1

16-bitowy rejestr Timera 1 jest dostępny jako młodszy i starszy bajt. Rejestr niskobajtowy nazywa się TL1 (młodszy bajt timera 1), a rejestr starobajtowy nazywa się TH1 (starszy bajt timera 1). Dostęp do tych rejestrów można uzyskać jak do każdego innego rejestru. Na przykład instrukcjaMOV TL1, #4H przenosi wartość do młodszego bajtu Timera 1.

Rejestr TMOD (tryb timera)

Zarówno Timer 0, jak i Timer 1 używają tego samego rejestru do ustawiania różnych trybów pracy timera. Jest to rejestr 8-bitowy, w którym 4 dolne bity są zarezerwowane dla Timera 0, a górne cztery bity dla Timerów. W każdym przypadku dolne 2 bity są używane do ustawienia trybu zegara z wyprzedzeniem, a 2 górne bity są używane do określenia lokalizacji.

Gate - Po ustawieniu licznik czasu działa tylko wtedy, gdy INT (0,1) jest wysoki.

C/T - Bit wyboru licznika / timera.

M1 - Tryb bit 1.

M0 - Tryb bitu 0.

BRAMA

Każdy minutnik ma możliwość uruchamiania i zatrzymywania. Niektóre timery robią to przez oprogramowanie, inne przez sprzęt, a niektóre mają zarówno sterowanie programowe, jak i sprzętowe. Timery 8051 mają sterowanie programowe i sprzętowe. Uruchomienie i zatrzymanie timera jest kontrolowane przez oprogramowanie przy użyciu instrukcjiSETB TR1 i CLR TR1 dla timera 1 i SETB TR0 i CLR TR0 dla timera 0.

Do jego uruchomienia służy instrukcja SETB, która jest zatrzymywana przez instrukcję CLR. Te instrukcje uruchamiają i zatrzymują liczniki tak długo, jak GATE = 0 w rejestrze TMOD. Timery mogą być uruchamiane i zatrzymywane przez zewnętrzne źródło, ustawiając GATE = 1 w rejestrze TMOD.

C / T (ZEGAR / TIMER)

Ten bit w rejestrze TMOD jest używany do decydowania, czy zegar jest używany jako delay generator lub event manager. Jeśli C / T = 0, jest używany jako licznik czasu do generowania opóźnienia czasowego. Źródłem zegara do tworzenia opóźnienia czasowego jest częstotliwość kryształu 8051. Jeśli C / T = 0, częstotliwość kryształu dołączona do 8051 decyduje również o szybkości, z jaką zegar 8051 tyka w regularnych odstępach czasu.

Częstotliwość timera jest zawsze 1/12 częstotliwości kryształu dołączonego do 8051. Chociaż różne systemy oparte na 8051 mają częstotliwość XTAL od 10 MHz do 40 MHz, zwykle pracujemy z częstotliwością XTAL 11,0592 MHz. Dzieje się tak, ponieważ prędkość transmisji dla komunikacji szeregowej 8051.XTAL = 11.0592 umożliwia systemowi 8051 komunikację z komputerem PC bez błędów.

M1 / M2

M1 M2 Tryb
0 0 13-bitowy tryb timera.
0 1 16-bitowy tryb timera.
1 0 8-bitowy tryb automatycznego przeładowania.
1 1 Tryb rozlany.

Różne tryby timerów

Tryb 0 (13-bitowy tryb timera)

Zarówno Timer 1, jak i Timer 0 w Trybie 0 działają jako liczniki 8-bitowe (z preskalerem dzielącym przez 32). Rejestr timera jest skonfigurowany jako rejestr 13-bitowy składający się ze wszystkich 8 bitów TH1 i 5 dolnych bitów TL1. Górne 3 bity TL1 są nieokreślone i należy je zignorować. Ustawienie flagi uruchomienia (TR1) nie czyści rejestru. Flaga przerwania timera TF1 jest ustawiana, gdy licznik przewraca się od wszystkich jedynek do wszystkich zer. Praca w trybie 0 jest taka sama dla timera 0, jak dla timera 1.

Tryb 1 (16-bitowy tryb timera)

Tryb timera „1” to 16-bitowy zegar i jest to powszechnie używany tryb. Działa w taki sam sposób, jak tryb 13-bitowy, z wyjątkiem tego, że używane są wszystkie 16 bitów. TLx jest zwiększany począwszy od 0 do maksymalnie 255. Po osiągnięciu wartości 255 TLx resetuje się do 0, a następnie THx jest zwiększany o 1. Ponieważ jest to pełny 16-bitowy zegar, licznik czasu może zawierać do 65536 różnych wartości i to nastąpi przepełnienie z powrotem do 0 po 65 536 cyklach maszynowych.

Tryb 2 (8-bitowe automatyczne ponowne ładowanie)

Oba rejestry timera są skonfigurowane jako liczniki 8-bitowe (TL1 i TL0) z automatycznym ponownym ładowaniem. Przepełnienie z TL1 (TL0) ustawia TF1 (TF0), a także przeładowuje TL1 (TL0) zawartością Th1 (TH0), która jest wstępnie ustawiana przez oprogramowanie. Przeładowanie pozostawia TH1 (TH0) bez zmian.

Zaletą trybu automatycznego przeładowania jest to, że możesz ustawić licznik czasu tak, aby zawsze zawierał wartość od 200 do 255. Jeśli używasz trybu 0 lub 1, będziesz musiał sprawdzić kod, aby zobaczyć przepełnienie, a w takim przypadku zresetuj licznik do 200. W takim przypadku cenne instrukcje sprawdzają wartość i / lub ładują się ponownie. W trybie 2 zajmuje się tym mikrokontroler. Po skonfigurowaniu licznika czasu w trybie 2 nie musisz się martwić sprawdzaniem, czy licznik czasu się nie przepełnił, ani też nie musisz martwić się o zresetowanie wartości, ponieważ sprzęt mikrokontrolera zrobi to za Ciebie. Tryb automatycznego przeładowania służy do ustalenia wspólnej szybkości transmisji.

Tryb 3 (tryb Split Timer)

Tryb timera „3” jest znany jako split-timer mode. Gdy Timer 0 jest ustawiony w trybie 3, staje się dwoma oddzielnymi 8-bitowymi timerami. Timer 0 to TL0, a Timer 1 to TH0. Oba liczniki liczą od 0 do 255 iw przypadku przepełnienia resetują się z powrotem do 0. Wszystkie bity timera 1 będą teraz powiązane z TH0.

Gdy Timer 0 jest w trybie podziału, rzeczywisty Timer 1 (tj. TH1 i TL1) może być ustawiony w trybach 0, 1 lub 2, ale nie można go uruchomić / zatrzymać, ponieważ bity, które to robią, są teraz połączone z TH0. Rzeczywisty zegar 1 będzie zwiększany z każdym cyklem maszyny.

Inicjalizacja timera

Wybierz tryb timera. Rozważ 16-bitowy zegar, który działa w sposób ciągły i jest niezależny od jakichkolwiek zewnętrznych pinów.

Zainicjuj TMOD SFR. Użyj najniższych 4 bitów TMOD i rozważ Timer 0. Zachowaj dwa bity, GATE 0 i C / T 0, jako 0, ponieważ chcemy, aby zegar był niezależny od zewnętrznych pinów. Ponieważ tryb 16-bitowy to tryb timera 1, wyczyść T0M1 i ustaw T0M0. W rzeczywistości jedynym bitem do włączenia jest bit 0 TMOD. Teraz wykonaj następującą instrukcję -

MOV TMOD,#01h

Teraz zegar 0 jest w trybie zegara 16-bitowego, ale zegar nie działa. Aby uruchomić timer w trybie pracy, ustaw bit TR0, wykonując następującą instrukcję -

SETB TR0

Teraz Timer 0 natychmiast rozpocznie zliczanie, zwiększając go raz na każdy cykl maszyny.

Czytanie timera

16-bitowy zegar można odczytać na dwa sposoby. Odczytaj aktualną wartość licznika jako 16-bitową liczbę lub wykryj, że licznik czasu się przepełnił.

Wykrywanie przepełnienia timera

Kiedy licznik czasu przekracza swoją najwyższą wartość do 0, mikrokontroler automatycznie ustawia bit TFx w rejestrze TCON. Więc zamiast sprawdzać dokładną wartość licznika czasu, można sprawdzić bit TFx. Jeśli ustawiono TF0, to Timer 0 przepełnił się; jeśli TF1 jest ustawione, to Timer 1 przepełnił.

Przerwanie to sygnał wysyłany do procesora przez sprzęt lub oprogramowanie, wskazujący na zdarzenie wymagające natychmiastowej uwagi. W przypadku przerwania, sterownik kończy wykonywanie aktualnej instrukcji i rozpoczyna wykonywanie instrukcjiInterrupt Service Routine (ISR) lub Interrupt Handler. ISR mówi procesorowi lub kontrolerowi, co zrobić, gdy nastąpi przerwanie. Przerwania mogą być przerwaniami sprzętowymi lub programowymi.

Przerwanie sprzętowe

Przerwanie sprzętowe to elektroniczny sygnał ostrzegawczy wysyłany do procesora z urządzenia zewnętrznego, takiego jak kontroler dysku lub zewnętrzne urządzenie peryferyjne. Na przykład, kiedy naciskamy klawisz na klawiaturze lub poruszamy myszą, wyzwalają przerwania sprzętowe, które powodują, że procesor odczytuje naciśnięcie klawisza lub pozycję myszy.

Przerwanie oprogramowania

Przerwanie programowe jest spowodowane albo przez wyjątkowy stan, albo przez specjalną instrukcję w zestawie instrukcji, która powoduje przerwanie, gdy jest wykonywana przez procesor. Na przykład, jeśli jednostka arytmetyczno-logiczna procesora wykonuje polecenie podzielenia liczby przez zero, aby wywołać wyjątek dzielenia przez zero, powodując w ten sposób, że komputer porzuci obliczenia lub wyświetli komunikat o błędzie. Instrukcje przerwań programowych działają podobnie do wywołań podprogramów.

Co to jest ankieta?

Stan ciągłego monitorowania jest znany jako polling. Mikrokontroler na bieżąco sprawdza stan innych urządzeń; a robiąc to, nie wykonuje żadnej innej operacji i zużywa cały swój czas przetwarzania na monitorowanie. Ten problem można rozwiązać za pomocą przerwań.

W metodzie przerwania sterownik reaguje tylko wtedy, gdy wystąpi przerwa. Dzięki temu kontroler nie musi regularnie monitorować stanu (flagi, sygnały itp.) Połączonych i wbudowanych urządzeń.

Przerwania odpytywania v / s

Oto analogia, która odróżnia przerwanie od odpytywania -

Przerwać Ankieta
Przerwanie jest jak shopkeeper. Jeśli ktoś potrzebuje usługi lub produktu, udaje się do niego i informuje go o swoich potrzebach. W przypadku przerwania, odebranie flag lub sygnałów, informuje kontroler, że wymagają one obsługi. Metoda odpytywania jest podobna do salesperson. Sprzedawca chodzi od drzwi do drzwi, prosząc o zakup produktu lub usługi. Podobnie, kontroler monitoruje flagi lub sygnały jeden po drugim dla wszystkich urządzeń i zapewnia obsługę dowolnego komponentu, który potrzebuje jego obsługi.

Procedura obsługi przerwania

Dla każdego przerwania musi istnieć procedura obsługi przerwań (ISR) lub interrupt handler. W przypadku przerwania mikrokontroler uruchamia procedurę obsługi przerwania. Dla każdego przerwania istnieje stała lokalizacja w pamięci, która przechowuje adres jego procedury obsługi przerwania, ISR. Tablica miejsc pamięci przeznaczonych do przechowywania adresów ISR jest nazywana tablicą wektorów przerwań.

Tabela wektorów przerwań

Istnieje sześć przerwań, w tym RESET w 8051.

Przerwania Lokalizacja ROM (Hex) Kołek
Przerwania Lokalizacja ROM (HEX)
Szeregowy COM (RI i TI) 0023
Przerwania timera 1 (TF1) 001B
Zewnętrzne przerwanie HW 1 (INT1) 0013 P3.3 (13)
Zewnętrzne przerwanie HW 0 (INT0) 0003 P3.2 (12)
Timer 0 (TF0) 000B
Resetowanie 0000 9
  • Gdy pin resetowania jest aktywowany, 8051 przeskakuje do lokalizacji adresowej 0000. To jest reset przy włączaniu.

  • Dwa przerwania są zarezerwowane dla timerów: jedno dla timera 0 i jedno dla timera 1. Lokalizacje pamięci to odpowiednio 000BH i 001BH w tablicy wektorów przerwań.

  • Dwa przerwania są zarezerwowane dla zewnętrznych przerwań sprzętowych. Nr pinu 12 i pin nr. 13 w porcie 3 są przeznaczone odpowiednio dla zewnętrznych przerwań sprzętowych INT0 i INT1. Lokalizacje pamięci to odpowiednio 0003H i 0013H w tablicy wektorów przerwań.

  • Komunikacja szeregowa ma pojedyncze przerwanie, które należy zarówno do odbioru, jak i do transmisji. Miejsce pamięci 0023H należy do tego przerwania.

Kroki do wykonania przerwania

Kiedy przerwanie staje się aktywne, mikrokontroler wykonuje następujące kroki -

  • Mikrokontroler zamyka aktualnie wykonywaną instrukcję i zapisuje na stosie adres następnej instrukcji (PC).

  • Zapisuje również wewnętrznie bieżący stan wszystkich przerwań (tj. Nie na stosie).

  • Przeskakuje do lokalizacji pamięci tablicy wektorów przerwań, która zawiera adres procedury obsługi przerwań.

  • Mikrokontroler pobiera adres ISR z tablicy wektorów przerwań i przeskakuje do niego. Rozpoczyna wykonywanie podprogramu obsługi przerwania, którym jest RETI (powrót z przerwania).

  • Po wykonaniu instrukcji RETI mikrokontroler wraca do miejsca, w którym został przerwany. Najpierw pobiera adres licznika programu (PC) ze stosu, umieszczając górne bajty stosu w komputerze. Następnie zaczyna działać z tego adresu.

Wyzwalanie zboczem a wyzwalanie poziomem

Moduły przerwań są dwojakiego rodzaju - wyzwalane poziomem lub wyzwalane zboczem.

Wyzwolony poziom Edge Triggered
Moduł przerwań wyzwalanych poziomem zawsze generuje przerwanie za każdym razem, gdy poziom źródła przerwania jest zapewniony. Moduł przerwań wyzwalanych zboczem generuje przerwanie tylko wtedy, gdy wykryje potwierdzające zbocze źródła przerwań. Krawędź zostaje wykryta, gdy poziom źródła przerwań faktycznie się zmienia. Można go również wykryć przez okresowe pobieranie próbek i wykrywanie potwierdzonego poziomu, gdy poprzednia próbka została cofnięta.
Jeśli źródło przerwania jest nadal zapewniane, gdy program obsługi przerwań oprogramowania sprzętowego obsługuje przerwanie, moduł przerwań zregeneruje przerwanie, powodując ponowne wywołanie procedury obsługi przerwań. Moduły przerwań wyzwalane zboczem mogą działać natychmiast, bez względu na to, jak zachowuje się źródło przerwań.
Przerwania wyzwalane poziomem są uciążliwe dla oprogramowania układowego. Przerwania wyzwalane zboczem utrzymują złożoność kodu oprogramowania układowego na niskim poziomie, zmniejszają liczbę warunków dla oprogramowania układowego i zapewniają większą elastyczność podczas obsługi przerwań.

Włączanie i wyłączanie przerwania

Po zresetowaniu wszystkie przerwania są wyłączone, nawet jeśli są aktywowane. Przerwania muszą być włączone za pomocą oprogramowania, aby mikrokontroler mógł odpowiedzieć na te przerwania.

Rejestr IE (możliwość przerwania) jest odpowiedzialny za włączanie i wyłączanie przerwania. IE jest rejestrem z możliwością adresowania bitowego.

Rejestracja przerwania aktywacji

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA - Globalne włączanie / wyłączanie.

  • - - Niezdefiniowany.

  • ET2 - Włącz przerwanie timera 2.

  • ES - Włącz przerwanie portu szeregowego.

  • ET1 - Włącz przerwanie timera 1.

  • EX1 - Włącz przerwanie zewnętrznego 1.

  • ET0 - Włącz przerwanie timera 0.

  • EX0 - Włącz przerwanie zewnętrznego 0.

Aby włączyć przerwanie, wykonujemy następujące kroki -

  • Bit D7 rejestru IE (EA) musi być wysoki, aby reszta rejestru mogła zadziałać.

  • Jeśli EA = 1, przerwania zostaną włączone i będą odpowiadać, jeśli ich odpowiednie bity w IE są wysokie. Jeśli EA = 0, żadne przerwania nie będą odpowiadać, nawet jeśli skojarzone z nimi piny w rejestrze IE są wysokie.

Priorytet przerwań w 8051

Możemy zmienić priorytet przerwań, przypisując wyższy priorytet dowolnemu z przerwań. Osiąga się to poprzez zaprogramowanie rejestru o nazwieIP (priorytet przerwania).

Poniższy rysunek przedstawia bity rejestru IP. Po zresetowaniu rejestr IP zawiera wszystkie zera. Aby nadać wyższy priorytet dowolnemu z przerwań, ustawiamy odpowiedni bit w rejestrze IP na wysoki.

- - - - PT1 PX1 PT0 PX0

- IP.7 Nie zaimplementowano.
- IP.6 Nie zaimplementowano.
- IP.5 Nie zaimplementowano.
- IP.4 Nie zaimplementowano.
PT1 IP.3 Określa poziom priorytetu przerwań Timera 1.
PX1 IP.2 Określa poziom priorytetu zewnętrznego przerwania 1.
PT0 IP.1 Określa poziom priorytetu przerwań Timera 0.
PX0 IP.0 Określa poziom priorytetu zewnętrznego przerwania 0.

Przerwij w przerwaniu

Co się stanie, jeśli 8051 wykonuje ISR należący do przerwania, a inny staje się aktywny? W takich przypadkach przerwanie o wysokim priorytecie może przerwać przerwanie o niskim priorytecie. Jest to znane jakointerrupt inside interrupt. W 8051 przerwanie o niskim priorytecie może zostać przerwane przez przerwanie o wysokim priorytecie, ale nie przez żadne inne przerwanie o niskim priorytecie.

Wyzwalanie przerwania przez oprogramowanie

Są chwile, kiedy musimy przetestować ISR w drodze symulacji. Można to zrobić za pomocą prostych instrukcji, aby ustawić przerwanie w stan wysoki, a tym samym spowodować, że 8051 przeskoczy do tablicy wektorów przerwań. Na przykład ustaw bit IE na 1 dla timera 1. InstrukcjaSETB TF1 przerwie 8051 cokolwiek robi i zmusi go do skoku do tablicy wektorów przerwań.