Gömülü Sistemler - Hızlı Kılavuz

Sistem

Bir sistem, tüm birimlerinin bir dizi kurala göre birlikte çalıştığı bir düzenlemedir. Sabit bir plana göre bir veya daha fazla görevi çalışma, organize etme veya yapma şekli olarak da tanımlanabilir. Örneğin bir saat, bir zaman görüntüleme sistemidir. Bileşenleri zamanı göstermek için bir dizi kurala uyar. Parçalarından biri arızalanırsa saat çalışmayı durdurur. Yani bir sistemde tüm alt bileşenlerinin birbirine bağlı olduğunu söyleyebiliriz.

Yerleşik sistem

Adından da anlaşılacağı gibi, Gömülü başka bir şeye bağlı bir şey anlamına gelir. Gömülü bir sistem, içinde yazılımın bulunduğu bir bilgisayar donanım sistemi olarak düşünülebilir. Gömülü bir sistem bağımsız bir sistem olabilir veya büyük bir sistemin parçası olabilir. Gömülü sistem, belirli bir görevi yerine getirmek için tasarlanmış mikro denetleyici veya mikroişlemci tabanlı bir sistemdir. Örneğin, bir yangın alarmı gömülü bir sistemdir; sadece dumanı algılar.

Gömülü bir sistemin üç bileşeni vardır -

  • Donanımı var.

  • Uygulama yazılımına sahiptir.

  • Uygulama yazılımını denetleyen ve işlemcinin gecikmeleri kontrol etmek için bir plan izleyerek zamanlamaya göre bir işlemi çalıştırmasına izin veren mekanizma sağlayan Gerçek Zamanlı İşletim sistemine (RTOS) sahiptir. RTOS, sistemin çalışma şeklini tanımlar. Uygulama programının yürütülmesi sırasında kuralları belirler. Küçük ölçekli bir gömülü sistemde RTOS olmayabilir.

Böylece gömülü bir sistemi Mikroişlemci tabanlı, yazılımla çalışan, güvenilir, gerçek zamanlı bir kontrol sistemi olarak tanımlayabiliriz.

Gömülü Sistemin Özellikleri

  • Single-functioned- Gömülü bir sistem genellikle özel bir işlem gerçekleştirir ve aynı işlemi tekrar tekrar yapar. Örneğin: Bir çağrı cihazı her zaman bir çağrı cihazı işlevi görür.

  • Tightly constrained- Tüm bilgi işlem sistemlerinin tasarım ölçütleri üzerinde kısıtlamaları vardır, ancak gömülü bir sistemdekiler özellikle sıkı olabilir. Tasarım ölçümleri, bir uygulamanın maliyeti, boyutu, gücü ve performansı gibi özelliklerinin bir ölçüsüdür. Tek bir çipe sığacak boyutta olmalı, verileri gerçek zamanlı olarak işleyecek kadar hızlı çalışmalı ve pil ömrünü uzatmak için minimum güç tüketmelidir.

  • Reactive and Real time- Birçok gömülü sistem, sistem ortamındaki değişikliklere sürekli olarak tepki vermeli ve belirli sonuçları herhangi bir gecikme olmaksızın gerçek zamanlı olarak hesaplamalıdır. Bir araba seyir kontrolörü örneğini düşünün; sürekli olarak hız ve fren sensörlerini izler ve bunlara tepki verir. Sınırlı bir süre içinde tekrar tekrar hızlanma veya yavaşlamaları hesaplaması gerekir; Gecikmiş bir hesaplama, aracın kontrolünün başarısız olmasına neden olabilir.

  • Microprocessors based - Mikroişlemci veya mikrodenetleyici tabanlı olmalıdır.

  • Memory- Yazılımı genellikle ROM'a gömüldüğünden, bir belleğe sahip olmalıdır. Bilgisayarda herhangi bir ikincil belleğe ihtiyaç duymaz.

  • Connected - Giriş ve çıkış cihazlarını bağlamak için bağlı çevre birimlerine sahip olması gerekir.

  • HW-SW systems- Yazılım, daha fazla özellik ve esneklik için kullanılır. Donanım, performans ve güvenlik için kullanılır.

Avantajlar

  • Kolayca Özelleştirilebilir
  • Düşük güç tüketimi
  • Düşük maliyetli
  • Geliştirilmiş performans

Dezavantajları

  • Yüksek geliştirme çabası
  • Pazara daha uzun süre

Gömülü Sistemin Temel Yapısı

Aşağıdaki çizim, yerleşik bir sistemin temel yapısını göstermektedir -

  • Sensor- Fiziksel miktarı ölçer ve bunu bir gözlemci tarafından veya A2D dönüştürücü gibi herhangi bir elektronik alet tarafından okunabilen bir elektrik sinyaline dönüştürür. Bir sensör, ölçülen miktarı belleğe kaydeder.

  • A-D Converter - Analogdan dijitale dönüştürücü, sensör tarafından gönderilen analog sinyali dijital sinyale dönüştürür.

  • Processor & ASICs - İşlemciler, çıktıyı ölçmek ve belleğe depolamak için verileri işler.

  • D-A Converter - Dijitalden analoğa dönüştürücü, işlemci tarafından beslenen dijital verileri analog verilere dönüştürür

  • Actuator - Bir aktüatör, DA Dönüştürücü tarafından verilen çıktıyı, içinde depolanan gerçek (beklenen) çıktıyla karşılaştırır ve onaylanan çıktıyı depolar.

İşlemci, yerleşik bir sistemin kalbidir. Verileri işledikten sonra girdi alan ve çıktı üreten temel birimdir. Gömülü bir sistem tasarımcısı için hem mikroişlemciler hem de mikro denetleyiciler hakkında bilgi sahibi olmak gerekir.

Bir Sistemdeki İşlemciler

Bir işlemcinin iki temel birimi vardır -

  • Program Akış Kontrol Birimi (CU)
  • Yürütme Birimi (AB)

CU, bellekten talimatların alınması için bir getirme birimi içerir. AB, veri aktarım işlemi ve bir formdan diğerine veri dönüştürme ile ilgili talimatları uygulayan devrelere sahiptir.

AB, Aritmetik ve Mantıksal Birimi (ALU) ve ayrıca kesme veya başka bir komut setine atlama gibi bir program kontrol görevi için komutları yürüten devreleri içerir.

Bir işlemci, getirme döngülerini çalıştırır ve talimatları bellekten getirildikleri sırayla yürütür.

İşlemci Türleri

İşlemciler aşağıdaki kategorilerden olabilir -

  • Genel Amaçlı İşlemci (GPP)

    • Microprocessor
    • Microcontroller
    • Gömülü İşlemci
    • Dijital Sinyal İşlemci
    • Medya İşlemcisi
  • Uygulamaya Özel Sistem İşlemcisi (ASSP)

  • Uygulamaya Özel Talimat İşlemcileri (ASIP'ler)

  • Uygulamaya Özel Tümleşik Devre (ASIC) veya Çok Büyük Ölçekli Entegrasyon (VLSI) devresindeki GPP çekirdek (ler) veya ASIP çekirdek (ler).

Mikroişlemci

Mikroişlemci, CPU'ya sahip tek bir VLSI yongasıdır. Ek olarak, komutların daha hızlı işlenmesine yardımcı olan koçlar, kayan nokta işleme aritmetik birimi ve boru hattı birimleri gibi başka birimlere de sahip olabilir.

Daha önceki nesil mikroişlemcilerin getir ve çalıştır döngüsü, ~ 1 MHz'lik bir saat frekansı tarafından yönlendiriliyordu. İşlemciler artık 2GHz saat frekansında çalışıyor

Mikrodenetleyici

Mikrodenetleyici, tek çipli bir VLSI birimidir (aynı zamanda microcomputer) sınırlı hesaplama yeteneklerine sahip olmasına rağmen, gelişmiş girdi / çıktı kabiliyetine ve bir dizi yonga üstü işlevsel birimlere sahiptir.

İşlemci Veri deposu ROM
G / Ç Bağlantı Noktası Zamanlayıcı Seri COM Bağlantı Noktası

Mikrodenetleyiciler, özellikle çip üzerinde program belleği ve cihazları ile gerçek zamanlı kontrol uygulamaları için gömülü sistemlerde kullanılır.

Mikroişlemci vs Mikrodenetleyici

Şimdi bir mikroişlemci ile bir mikro denetleyici arasındaki en önemli farklara bir göz atalım.

Mikroişlemci Mikrodenetleyici
Mikroişlemciler, doğaları gereği çoklu görev yaparlar. Aynı anda birden fazla görevi gerçekleştirebilir. Örneğin, bilgisayarda metin düzenleyicide metin yazarken müzik çalabiliriz. Tek görev odaklı. Örneğin, bir çamaşır makinesi yalnızca çamaşır yıkamak için tasarlanmıştır.
RAM, ROM, G / Ç Bağlantı Noktaları ve Zamanlayıcılar harici olarak eklenebilir ve sayı olarak değişebilir. RAM, ROM, G / Ç Bağlantı Noktaları ve Zamanlayıcılar harici olarak eklenemez. Bu bileşenler bir çip üzerinde birlikte gömülmeli ve numaralandırılmıştır.
Tasarımcılar, gereken bellek veya G / Ç bağlantı noktası sayısına karar verebilir. Bellek veya G / Ç için sabit sayı, bir mikro denetleyiciyi sınırlı ancak belirli bir görev için ideal hale getirir.
Harici bellek ve G / Ç bağlantı noktalarının harici desteği, mikroişlemci tabanlı bir sistemi daha ağır ve daha maliyetli hale getirir. Mikrodenetleyiciler hafiftir ve bir mikroişlemciden daha ucuzdur.
Harici cihazlar daha fazla alan gerektirir ve güç tüketimleri daha yüksektir. Mikrodenetleyici tabanlı bir sistem daha az güç tüketir ve daha az yer kaplar.

8051 mikro denetleyiciler 8 bit veri yolu ile çalışır. Böylece 64K'ya kadar harici veri belleğini ve 64k harici program belleğini en iyi şekilde destekleyebilirler. Toplu olarak, 8051 mikro denetleyici 128k harici belleği adresleyebilir.

Veri ve kod farklı bellek bloklarında yer aldığında, mimariye Harvard architecture. Veri ve kodun aynı bellek bloğunda olması durumunda mimari,Von Neumann architecture.

Von Neumann Mimarlık

Von Neumann mimarisi ilk olarak bir bilgisayar bilimcisi John von Neumann tarafından önerildi. Bu mimaride, hem talimat hem de veriler için bir veri yolu veya veri yolu vardır. Sonuç olarak, CPU her seferinde bir işlem yapar. Ya bellekten bir talimat alır ya da veriler üzerinde okuma / yazma işlemi gerçekleştirir. Dolayısıyla, bir komut getirme ve bir veri işlemi aynı anda gerçekleşemez ve ortak bir veri yolunu paylaşır.

Von-Neumann mimarisi basit donanımı destekler. Sıralı tek bir hafızanın kullanımına izin verir. Günümüzün işlem hızları, bellek erişim sürelerini büyük ölçüde geride bırakıyor ve işlemciye yerel olarak çok hızlı ancak az miktarda bellek (önbellek) kullanıyoruz.

Harvard Mimarlık

Harvard mimarisi, talimatlar ve veriler için ayrı depolama ve sinyal otobüsleri sunar. Bu mimari, tamamen CPU içinde bulunan veri depolamasına sahiptir ve veri olarak komut depolamasına erişim yoktur. Bilgisayarların, hem talimatlara hem de verilere eşzamanlı erişim sağlayan dahili veri yollarını kullanan program talimatları ve veriler için ayrı bellek alanları vardır.

Bir operatör tarafından yüklenmesi gereken programlar; işlemci kendini önyükleyemedi. Bir Harvard mimarisinde, iki hafızanın mülkleri paylaşmasına gerek yoktur.

Von-Neumann Mimarisi ve Harvard Mimarisi

Aşağıdaki noktalar Von Neumann Mimarisini Harvard Mimarisinden ayırmaktadır.

Von-Neumann Mimarisi Harvard Mimarlık
Hem kod hem de veriler tarafından paylaşılacak tek hafıza. Kod ve veri için ayrı hafızalar.
İşlemcinin kodu ayrı bir saat döngüsünde ve verileri başka bir saat döngüsünde getirmesi gerekir. Bu yüzden iki saat döngüsü gerektirir. Koda ve verilere erişmek için ayrı veri yolları kullanıldığından, tek saat döngüsü yeterlidir.
Daha yüksek hız, dolayısıyla daha az zaman alıcı. Daha yavaş hız, dolayısıyla daha fazla zaman alır.
Tasarımda basit. Tasarımda karmaşık.

CISC ve RISC

CISC, Karmaşık bir Komut Seti Bilgisayarıdır. Çok sayıda talimatı ele alabilen bir bilgisayardır.

1980'lerin başlarında, bilgisayar tasarımcıları, bellek kullanmak zorunda kalmadan CPU içinde çok daha hızlı çalıştırılabilmeleri için bilgisayarların basit yapılarla daha az komut kullanmasını önerdiler. Bu tür bilgisayarlar Azaltılmış Komut Seti Bilgisayarı veya RISC olarak sınıflandırılır.

CISC ve RISC

Aşağıdaki noktalar, bir CISC'yi bir RISC'den ayırır -

CISC RISC
Daha büyük talimatlar. Programlaması kolay Daha küçük talimat seti. Programlaması zor.
Daha büyük yönergeler göz önünde bulundurularak derleyicinin daha basit tasarımı. Derleyicinin karmaşık tasarımı.
Birçok adresleme modu, karmaşık komut formatlarına neden olur. Birkaç adresleme modu, talimat formatı düzelt.
Talimat uzunluğu değişkendir. Talimat uzunluğu değişir.
Saniyede daha yüksek saat döngüleri. Saniyede düşük saat döngüsü.
Vurgu donanım üzerinedir. Vurgu yazılım üzerinedir.
Kontrol ünitesi, mikro program ünitesi kullanarak büyük komut setini uygular. Her komut donanım tarafından yürütülecektir.
Talimatlar bellekten okunacağından ve dekoder ünitesi tarafından kodu çözüleceğinden daha yavaş yürütme. Her komut donanım tarafından yürütüldüğü için daha hızlı yürütme.
Ardışık düzen mümkün değildir. Tek saat döngüsü dikkate alınarak talimatların ardışık düzenlenmesi mümkündür.

Derleyiciler ve Birleştiriciler

Derleyici

Derleyici, bir programlama dilinde (kaynak dil) yazılmış kaynak kodunu başka bir bilgisayar diline (normalde ikili format) dönüştüren bir bilgisayar programıdır (veya bir dizi programdır). Dönüştürmenin en yaygın nedeni, yürütülebilir bir program oluşturmaktır. "Derleyici" adı öncelikle kaynak kodunu yüksek seviye bir programlama dilinden düşük seviyeli bir dile çeviren programlar için kullanılır (örneğin, montaj dili veya makine kodu).

Çapraz Derleyici

Derlenen program, derleyicinin programı derlediği bilgisayardan farklı CPU'ya veya işletim sistemine sahip bir bilgisayarda çalışabiliyorsa, bu derleyici çapraz derleyici olarak bilinir.

Derleyici çözücü

Bir programı düşük seviyeli bir dilden yüksek seviyeli bir dile çevirebilen bir programa derleyici adı verilir.

Dil Dönüştürücü

Farklı yüksek seviyeli dillerde yazılmış programları çeviren bir programa normal olarak dil çevirmeni, kaynaktan kaynak çevirmene veya dil dönüştürücü denir.

Bir derleyicinin aşağıdaki işlemleri gerçekleştirmesi muhtemeldir -

  • Preprocessing
  • Parsing
  • Anlamsal Analiz (Sözdizimi odaklı çeviri)
  • Kod oluşturma
  • Kod optimizasyonu

Montajcılar

Bir derleyici, temel bilgisayar talimatlarını (derleme dili olarak adlandırılır) alan ve bunları bilgisayarın işlemcisinin temel işlemlerini gerçekleştirmek için kullanabileceği bir bit modeline dönüştüren bir programdır. Bir derleyici, montaj talimatı anımsatıcılarını işlem kodlarına çevirerek, sembolik adları bellek konumlarına çözümleyerek nesne kodu oluşturur. Assembly dili, her düşük seviyeli makine işlemini (opcode) temsil etmek için bir anımsatıcı kullanır.

Gömülü Bir Sistemdeki Hata Ayıklama Araçları

Hata ayıklama, bir bilgisayar programındaki veya bir elektronik donanımdaki hataların sayısını bulup azaltmak için yöntemsel bir işlemdir, böylece beklendiği gibi çalışır. Alt sistemler sıkı bir şekilde bağlandığında hata ayıklama zordur, çünkü bir alt sistemdeki küçük bir değişiklik diğerinde hatalara neden olabilir. Gömülü sistemlerde kullanılan hata ayıklama araçları, geliştirme süreleri ve hata ayıklama özellikleri açısından büyük farklılıklar gösterir. Burada aşağıdaki hata ayıklama araçlarını tartışacağız -

  • Simulators
  • Mikrodenetleyici başlangıç ​​kitleri
  • Emulator

Simülatörler

Kod, kod geliştirme için kullanılan ana bilgisayarda simüle edilerek MCU / sistem için test edilir. Simülatörler, yazılımdaki tüm mikro denetleyicinin davranışını modellemeye çalışır.

Simülatörlerin Fonksiyonları

Bir simülatör aşağıdaki işlevleri yerine getirir -

  • Hedef sistem için işlemci veya işleme cihazı ailesinin yanı sıra çeşitli sürümlerini tanımlar.

  • Her bir adım için yürütme devam ederken, bir kaynak kod parçasının ayrıntılı bilgilerini etiketler ve sembolik argümanlar ile izler.

  • Her tek adımlı yürütme için RAM durumunu ve hedef sistemin simüle edilmiş bağlantı noktalarını sağlar.

  • Sistem yanıtını izler ve verimi belirler.

  • İşlemci kayıtlarına göre program sayacının içeriklerinin çıktısının izini sağlar.

  • Mevcut komutun ayrıntılı anlamını sağlar.

  • Simülatör komutlarının ayrıntılı bilgilerini klavyeden girildikçe veya menüden seçildikçe izler.

  • Koşulları (8 veya 16 veya 32 koşula kadar) ve koşulsuz kesme noktalarını destekler.

  • Önemli test ve hata ayıklama aracı olan kesme noktaları ve izlemeyi sağlar.

  • Dahili çevre birimlerinin ve gecikmelerin senkronize edilmesini kolaylaştırır.

Mikrodenetleyici Başlangıç ​​Kiti

Bir mikro denetleyici başlangıç ​​kiti şunlardan oluşur:

  • Donanım kartı (Değerlendirme panosu)
  • Sistem içi programcı
  • Derleyici, derleyici, bağlayıcı vb. Gibi bazı yazılım araçları.
  • Bazen, bir derleyicinin bir IDE ve kod boyutu sınırlı değerlendirme sürümü.

Bu kitlerin simülatörlere göre büyük bir avantajı, gerçek zamanlı çalışmaları ve dolayısıyla kolay giriş / çıkış işlevselliği doğrulamasına izin vermeleridir. Bununla birlikte, başlangıç ​​kitleri tamamen yeterlidir ve basit mikro denetleyici projeleri geliştirmek için en ucuz seçenektir.

Emülatörler

Bir emülatör, bir donanım kiti veya bir yazılım programıdır veya her ikisi de bir bilgisayar sisteminin (konuk) işlevlerini birincisinden farklı olarak başka bir bilgisayar sisteminde (ana bilgisayar) taklit ederek öykünen davranış davranışa çok benziyor olabilir. gerçek sistemin (misafir).

Emülasyon, elektronik bir cihazdaki bir bilgisayar programının başka bir program veya cihazı taklit etme (taklit etme) yeteneğini ifade eder. Öykünme, orijinal bir bilgisayar ortamını yeniden oluşturmaya odaklanır. Emülatörler, dijital nesnenin gerçekliğiyle daha yakın bir bağlantı kurma yeteneğine sahiptir. Bir emülatör, kullanıcının bir platform üzerindeki herhangi bir uygulama veya işletim sistemi üzerinde, yazılımın orijinal ortamında çalışmasına benzer şekilde çalışmasına yardımcı olur.

Gömülü Sistemlerde Çevresel Aygıtlar

Gömülü sistemler, aşağıdaki & dakika gibi çevre birimleri aracılığıyla dış dünya ile iletişim kurar;

  • RS-232, RS-422, RS-485 vb. Seri Haberleşme Arayüzleri (SCI)
  • I2C, SPI, SSC ve ESSI gibi Senkron Seri İletişim Arayüzü
  • Evrensel Seri Veri Yolu (USB)
  • Çoklu Ortam Kartları (SD Kartlar, Compact Flash vb.)
  • Ethernet, LonWorks vb. Ağlar
  • CAN-Bus, LIN-Bus, PROFIBUS vb. Fieldbus'lar.
  • PLL (ler), Yakalama / Karşılaştırma ve Zaman İşleme Birimleri gibi imers.
  • Ayrık IO aka Genel Amaçlı Giriş / Çıkış (GPIO)
  • Analogdan Dijitale / Dijitale Analog (ADC / DAC)
  • JTAG, ISP, ICSP, BDM Port, BITP ve DP9 portları gibi hata ayıklama

Mikrodenetleyici Seçme Kriterleri

Bir mikro denetleyici seçerken, eldeki görevi karşıladığından ve uygun maliyetli olduğundan emin olun. Bir görevin bilgi işlem ihtiyaçlarını 8 bit, 16 bit veya 32 bit mikro denetleyicinin en iyi şekilde karşılayıp karşılayamayacağını görmeliyiz. Ek olarak, bir mikrodenetleyici seçerken aşağıdaki noktalar akılda tutulmalıdır -

  • Speed - Mikrodenetleyicinin destekleyebileceği en yüksek hız nedir?

  • Packaging- 40-pin DIP (Dual-inline-paket) veya QFP (Quad flat paket) mı? Bu, son ürünün yer, montaj ve prototipleme açısından önemlidir.

  • Power Consumption - Bu, pille çalışan ürünler için önemli bir kriterdir.

  • Amount of RAM and ROM çipte.

  • Count of I/O pins and Timers çipte.

  • Cost per Unit - Mikrodenetleyicinin kullanılacağı ürünün nihai maliyeti açısından önemlidir.

Ayrıca, mikrodenetleyicide derleyiciler, hata ayıklayıcılar ve derleyiciler gibi araçlara sahip olduğunuzdan emin olun. En önemlisi, güvenilir bir kaynaktan bir mikrodenetleyici satın almalısınız.

8051'in Kısa Tarihi

İlk mikroişlemci 4004 Intel Corporation tarafından icat edildi. 8085 ve 8086mikroişlemciler de Intel tarafından icat edildi. 1981'de Intel, 8 bitlik bir mikro denetleyiciyi tanıttı.8051. Olarak anıldısystem on a chip because it had 128 bytes of RAM, 4K byte of on-chip ROM, two timers, one serial port, and 4 ports (8-bit wide), all on a single chip. When it became widely popular, Intel allowed other manufacturers to make and market different flavors of 8051 with its code compatible with 8051. It means that if you write your program for one flavor of 8051, it will run on other flavors too, regardless of the manufacturer. This has led to several versions with different speeds and amounts of on-chip RAM.

8051 Flavors / Members

  • 8052 microcontroller − 8052 has all the standard features of the 8051 microcontroller as well as an extra 128 bytes of RAM and an extra timer. It also has 8K bytes of on-chip program ROM instead of 4K bytes.

  • 8031 microcontroller − It is another member of the 8051 family. This chip is often referred to as a ROM-less 8051, since it has 0K byte of on-chip ROM. You must add external ROM to it in order to use it, which contains the program to be fetched and executed. This program can be as large as 64K bytes. But in the process of adding external ROM to the 8031, it lost 2 ports out of 4 ports. To solve this problem, we can add an external I/O to the 8031

Comparison between 8051 Family Members

The following table compares the features available in 8051, 8052, and 8031.

Feature 8051 8052 8031
ROM(bytes) 4K 8K 0K
RAM(bytes) 128 256 128
Timers 2 3 2
I/O pins 32 32 32
Serial port 1 1 1
Interrupt sources 6 8 6

Features of 8051 Microcontroller

An 8051 microcontroller comes bundled with the following features −

  • 4KB bytes on-chip program memory (ROM)
  • 128 bytes on-chip data memory (RAM)
  • Four register banks
  • 128 user defined software flags
  • 8-bit bidirectional data bus
  • 16-bit unidirectional address bus
  • 32 general purpose registers each of 8-bit
  • 16 bit Timers (usually 2, but may have more or less)
  • Three internal and two external Interrupts
  • Four 8-bit ports,(short model have two 8-bit ports)
  • 16-bit program counter and data pointer
  • 8051 may also have a number of special features such as UARTs, ADC, Op-amp, etc.

Block Diagram of 8051 Microcontroller

The following illustration shows the block diagram of an 8051 microcontroller −

In 8051, I/O operations are done using four ports and 40 pins. The following pin diagram shows the details of the 40 pins. I/O operation port reserves 32 pins where each port has 8 pins. The other 8 pins are designated as Vcc, GND, XTAL1, XTAL2, RST, EA (bar), ALE/PROG (bar), and PSEN (bar).

It is a 40 Pin PDIP (Plastic Dual Inline Package)

Note − In a DIP package, you can recognize the first pin and the last pin by the cut at the middle of the IC. The first pin is on the left of this cut mark and the last pin (i.e. the 40th pin in this case) is to the right of the cut mark.

I/O Ports and their Functions

The four ports P0, P1, P2, and P3, each use 8 pins, making them 8-bit ports. Upon RESET, all the ports are configured as inputs, ready to be used as input ports. When the first 0 is written to a port, it becomes an output. To reconfigure it as an input, a 1 must be sent to a port.

Port 0 (Pin No 32 – Pin No 39)

It has 8 pins (32 to 39). It can be used for input or output. Unlike P1, P2, and P3 ports, we normally connect P0 to 10K-ohm pull-up resistors to use it as an input or output port being an open drain.

It is also designated as AD0-AD7, allowing it to be used as both address and data. In case of 8031 (i.e. ROMless Chip), when we need to access the external ROM, then P0 will be used for both Address and Data Bus. ALE (Pin no 31) indicates if P0 has address or data. When ALE = 0, it provides data D0-D7, but when ALE = 1, it has address A0-A7. In case no external memory connection is available, P0 must be connected externally to a 10K-ohm pull-up resistor.

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 (Pin 1 through 8)

It is an 8-bit port (pin 1 through 8) and can be used either as input or output. It doesn't require pull-up resistors because they are already connected internally. Upon reset, Port 1 is configured as an input port. The following code can be used to send alternating values of 55H and AAH to Port 1.

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

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

If Port 1 is configured to be used as an output port, then to use it as an input port again, program it by writing 1 to all of its bits as in the following code.

;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 (Pins 21 through 28)

Port 2 occupies a total of 8 pins (pins 21 through 28) and can be used for both input and output operations. Just as P1 (Port 1), P2 also doesn't require external Pull-up resistors because they are already connected internally. It must be used along with P0 to provide the 16-bit address for the external memory. So it is also designated as (A0–A7), as shown in the pin diagram. When the 8051 is connected to an external memory, it provides path for upper 8-bits of 16-bits address, and it cannot be used as I/O. Upon reset, Port 2 is configured as an input port. The following code can be used to send alternating values of 55H and AAH to port 2.

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

If Port 2 is configured to be used as an output port, then to use it as an input port again, program it by writing 1 to all of its bits as in the following code.

;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 (Pins 10 through 17)

It is also of 8 bits and can be used as Input/Output. This port provides some extremely important signals. P3.0 and P3.1 are RxD (Receiver) and TxD (Transmitter) respectively and are collectively used for Serial Communication. P3.2 and P3.3 pins are used for external interrupts. P3.4 and P3.5 are used for timers T0 and T1 respectively. P3.6 and P3.7 are Write (WR) and Read (RD) pins. These are active low pins, means they will be active when 0 is given to them and these are used to provide Read and Write operations to External ROM in 8031 based systems.

P3 Bit Function Pin
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < Complement of INT0 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < Complement of RD 17

Dual Role of Port 0 and Port 2

  • Dual role of Port 0 − Port 0 is also designated as AD0–AD7, as it can be used for both data and address handling. While connecting an 8051 to external memory, Port 0 can provide both address and data. The 8051 microcontroller then multiplexes the input as address or data in order to save pins.

  • Dual role of Port 2 − Besides working as I/O, Port P2 is also used to provide 16-bit address bus for external memory along with Port 0. Port P2 is also designated as (A8– A15), while Port 0 provides the lower 8-bits via A0–A7. In other words, we can say that when an 8051 is connected to an external memory (ROM) which can be maximum up to 64KB and this is possible by 16 bit address bus because we know 216 = 64KB. Port2 is used for the upper 8-bit of the 16 bits address, and it cannot be used for I/O and this is the way any Program code of external ROM is addressed.

Hardware Connection of Pins

  • Vcc − Pin 40 provides supply to the Chip and it is +5 V.

  • Gnd − Pin 20 provides ground for the Reference.

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19) − 8051 has on-chip oscillator but requires external clock to run it. A quartz crystal is connected between the XTAL1 & XTAL2 pin of the chip. This crystal also needs two capacitors of 30pF for generating a signal of desired frequency. One side of each capacitor is connected to ground. 8051 IC is available in various speeds and it all depends on this Quartz crystal, for example, a 20 MHz microcontroller requires a crystal with a frequency no more than 20 MHz.

  • RST (Pin No. 9) − It is an Input pin and active High pin. Upon applying a high pulse on this pin, that is 1, the microcontroller will reset and terminate all activities. This process is known as Power-On Reset. Activating a power-on reset will cause all values in the register to be lost. It will set a program counter to all 0's. To ensure a valid input of Reset, the high pulse must be high for a minimum of two machine cycles before it is allowed to go low, which depends on the capacitor value and the rate at which it charges. (Machine Cycle is the minimum amount of frequency a single instruction requires in execution).

  • EA or External Access (Pin No. 31) − It is an input pin. This pin is an active low pin; upon applying a low pulse, it gets activated. In case of microcontroller (8051/52) having on-chip ROM, the EA (bar) pin is connected to Vcc. But in an 8031 microcontroller which does not have an on-chip ROM, the code is stored in an external ROM and then fetched by the microcontroller. In this case, we must connect the (pin no 31) EA to Gnd to indicate that the program code is stored externally.

  • PSEN or Program store Enable (Pin No 29) − This is also an active low pin, i.e., it gets activated after applying a low pulse. It is an output pin and used along with the EA pin in 8031 based (i.e. ROMLESS) Systems to allow storage of program code in external ROM.

  • ALE or (Address Latch Enable) − This is an Output Pin and is active high. It is especially used for 8031 IC to connect it to the external memory. It can be used while deciding whether P0 pins will be used as Address bus or Data bus. When ALE = 1, then the P0 pins work as Data bus and when ALE = 0, then the P0 pins act as Address bus.

I/O Ports and Bit Addressability

It is a most widely used feature of 8051 while writing code for 8051. Sometimes we need to access only 1 or 2 bits of the port instead of the entire 8-bits. 8051 provides the capability to access individual bits of the ports.

While accessing a port in a single-bit manner, we use the syntax "SETB X. Y" where X is the port number (0 to 3), and Y is a bit number (0 to 7) for data bits D0-D7 where D0 is the LSB and D7 is the MSB. For example, "SETB P1.5" sets high bit 5 of port 1.

The following code shows how we can toggle the bit P1.2 continuously.

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

Single-Bit Instructions

Instructions Function
SETB bit Set the bit (bit = 1)
CLR bit clear the bit (bit = 0)
CPL bit complement the bit (bit = NOT bit)
JB bit, target jump to target if bit = 1 (jump if bit)
JNB bit, target jump to target if bit = 0 (jump if no bit)
JBC bit, target jump to target if bit = 1, clear bit (jump if bit, then clear)

Program Counter

The Program Counter is a 16- or 32-bit register which contains the address of the next instruction to be executed. The PC automatically increments to the next sequential memory location every time an instruction is fetched. Branch, jump, and interrupt operations load the Program Counter with an address other than the next sequential location.

Activating a power-on reset will cause all values in the register to be lost. It means the value of the PC (program counter) is 0 upon reset, forcing the CPU to fetch the first opcode from the ROM memory location 0000. It means we must place the first byte of upcode in ROM location 0000 because that is where the CPU expects to find the first instruction

Reset Vector

The significance of the reset vector is that it points the processor to the memory address which contains the firmware's first instruction. Without the Reset Vector, the processor would not know where to begin execution. Upon reset, the processor loads the Program Counter (PC) with the reset vector value from a predefined memory location. On CPU08 architecture, this is at location $FFFE:$FFFF.

When the reset vector is not necessary, developers normally take it for granted and don’t program into the final image. As a result, the processor doesn't start up on the final product. It is a common mistake that takes place during the debug phase.

Stack Pointer

Stack is implemented in RAM and a CPU register is used to access it called SP (Stack Pointer) register. SP register is an 8-bit register and can address memory addresses of range 00h to FFh. Initially, the SP register contains value 07 to point to location 08 as the first location being used for the stack by the 8051.

When the content of a CPU register is stored in a stack, it is called a PUSH operation. When the content of a stack is stored in a CPU register, it is called a POP operation. In other words, a register is pushed onto the stack to save it and popped off the stack to retrieve it.

Infinite Loop

An infinite loop or an endless loop can be identified as a sequence of instructions in a computer program that executes endlessly in a loop, because of the following reasons −

  • loop with no terminating condition.
  • loop with a terminating condition that can never be met.
  • loop with a terminating condition that causes the loop to start over.

Such infinite loops normally caused older operating systems to become unresponsive, as an infinite loop consumes all the available processor time. I/O operations waiting for user inputs are also called "infinite loops". One possible cause of a computer "freezing" is an infinite loop; other causes include deadlock and access violations.

Embedded systems, unlike a PC, never "exit" an application. They idle through an Infinite Loop waiting for an event to take place in the form of an interrupt, or a pre-scheduled task. In order to save power, some processors enter special sleep or wait modes instead of idling through an Infinite Loop, but they will come out of this mode upon either a timer or an External Interrupt.

Interrupts

Interrupts are mostly hardware mechanisms that instruct the program that an event has occurred. They may occur at any time, and are therefore asynchronous to the program flow. They require special handling by the processor, and are ultimately handled by a corresponding Interrupt Service Routine (ISR). Interrupts need to be handled quickly. If you take too much time servicing an interrupt, then you may miss another interrupt.

Little Endian Vs Big Endian

Although numbers are always displayed in the same way, they are not stored in the same way in memory. Big-Endian machines store the most significant byte of data in the lowest memory address. A Big-Endian machine stores 0x12345678 as −

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

Little-Endian machines, on the other hand, store the least significant byte of data in the lowest memory address. A Little-Endian machine stores 0x12345678 as −

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

Assembly languages were developed to provide mnemonics or symbols for the machine level code instructions. Assembly language programs consist of mnemonics, thus they should be translated into machine code. A program that is responsible for this conversion is known as assembler. Assembly language is often termed as a low-level language because it directly works with the internal structure of the CPU. To program in assembly language, a programmer must know all the registers of the CPU.

Different programming languages such as C, C++, Java and various other languages are called high-level languages because they do not deal with the internal details of a CPU. In contrast, an assembler is used to translate an assembly language program into machine code (sometimes also called object code or opcode). Similarly, a compiler translates a high-level language into machine code. For example, to write a program in C language, one must use a C compiler to translate the program into machine language.

Structure of Assembly Language

An assembly language program is a series of statements, which are either assembly language instructions such as ADD and MOV, or statements called directives.

An instruction tells the CPU what to do, while a directive (also called pseudo-instructions) gives instruction to the assembler. For example, ADD and MOV instructions are commands which the CPU runs, while ORG and END are assembler directives. The assembler places the opcode to the memory location 0 when the ORG directive is used, while END indicates to the end of the source code. A program language instruction consists of the following four fields −

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

A square bracket ( [ ] ) indicates that the field is optional.

  • The label field allows the program to refer to a line of code by name. The label fields cannot exceed a certain number of characters.

  • The mnemonics and operands fields together perform the real work of the program and accomplish the tasks. Statements like ADD A , C & MOV C, #68 where ADD and MOV are the mnemonics, which produce opcodes ; "A, C" and "C, #68" are operands. These two fields could contain directives. Directives do not generate machine code and are used only by the assembler, whereas instructions are translated into machine code for the CPU to execute.

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
  • The comment field begins with a semicolon which is a comment indicator.

  • Notice the Label "HERE" in the program. Any label which refers to an instruction should be followed by a colon.

Assembling and Running an 8051 Program

Here we will discuss about the basic form of an assembly language. The steps to create, assemble, and run an assembly language program are as follows −

  • First, we use an editor to type in a program similar to the above program. Editors like MS-DOS EDIT program that comes with all Microsoft operating systems can be used to create or edit a program. The Editor must be able to produce an ASCII file. The "asm" extension for the source file is used by an assembler in the next step.

  • The "asm" source file contains the program code created in Step 1. It is fed to an 8051 assembler. The assembler then converts the assembly language instructions into machine code instructions and produces an .obj file (object file) and a .lst file (list file). It is also called as a source file, that's why some assemblers require that this file have the "src" extensions. The "lst" file is optional. It is very useful to the program because it lists all the opcodes and addresses as well as errors that the assemblers detected.

  • Assemblers require a third step called linking. The link program takes one or more object files and produces an absolute object file with the extension "abs".

  • Next, the "abs" file is fed to a program called "OH" (object to hex converter), which creates a file with the extension "hex" that is ready to burn in to the ROM.

Data Type

The 8051 microcontroller contains a single data type of 8-bits, and each register is also of 8-bits size. The programmer has to break down data larger than 8-bits (00 to FFH, or to 255 in decimal) so that it can be processed by the CPU.

DB (Define Byte)

The DB directive is the most widely used data directive in the assembler. It is used to define the 8-bit data. It can also be used to define decimal, binary, hex, or ASCII formats data. For decimal, the "D" after the decimal number is optional, but it is required for "B" (binary) and "Hl" (hexadecimal).

To indicate ASCII, simply place the characters in quotation marks ('like this'). The assembler generates ASCII code for the numbers/characters automatically. The DB directive is the only directive that can be used to define ASCII strings larger than two characters; therefore, it should be used for all the ASCII data definitions. Some examples of DB are given below −

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

Either single or double quotes can be used around ASCII strings. DB is also used to allocate memory in byte-sized chunks.

Assembler Directives

Some of the directives of 8051 are as follows −

  • ORG (origin) − The origin directive is used to indicate the beginning of the address. It takes the numbers in hexa or decimal format. If H is provided after the number, the number is treated as hexa, otherwise decimal. The assembler converts the decimal number to hexa.

  • EQU (equate) − It is used to define a constant without occupying a memory location. EQU associates a constant value with a data label so that the label appears in the program, its constant value will be substituted for the label. While executing the instruction "MOV R3, #COUNT", the register R3 will be loaded with the value 25 (notice the # sign). The advantage of using EQU is that the programmer can change it once and the assembler will change all of its occurrences; the programmer does not have to search the entire program.

  • END directive − It indicates the end of the source (asm) file. The END directive is the last line of the program; anything after the END directive is ignored by the assembler.

Labels in Assembly Language

All the labels in assembly language must follow the rules given below −

  • Each label name must be unique. The names used for labels in assembly language programming consist of alphabetic letters in both uppercase and lowercase, number 0 through 9, and special characters such as question mark (?), period (.), at the rate @, underscore (_), and dollar($).

  • The first character should be in alphabetical character; it cannot be a number.

  • Reserved words cannot be used as a label in the program. For example, ADD and MOV words are the reserved words, since they are instruction mnemonics.

Kayıtlar CPU'da, işlenecek veriler veya alınacak verilere işaret eden bir adres olabilecek bilgileri geçici olarak depolamak için kullanılır. 8051'de, MSB (en anlamlı bit) D7'den LSB'ye (en az anlamlı bit) D0'a kadar 8 bitlik bir veri türü vardır. 8 bit veri türü ile, 8 bitten büyük herhangi bir veri türü işlenmeden önce 8 bitlik parçalara bölünmelidir.

8051'in en yaygın kullanılan yazmaçları A (akümülatör), B, R0-R7, DPTR (veri işaretçisi) ve PC'dir (program sayacı). DPTR ve PC dışında tüm bu yazmaçlar 8 bittir.

8051'de Depolama Kayıtları

Aşağıdaki depolama kaydı türlerini burada tartışacağız -

  • Accumulator
  • R kaydı
  • B kaydı
  • Veri İşaretçisi (DPTR)
  • Program Sayacı (PC)
  • Yığın İşaretçisi (SP)

Akümülatör

Akümülatör, kayıt A, tüm aritmetik ve mantık işlemleri için kullanılır. Akümülatör yoksa, her hesaplamanın her sonucu (toplama, çarpma, kaydırma vb.) Ana belleğe kaydedilecektir. Ana belleğe erişim, akümülatör gibi bir yazmacıya erişimden daha yavaştır çünkü büyük ana bellek için kullanılan teknoloji, bir yazmaç için kullanılandan daha yavaştır (ancak daha ucuzdur).

"R" Kayıtları

"R" kayıtları, R0, R1 ila R7 olmak üzere sekiz kayıtlık bir settir. Bu kayıtlar, birçok işlemde yardımcı veya geçici depolama kayıtları olarak işlev görür. 10 ve 20 toplamının bir örneğini düşünün. Bir 10 değişkenini bir akümülatörde ve başka bir 20 değişkenini, örneğin R4 kaydında saklayın. Ekleme işlemini işlemek için aşağıdaki komutu yürütün -

ADD A,R4

Bu talimatı uyguladıktan sonra, akümülatör 30 değerini içerecektir. Bu nedenle "R" kayıtları çok önemlidir yardımcı veya helper registers. Biriktirici, bu "R" kayıtları için olmasaydı, tek başına çok kullanışlı olmazdı. "R" kayıtları, değerlerin geçici olarak depolanması içindir.

Başka bir örnek alalım. R1 ve R2'deki değerleri toplayıp daha sonra sonuçtan R3 ve R4 değerlerini çıkaracağız.

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)

Gördüğünüz gibi, geçici olarak R3 ve R4 toplamını tutmak için R5 kullandık. Elbette, bu (R1 + R2) - (R3 + R4) 'ü hesaplamanın en verimli yolu değildir, ancak değerleri geçici olarak depolamanın bir yolu olarak "R" kayıtlarının kullanımını göstermektedir.

"B" Kaydı

"B" kaydı, 8 bitlik (1 baytlık) bir değeri tutabilmesi açısından Akümülatöre çok benzer. "B" kaydı yalnızca iki 8051 talimatı tarafından kullanılır:MUL AB ve DIV AB. A'yı başka bir sayı ile hızlı ve kolay bir şekilde çarpmak veya bölmek için, diğer sayıyı "B" ye kaydedebilir ve bu iki talimattan yararlanabilirsiniz. MUL ve DIV komutlarının kullanılmasının yanı sıra, "B" yazmacı, genellikle dokuzuncu R yazmacı gibi başka bir geçici depolama kaydı olarak kullanılır.

Veri İşaretçisi

Veri İşaretçisi (DPTR), 8051'in kullanıcı tarafından erişilebilen tek 16 bitlik (2 bayt) kaydıdır. Akümülatör, R0 – R7 kayıtları ve B kaydı 1 baytlık değer kayıtlarıdır. DPTR, verilere işaret etmek içindir. 8051 tarafından DPTR tarafından belirtilen adresi kullanarak harici belleğe erişmek için kullanılır. DPTR, mevcut tek 16 bitlik kayıttır ve genellikle 2 baytlık değerleri depolamak için kullanılır.

Program Sayacı

Program Sayacı (PC) 2 baytlık bir adrestir ve 8051'e bir sonraki yürütülecek komutun bellekte nerede bulunabileceğini söyler. PC, 8051 başlatıldığında 0000h'de başlar ve bir komut yürütüldükten sonra her seferinde artırılır. PC her zaman 1 artmaz. Bazı talimatlar 2 veya 3 bayt gerektirebilir; bu gibi durumlarda, PC 2 veya 3 artırılacaktır.

Branch, jump, ve interruptişlemler, Program Sayacını sonraki sıralı konumdan farklı bir adresle yükler. Açılışta sıfırlamanın etkinleştirilmesi, kayıt defterindeki tüm değerlerin kaybolmasına neden olacaktır. Bu, sıfırlama üzerine PC'nin değerinin 0 olduğu anlamına gelir ve CPU'yu 0000 ROM konumundan ilk işlem kodunu almaya zorlar. Bu, yukarı kodun ilk baytını 0000 ROM konumuna yerleştirmemiz gerektiği anlamına gelir, çünkü CPU bu ilk talimat.

Yığın İşaretçisi (SP)

Yığın İşaretçisi, DPTR ve PC dışındaki tüm kayıtlar gibi 8 bitlik (1 bayt) bir değer tutabilir. Yığın İşaretçisi, bir sonraki değerin yığından kaldırılacağı konumu belirtir. Yığına bir değer itildiğinde, SP'nin değeri artırılır ve ardından değer, sonuçtaki bellek konumunda depolanır. Yığından bir değer çıkarıldığında, değer SP ile gösterilen bellek konumundan döndürülür ve ardından SP'nin değeri azaltılır.

Bu işlem sırası önemlidir. 8051 başlatıldığında SP 07h olarak başlatılacaktır. Yığın üzerine aynı anda bir değer itilirse, değer dahili RAM adresi 08h'de saklanacaktır çünkü 8051 önce SP değerini artıracak (07h'den 08h'ye) ve sonra basılan değeri bu bellekte saklayacaktır. adres (08h). SP altı talimatla doğrudan 8051 tarafından değiştirilir: PUSH, POP, ACALL, LCALL, RET ve RETI.

8051'de ROM Alanı

8051'in bazı aile üyeleri yalnızca 4K bayt çip üzerinde ROM'a sahiptir (örn. 8751, AT8951); bazıları AT89C52 gibi 8K ROM'a sahiptir ve Dallas Semiconductor gibi 32K byte ve 64K byte on-chip ROM'a sahip bazı aile üyeleri vardır. Hatırlanması gereken nokta, 8051 ailesinin hiçbir üyesinin 64K bayttan fazla opcode'a erişemeyeceğidir, çünkü 8051'deki program sayacı 16 bitlik bir kayıttır (0000 - FFFF adresi).

8051 içindeki program ROM'unun ilk konumu 0000H adresine sahipken, son konum çip üzerindeki ROM'un boyutuna bağlı olarak farklı olabilir. 8051 aile üyeleri arasında AT8951, 0000 (ilk konum) ila 0FFFH (son konum) arasında bir bellek adresine sahip $ k bayt çip üzerinde ROM'a sahiptir.

8051 Bayrak Bitleri ve PSW Kaydı

Program durum kelimesi (PSW) kaydı, 8 bitlik bir kayıttır, aynı zamanda flag register. 8 bit genişliğindedir, ancak yalnızca 6 biti kullanılır. Kullanılmayan iki bituser-defined flags. Bayraklardan dördü çağrıldıconditional flagsbu, bir talimatın yerine getirilmesinden sonra ortaya çıkan bir koşulu gösterdikleri anlamına gelir. Bu dördüCY (Taşımak), AC (yardımcı taşıma), P (parite) ve OV(taşma). RS0 ve RS1 bitleri banka kayıtlarını değiştirmek için kullanılır. Aşağıdaki şekil program durum kelime kaydını gösterir.

PSW Kaydı, CPU'nun mevcut durumunu yansıtan durum bitlerini içerir.

CY CA F0 RS1 RS0 OV - P

CY PSW.7 Taşıma Bayrağı
AC PSW.6 Yardımcı Taşıma Bayrağı
F0 PSW.5 Genel amaçlı kullanıcı için 0 işaretleyin.
RS1 PSW.4 Banka seçici bit 1'i kaydedin
RS0 PSW.3 Banka seçici bit 0'ı kaydedin
OV PSW.2 Taşma İşareti
- PSW.1 Kullanıcı tanımlı BAYRAK
P PSW.0 Parite BAYRAĞI. Akümülatördeki 1 bitin çift / tek sayısını belirtmek için komut döngüsü sırasında donanım tarafından ayarlanır / temizlenir.

RS0 ve RS1 bitlerini kullanarak karşılık gelen Register Bank bitini seçebiliriz.

RS1 RS2 Kayıt Bankası 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- Bu taşıma bayrağı, D7 bitinden bir gerçekleştirme olduğunda (1) ayarlanır. 8 bitlik bir toplama veya çıkarma işleminden sonra etkilenir. Ayrıca "SETB C" ve "CLR C" gibi bir komutla doğrudan 1 veya 0'a sıfırlanabilir, burada "SETB" set bit taşıma anlamına gelir ve "CLR" net taşıma anlamına gelir.

  • AC, auxiliary carry flag- Bir ADD veya SUB işlemi sırasında D3 ve D4'ten bir taşıma varsa, AC biti ayarlanır; aksi takdirde temizlenir. İkili kodlu ondalık aritmetik yapmak için komut için kullanılır.

  • P, the parity flag- Eşlik bayrağı, yalnızca akümülatör yazmacındaki 1'lerin sayısını temsil eder. A kaydı tek sayıda 1'ler içeriyorsa, P = 1; ve çift sayı 1'ler için P = 0.

  • OV, the overflow flag- Bu bayrak, işaretli sayı işleminin sonucu çok büyük olduğunda, yüksek sıralı bitin işaret bitine taşmasına neden olduğunda ayarlanır. Yalnızca işaretli aritmetik işlemlerde hataları tespit etmek için kullanılır.

Misal

Aşağıdaki talimatta 9CH ve 64H eklendikten sonra CY, AC ve P bayraklarının durumunu gösterin.

MOV A, # 9CH

A EKLE, # 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

8051 mikro denetleyici toplam 128 bayt RAM'e sahiptir. Bu 128 baytlık RAM'in tahsisini tartışacağız ve yığın ve kayıt olarak kullanımlarını inceleyeceğiz.

8051'de RAM Bellek Alanı Tahsisi

8051 içindeki 128 bayt RAM, 00 ile 7FH arasında adres olarak atanır. Doğrudan bellek konumları olarak erişilebilirler ve aşağıdaki gibi üç farklı gruba ayrılırlar -

  • 00H'den 1FH'ye kadar 32 bayt, kayıt bankaları ve yığın için ayrılmıştır.

  • 20H'den 2FH'ye kadar 16 bayt, bit adresli okuma / yazma belleği için bir kenara ayrılmıştır.

  • Okuma ve yazma depolaması için 30H'den 7FH'ye kadar 80 bayt kullanılır; diye adlandırılırscratch pad. Bu 80 konumlu RAM, verileri ve parametreleri depolamak amacıyla 8051 programcı tarafından yaygın olarak kullanılmaktadır.

8051'de Bankaları Kaydet

Kayıt bankaları ve yığın için toplam 32 bayt RAM ayrılmıştır. Bu 32 bayt, her bankanın 8 kayıt, R0 – R7 olduğu dört kayıt bankasına bölünmüştür. 0'dan 7'ye kadar RAM konumları, R0 – R7'nin 0 bankası için ayrılır; burada R0, RAM konumu 0'dır, R1, RAM konumu 1'dir, R2, konum 2'dir ve bu, kümenin R7'sine ait olan bellek konumu 7'ye kadar 0.

R0 – R7 kayıtlarının ikinci bankası RAM konumu 08'de başlar ve OFH konumlarına gider. R0 – R7'nin üçüncü bankası hafıza konumu 10H'de başlar ve konuma 17H'ye gider. Son olarak, 18H ila 1FH arasındaki RAM konumları, R0 – R7'nin dördüncü bankası için ayrılmıştır.

Varsayılan Kayıt Bankası

Dört yazmaç bankası için RAM konumları 00–1F bir kenara bırakılırsa, 8051 çalıştırıldığında R0 – R7'nin hangi kayıt bankasına erişebilir miyiz? Cevap, kayıt bankası 0; yani, 8051 programlanırken 0 ila 7 arasındaki RAM konumlarına R0 ila R7 adlarıyla erişilir. Çünkü bu RAM konumlarına, bellek konumlarından ziyade R0 ila R7 gibi adlarla başvurmak çok daha kolaydır.

Kayıt Bankaları Nasıl Değiştirilir

Kayıt bankası 0, 8051 çalıştırıldığında varsayılandır. PSW kaydını kullanarak diğer bankalara geçebiliriz. PSW'nin D4 ve D3 bitleri, istenen kayıt bankasını seçmek için kullanılır, çünkü bunlara, bit adreslenebilir komutlar SETB ve CLR ile erişilebilirler. Örneğin, "SETB PSW.3", PSW.3 = 1 olarak ayarlanacak ve banka kaydı 1'i seçecektir.

RS1 RS2 Banka Seçildi
0 0 Banka0
0 1 Banka1
1 0 Banka2
1 1 Banka3

Yığın ve İşlemleri

8051'de yığın

Yığın, veri veya bellek adresi gibi bilgileri geçici olarak depolamak için CPU tarafından kullanılan bir RAM bölümüdür. CPU, sınırlı sayıda kayıt dikkate alındığında bu depolama alanına ihtiyaç duyar.

Yığınlara Nasıl Erişilir

Yığın, bir RAM'in bir bölümü olduğundan, CPU'nun içinde ona işaret edecek kayıtlar vardır. Yığına erişmek için kullanılan yazmaç, yığın işaretçisi kaydı olarak bilinir. 8051'deki yığın işaretçisi 8 bit genişliğindedir ve 00'dan FFH'ye kadar bir değer alabilir. 8051 başlatıldığında, SP kaydı 07H değerini içerir. Bu, RAM konumunun 08 yığın için kullanılan ilk konum olduğu anlamına gelir. Yığındaki bir CPU kaydının depolama işlemi,PUSHve içeriği yığından bir CPU kaydına geri almak, POP.

Yığın içine itme

8051'de, yığın işaretçisi (SP) yığının son kullanılan konumuna işaret eder. Veriler yığına itildiğinde, yığın işaretçisi (SP) 1 artar. PUSH yürütüldüğünde, yazmacının içeriği yığına kaydedilir ve SP 1 artar. Kayıtları yığına itmek için, biz RAM adreslerini kullanmalıdır. Örneğin, "PUSH 1" talimatı R1 yazmacını yığına iter.

Yığından Patlama

Yığının içeriğini belirli bir kayda geri döndürmek, itme işleminin tersidir. Her pop işleminde, yığının üst baytı komut tarafından belirtilen kayıt defterine kopyalanır ve yığın göstergesi bir kez azaltılır.

Program akışı, bir kontrol transfer komutu yürütülmediği sürece, bir komuttan diğerine sıralı bir şekilde ilerler. Montaj dilinde çeşitli kontrol aktarım talimatı türleri, koşullu veya koşulsuz atlamaları ve çağrı talimatlarını içerir.

Döngü ve Atlama Talimatları

8051'de döngü

Bir dizi talimatın belirli sayıda tekrarlanmasına loop. Bir talimatDJNZ reg, labelDöngü işlemi gerçekleştirmek için kullanılır. Bu komutta, bir kayıt 1 azaltılır; sıfır değilse, 8051 etiket tarafından belirtilen hedef adrese atlar.

Kayıt, döngünün başlangıcından önceki tekrar sayısı için sayaç ile yüklenir. Bu talimatta, hem yazmaç azaltma hem de atlama kararı tek bir talimatta birleştirilmiştir. Kayıtlar R0 – R7'den herhangi biri olabilir. Sayaç ayrıca bir RAM konumu olabilir.

Misal

Multiply 25 by 10 using the technique of repeated addition.

Solution- Çarpma, çarpan kadar çok sayıda çarpan ve tekrar tekrar eklenerek elde edilebilir. Örneğin,

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 - Talimatla döngüleme eylemi DJNZ Reg labelyalnızca 256 yineleme ile sınırlıdır. Koşullu bir atlama yapılmazsa, atlamayı izleyen talimat yürütülür.

Bir Döngü İçinde Döngü

Başka bir döngü içinde bir döngü kullandığımızda, buna a nested loop. Maksimum sayı 256 ile sınırlı olduğunda sayımı tutmak için iki yazmaç kullanılır. Bu nedenle, eylemi 256'dan daha fazla tekrarlamak için bu yöntemi kullanırız.

Example

Bir program yaz -

  • Akümülatörü 55H değeriyle yükleyin.
  • ACC'yi 700 kez tamamlayın.

Solution- 700 255'ten büyük olduğundan (herhangi bir kaydın maksimum kapasitesi), sayımı tutmak için iki kayıt kullanılır. Aşağıdaki kod, sayı için iki yazmaç, R2 ve R3'ün nasıl kullanılacağını gösterir.

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

Diğer Koşullu Atlamalar

Aşağıdaki tablo 8051'de kullanılan koşullu sıçramaları listeler -

Talimat Aksiyon
JZ A = 0 ise atla
JNZ A ≠ 0 ise atla
DJNZ Kayıt ≠ 0 ise Azalt ve Atla
CJNE A, veri A ≠ verisi ise atla
CJNE reg, #data Bayt ≠ veri ise atla
JC CY = 1 ise atla
JNC Jump if CY ≠ 1
JB Jump if bit = 1
JNB Jump if bit = 0
JBC Jump if bit = 1 and clear bit
  • JZ (jump if A = 0) − In this instruction, the content of the accumulator is checked. If it is zero, then the 8051 jumps to the target address. JZ instruction can be used only for the accumulator, it does not apply to any other register.

  • JNZ (jump if A is not equal to 0) − In this instruction, the content of the accumulator is checked to be non-zero. If it is not zero, then the 8051 jumps to the target address.

  • JNC (Jump if no carry, jumps if CY = 0) − The Carry flag bit in the flag (or PSW) register is used to make the decision whether to jump or not "JNC label". The CPU looks at the carry flag to see if it is raised (CY = 1). If it is not raised, then the CPU starts to fetch and execute instructions from the address of the label. If CY = 1, it will not jump but will execute the next instruction below JNC.

  • JC (Jump if carry, jumps if CY = 1) − If CY = 1, it jumps to the target address.

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note − It must be noted that all conditional jumps are short jumps, i.e., the address of the target must be within –128 to +127 bytes of the contents of the program counter.

Unconditional Jump Instructions

There are two unconditional jumps in 8051 −

  • LJMP (long jump) − LJMP is 3-byte instruction in which the first byte represents opcode, and the second and third bytes represent the 16-bit address of the target location. The 2-byte target address is to allow a jump to any memory location from 0000 to FFFFH.

  • SJMP (short jump) − It is a 2-byte instruction where the first byte is the opcode and the second byte is the relative address of the target location. The relative address ranges from 00H to FFH which is divided into forward and backward jumps; that is, within –128 to +127 bytes of memory relative to the address of the current PC (program counter). In case of forward jump, the target address can be within a space of 127 bytes from the current PC. In case of backward jump, the target address can be within –128 bytes from the current PC.

Calculating the Short Jump Address

All conditional jumps (JNC, JZ, and DJNZ) are short jumps because they are 2-byte instructions. In these instructions, the first byte represents opcode and the second byte represents the relative address. The target address is always relative to the value of the program counter. To calculate the target address, the second byte is added to the PC of the instruction immediately below the jump. Take a look at the program given below −

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

Backward Jump Target Address Calculation

In case of a forward jump, the displacement value is a positive number between 0 to 127 (00 to 7F in hex). However, for a backward jump, the displacement is a negative value of 0 to –128.

CALL Instructions

CALL is used to call a subroutine or method. Subroutines are used to perform operations or tasks that need to be performed frequently. This makes a program more structured and saves memory space. There are two instructions − LCALL and ACALL.

LCALL (Long Call)

LCALL is a 3-byte instruction where the first byte represents the opcode and the second and third bytes are used to provide the address of the target subroutine. LCALL can be used to call subroutines which are available within the 64K-byte address space of the 8051.

To make a successful return to the point after execution of the called subroutine, the CPU saves the address of the instruction immediately below the LCALL on the stack. Thus, when a subroutine is called, the control is transferred to that subroutine, and the processor saves the PC (program counter) on the stack and begins to fetch instructions from the new location. The instruction RET (return) transfers the control back to the caller after finishing execution of the subroutine. Every subroutine uses RET as the last instruction.

ACALL (Absolute Call)

ACALL is a 2-byte instruction, in contrast to LCALL which is 3 bytes. The target address of the subroutine must be within 2K bytes because only 11 bits of the 2 bytes are used for address. The difference between the ACALL and LCALL is that the target address for LCALL can be anywhere within the 64K-bytes address space of the 8051, while the target address of CALL is within a 2K-byte range.

An addressing mode refers to how you are addressing a given memory location. There are five different ways or five addressing modes to execute this instruction which are as follows −

  • Immediate addressing mode
  • Direct addressing mode
  • Register direct addressing mode
  • Register indirect addressing mode
  • Indexed addressing mode

Immediate Addressing Mode

Let's begin with an example.

MOV A, #6AH

In general, we can write,

MOV A, #data

It is termed as immediate because 8-bit data is transferred immediately to the accumulator (destination operand).

The following illustration describes the above instruction and its execution. The opcode 74H is saved at 0202 address. The data 6AH is saved at 0203 address in the program memory. After reading the opcode 74H, the data at the next program memory address is transferred to accumulator A (E0H is the address of accumulator). Since the instruction is of 2-bytes and is executed in one cycle, the program counter will be incremented by 2 and will point to 0204 of the program memory.

Note − The '#' symbol before 6AH indicates that the operand is a data (8 bit). In the absence of '#', the hexadecimal number would be taken as an address.

Direct Addressing Mode

This is another way of addressing an operand. Here, the address of the data (source data) is given as an operand. Let’s take an example.

MOV A, 04H

The register bank#0 (4th register) has the address 04H. When the MOV instruction is executed, the data stored in register 04H is moved to the accumulator. As the register 04H holds the data 1FH, 1FH is moved to the accumulator.

Note − We have not used '#' in direct addressing mode, unlike immediate mode. If we had used '#', the data value 04H would have been transferred to the accumulator instead of 1FH.

Now, take a look at the following illustration. It shows how the instruction gets executed.

As shown in the above illustration, this is a 2-byte instruction which requires 1 cycle to complete. The PC will be incremented by 2 and will point to 0204. The opcode for the instruction MOV A, address is E5H. When the instruction at 0202 is executed (E5H), the accumulator is made active and ready to receive data. Then the PC goes to the next address as 0203 and looks up the address of the location of 04H where the source data (to be transferred to accumulator) is located. At 04H, the control finds the data 1F and transfers it to the accumulator and hence the execution is completed.

Register Direct Addressing Mode

In this addressing mode, we use the register name directly (as source operand). Let us try to understand with the help of an example.

MOV A, R4

At a time, the registers can take values from R0 to R7. There are 32 such registers. In order to use 32 registers with just 8 variables to address registers, register banks are used. There are 4 register banks named from 0 to 3. Each bank comprises of 8 registers named from R0 to R7.

At a time, a single register bank can be selected. Selection of a register bank is made possible through a Special Function Register (SFR) named Processor Status Word (PSW). PSW is an 8-bit SFR where each bit can be programmed as required. Bits are designated from PSW.0 to PSW.7. PSW.3 and PSW.4 are used to select register banks.

Now, take a look at the following illustration to get a clear understanding of how it works.

Opcode EC is used for MOV A, R4. The opcode is stored at the address 0202 and when it is executed, the control goes directly to R4 of the respected register bank (that is selected in PSW). If register bank #0 is selected, then the data from R4 of register bank #0 will be moved to the accumulator. Here 2F is stored at 04H. 04H represents the address of R4 of register bank #0.

Data (2F) movement is highlighted in bold. 2F is getting transferred to the accumulator from data memory location 0C H and is shown as dotted line. 0CH is the address location of Register 4 (R4) of register bank #1. The instruction above is 1 byte and requires 1 cycle for complete execution. What it means is, you can save program memory by using register direct addressing mode.

Register Indirect Addressing Mode

In this addressing mode, the address of the data is stored in the register as operand.

MOV A, @R0

Here the value inside R0 is considered as an address, which holds the data to be transferred to the accumulator. Example: If R0 has the value 20H, and data 2FH is stored at the address 20H, then the value 2FH will get transferred to the accumulator after executing this instruction. See the following illustration.

So the opcode for MOV A, @R0 is E6H. Assuming that the register bank #0 is selected, the R0 of register bank #0 holds the data 20H. Program control moves to 20H where it locates the data 2FH and it transfers 2FH to the accumulator. This is a 1-byte instruction and the program counter increments by 1 and moves to 0203 of the program memory.

Note − Only R0 and R1 are allowed to form a register indirect addressing instruction. In other words, the programmer can create an instruction either using @R0 or @R1. All register banks are allowed.

Indexed Addressing Mode

We will take two examples to understand the concept of indexed addressing mode. Take a look at the following instructions −

MOVC A, @A+DPTR

and

MOVC A, @A+PC

where DPTR is the data pointer and PC is the program counter (both are 16-bit registers). Consider the first example.

MOVC A, @A+DPTR

The source operand is @A+DPTR. It contains the source data from this location. Here we are adding the contents of DPTR with the current content of the accumulator. This addition will give a new address which is the address of the source data. The data pointed by this address is then transferred to the accumulator.

The opcode is 93H. DPTR has the value 01FE, where 01 is located in DPH (higher 8 bits) and FE is located in DPL (lower 8 bits). Accumulator has the value 02H. Then a 16-bit addition is performed and 01FE H+02H results in 0200 H. Data at the location 0200H will get transferred to the accumulator. The previous value inside the accumulator (02H) will be replaced with the new data from 0200H. The new data in the accumulator is highlighted in the illustration.

This is a 1-byte instruction with 2 cycles needed for execution and the execution time required for this instruction is high compared to previous instructions (which were all 1 cycle each).

The other example MOVC A, @A+PC works the same way as the above example. Instead of adding DPTR with the accumulator, here the data inside the program counter (PC) is added with the accumulator to obtain the target address.

A Special Function Register (or Special Purpose Register, or simply Special Register) is a register within a microprocessor that controls or monitors the various functions of a microprocessor. As the special registers are closely tied to some special function or status of the processor, they might not be directly writable by normal instructions (like add, move, etc.). Instead, some special registers in some processor architectures require special instructions to modify them.

In the 8051, register A, B, DPTR, and PSW are a part of the group of registers commonly referred to as SFR (special function registers). An SFR can be accessed by its name or by its address.

The following table shows a list of SFRs and their addresses.

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

Consider the following two points about the SFR addresses.

  • A special function register can have an address between 80H to FFH. These addresses are above 80H, as the addresses from 00 to 7FH are the addresses of RAM memory inside the 8051.

  • Not all the address space of 80 to FF are used by the SFR. Unused locations, 80H to FFH, are reserved and must not be used by the 8051 programmer.

CY PSW.7 Carry Flag
AC PSW.6 Auxiliary Carry Flag
F0 PSW.5 Flag 0 available to user for general purpose.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Overflow Flag
- PSW.1 User definable FLAG
P PSW.0 Parity FLAG. Set/ cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator.

In the following example, the SFR registers’ names are replaced with their addresses.

CY AC F0 RS1 RS0 OV - P

We can select the corresponding Register Bank bit using RS0 and RS1 bits.

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

The Program Status Word (PSW) contains status bits to reflect the current state of the CPU. The 8051 variants provide one special function register, PSW, with this status information. The 8251 provides two additional status flags, Z and N, which are available in a second special function register called PSW1.

A timer is a specialized type of clock which is used to measure time intervals. A timer that counts from zero upwards for measuring time elapsed is often called a stopwatch. It is a device that counts down from a specified time interval and used to generate a time delay, for example, an hourglass is a timer.

A counter is a device that stores (and sometimes displays) the number of times a particular event or process occurred, with respect to a clock signal. It is used to count the events happening outside the microcontroller. In electronics, counters can be implemented quite easily using register-type circuits such as a flip-flop.

Difference between a Timer and a Counter

The points that differentiate a timer from a counter are as follows −

Timer Counter
The register incremented for every machine cycle. The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1).
Maximum count rate is 1/12 of the oscillator frequency. Maximum count rate is 1/24 of the oscillator frequency.
A timer uses the frequency of the internal clock, and generates delay. A counter uses an external signal to count pulses.

Timers of 8051 and their Associated Registers

The 8051 has two timers, Timer 0 and Timer 1. They can be used as timers or as event counters. Both Timer 0 and Timer 1 are 16-bit wide. Since the 8051 follows an 8-bit architecture, each 16 bit is accessed as two separate registers of low-byte and high-byte.

Timer 0 Register

The 16-bit register of Timer 0 is accessed as low- and high-byte. The low-byte register is called TL0 (Timer 0 low byte) and the high-byte register is called TH0 (Timer 0 high byte). These registers can be accessed like any other register. For example, the instruction MOV TL0, #4H moves the value into the low-byte of Timer #0.

Timer 1 Register

The 16-bit register of Timer 1 is accessed as low- and high-byte. The low-byte register is called TL1 (Timer 1 low byte) and the high-byte register is called TH1 (Timer 1 high byte). These registers can be accessed like any other register. For example, the instruction MOV TL1, #4H moves the value into the low-byte of Timer 1.

TMOD (Timer Mode) Register

Both Timer 0 and Timer 1 use the same register to set the various timer operation modes. It is an 8-bit register in which the lower 4 bits are set aside for Timer 0 and the upper four bits for Timers. In each case, the lower 2 bits are used to set the timer mode in advance and the upper 2 bits are used to specify the location.

Gate − When set, the timer only runs while INT(0,1) is high.

C/T − Counter/Timer select bit.

M1 − Mode bit 1.

M0 − Mode bit 0.

GATE

Every timer has a means of starting and stopping. Some timers do this by software, some by hardware, and some have both software and hardware controls. 8051 timers have both software and hardware controls. The start and stop of a timer is controlled by software using the instruction SETB TR1 and CLR TR1 for timer 1, and SETB TR0 and CLR TR0 for timer 0.

The SETB instruction is used to start it and it is stopped by the CLR instruction. These instructions start and stop the timers as long as GATE = 0 in the TMOD register. Timers can be started and stopped by an external source by making GATE = 1 in the TMOD register.

C/T (CLOCK / TIMER)

This bit in the TMOD register is used to decide whether a timer is used as a delay generator or an event manager. If C/T = 0, it is used as a timer for timer delay generation. The clock source to create the time delay is the crystal frequency of the 8051. If C/T = 0, the crystal frequency attached to the 8051 also decides the speed at which the 8051 timer ticks at a regular interval.

Timer frequency is always 1/12th of the frequency of the crystal attached to the 8051. Although various 8051 based systems have an XTAL frequency of 10 MHz to 40 MHz, we normally work with the XTAL frequency of 11.0592 MHz. It is because the baud rate for serial communication of the 8051.XTAL = 11.0592 allows the 8051 system to communicate with the PC with no errors.

M1 / M2

M1 M2 Mode
0 0 13-bit timer mode.
0 1 16-bit timer mode.
1 0 8-bit auto reload mode.
1 1 Spilt mode.

Different Modes of Timers

Mode 0 (13-Bit Timer Mode)

Both Timer 1 and Timer 0 in Mode 0 operate as 8-bit counters (with a divide-by-32 prescaler). Timer register is configured as a 13-bit register consisting of all the 8 bits of TH1 and the lower 5 bits of TL1. The upper 3 bits of TL1 are indeterminate and should be ignored. Setting the run flag (TR1) does not clear the register. The timer interrupt flag TF1 is set when the count rolls over from all 1s to all 0s. Mode 0 operation is the same for Timer 0 as it is for Timer 1.

Mode 1 (16-Bit Timer Mode)

Timer mode "1" is a 16-bit timer and is a commonly used mode. It functions in the same way as 13-bit mode except that all 16 bits are used. TLx is incremented starting from 0 to a maximum 255. Once the value 255 is reached, TLx resets to 0 and then THx is incremented by 1. As being a full 16-bit timer, the timer may contain up to 65536 distinct values and it will overflow back to 0 after 65,536 machine cycles.

Mode 2 (8 Bit Auto Reload)

Both the timer registers are configured as 8-bit counters (TL1 and TL0) with automatic reload. Overflow from TL1 (TL0) sets TF1 (TF0) and also reloads TL1 (TL0) with the contents of Th1 (TH0), which is preset by software. The reload leaves TH1 (TH0) unchanged.

The benefit of auto-reload mode is that you can have the timer to always contain a value from 200 to 255. If you use mode 0 or 1, you would have to check in the code to see the overflow and, in that case, reset the timer to 200. In this case, precious instructions check the value and/or get reloaded. In mode 2, the microcontroller takes care of this. Once you have configured a timer in mode 2, you don't have to worry about checking to see if the timer has overflowed, nor do you have to worry about resetting the value because the microcontroller hardware will do it all for you. The auto-reload mode is used for establishing a common baud rate.

Mode 3 (Split Timer Mode)

Timer mode "3" is known as split-timer mode. When Timer 0 is placed in mode 3, it becomes two separate 8-bit timers. Timer 0 is TL0 and Timer 1 is TH0. Both the timers count from 0 to 255 and in case of overflow, reset back to 0. All the bits that are of Timer 1 will now be tied to TH0.

When Timer 0 is in split mode, the real Timer 1 (i.e. TH1 and TL1) can be set in modes 0, 1 or 2, but it cannot be started/stopped as the bits that do that are now linked to TH0. The real timer 1 will be incremented with every machine cycle.

Initializing a Timer

Decide the timer mode. Consider a 16-bit timer that runs continuously, and is independent of any external pins.

Initialize the TMOD SFR. Use the lowest 4 bits of TMOD and consider Timer 0. Keep the two bits, GATE 0 and C/T 0, as 0, since we want the timer to be independent of the external pins. As 16-bit mode is timer mode 1, clear T0M1 and set T0M0. Effectively, the only bit to turn on is bit 0 of TMOD. Now execute the following instruction −

MOV TMOD,#01h

Now, Timer 0 is in 16-bit timer mode, but the timer is not running. To start the timer in running mode, set the TR0 bit by executing the following instruction −

SETB TR0

Now, Timer 0 will immediately start counting, being incremented once every machine cycle.

Reading a Timer

A 16-bit timer can be read in two ways. Either read the actual value of the timer as a 16-bit number, or you detect when the timer has overflowed.

Detecting Timer Overflow

When a timer overflows from its highest value to 0, the microcontroller automatically sets the TFx bit in the TCON register. So instead of checking the exact value of the timer, the TFx bit can be checked. If TF0 is set, then Timer 0 has overflowed; if TF1 is set, then Timer 1 has overflowed.

An interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. Whenever an interrupt occurs, the controller completes the execution of the current instruction and starts the execution of an Interrupt Service Routine (ISR) or Interrupt Handler. ISR tells the processor or controller what to do when the interrupt occurs. The interrupts can be either hardware interrupts or software interrupts.

Hardware Interrupt

A hardware interrupt is an electronic alerting signal sent to the processor from an external device, like a disk controller or an external peripheral. For example, when we press a key on the keyboard or move the mouse, they trigger hardware interrupts which cause the processor to read the keystroke or mouse position.

Software Interrupt

A software interrupt is caused either by an exceptional condition or a special instruction in the instruction set which causes an interrupt when it is executed by the processor. For example, if the processor's arithmetic logic unit runs a command to divide a number by zero, to cause a divide-by-zero exception, thus causing the computer to abandon the calculation or display an error message. Software interrupt instructions work similar to subroutine calls.

What is Polling?

The state of continuous monitoring is known as polling. The microcontroller keeps checking the status of other devices; and while doing so, it does no other operation and consumes all its processing time for monitoring. This problem can be addressed by using interrupts.

In the interrupt method, the controller responds only when an interruption occurs. Thus, the controller is not required to regularly monitor the status (flags, signals etc.) of interfaced and inbuilt devices.

Interrupts v/s Polling

Here is an analogy that differentiates an interrupt from polling −

Interrupt Polling
An interrupt is like a shopkeeper. If one needs a service or product, he goes to him and apprises him of his needs. In case of interrupts, when the flags or signals are received, they notify the controller that they need to be serviced. The polling method is like a salesperson. The salesman goes from door to door while requesting to buy a product or service. Similarly, the controller keeps monitoring the flags or signals one by one for all devices and provides service to whichever component that needs its service.

Interrupt Service Routine

For every interrupt, there must be an interrupt service routine (ISR), or interrupt handler. When an interrupt occurs, the microcontroller runs the interrupt service routine. For every interrupt, there is a fixed location in memory that holds the address of its interrupt service routine, ISR. The table of memory locations set aside to hold the addresses of ISRs is called as the Interrupt Vector Table.

Vektör Tablosunu Kes

8051'de RESET dahil altı kesinti vardır.

Kesmeler ROM Konumu (Hex) Toplu iğne
Kesmeler ROM Konumu (HEX)
Seri COM (RI ve TI) 0023
Zamanlayıcı 1 kesintileri (TF1) 001B
Harici HW kesintisi 1 (INT1) 0013 S3.3 (13)
Harici HW kesintisi 0 (INT0) 0003 P3.2 (12)
Zamanlayıcı 0 (TF0) 000 milyar
Sıfırla 0000 9
  • Sıfırlama pimi etkinleştirildiğinde, 8051 0000 adres konumuna atlar. Bu, güç verme sıfırlamadır.

  • Zamanlayıcılar için iki kesinti ayrılmıştır: biri zamanlayıcı 0 için ve diğeri zamanlayıcı 1 için. Kesme vektör tablosundaki bellek konumları sırasıyla 000BH ve 001BH'dir.

  • Harici donanım kesintileri için iki kesinti ayrılmıştır. Pin no. 12 ve Pin no. Port 3'teki 13, sırasıyla INT0 ve INT1 harici donanım kesintileri içindir. Bellek konumları kesinti vektör tablosunda sırasıyla 0003H ve 0013H'dir.

  • Seri iletişim, hem alma hem de iletime ait tek bir kesintiye sahiptir. Bellek konumu 0023H bu kesmeye aittir.

Kesinti Yürütme Adımları

Bir kesinti aktif hale geldiğinde, mikro denetleyici aşağıdaki adımlardan geçer -

  • Mikrodenetleyici, o anda yürütülen talimatı kapatır ve bir sonraki talimatın (PC) adresini yığına kaydeder.

  • Ayrıca tüm kesintilerin mevcut durumunu dahili olarak (yani yığında değil) kaydeder.

  • Kesinti servis rutininin adresini tutan kesme vektör tablosunun hafıza konumuna atlar.

  • Mikrodenetleyici, ISR'nin adresini kesinti vektör tablosundan alır ve ona atlar. RETI (kesmeden dönüş) olan kesme hizmeti alt yordamını yürütmeye başlar.

  • RETI talimatının yürütülmesi üzerine, mikro denetleyici kesintiye uğradığı konuma geri döner. İlk olarak, yığının üst baytlarını bilgisayara atarak program sayacı (PC) adresini yığından alır. Ardından o adresten çalışmaya başlar.

Kenar Tetikleme ve Seviye Tetikleme

Kesme modülleri iki tiptedir - seviye tetiklemeli veya kenar tetiklemeli.

Seviye Tetiklendi Kenar tetikli
Seviye tetiklemeli bir kesme modülü, kesme kaynağının seviyesi iddia edildiğinde her zaman bir kesme üretir. Kenarla tetiklenen bir kesme modülü, yalnızca kesme kaynağının geçerli bir kenarını algıladığında bir kesme üretir. Kesinti kaynağı seviyesi gerçekten değiştiğinde kenar algılanır. Ayrıca, periyodik örnekleme ile ve önceki örnek reddedildiğinde ileri sürülen bir seviyenin saptanmasıyla da tespit edilebilir.
Sabit yazılım kesme işleyicisi kesmeyi işlerken kesme kaynağı hala ileri sürülüyorsa, kesme modülü kesmeyi yeniden oluşturarak kesme işleyicisinin yeniden çağrılmasına neden olur. Kenar tetiklemeli kesme modülleri, kesme kaynağı nasıl davranırsa davransın hemen harekete geçirilebilir.
Seviye tetiklemeli kesintiler, ürün yazılımı için zahmetlidir. Uçtan tetiklenen kesintiler, ürün yazılımının kod karmaşıklığını düşük tutar, ürün yazılımı koşullarının sayısını azaltır ve kesintiler ele alındığında daha fazla esneklik sağlar.

Kesmeyi Etkinleştirme ve Devre Dışı Bırakma

Sıfırlamadan sonra, tüm kesintiler etkinleştirilse bile devre dışı bırakılır. Mikrodenetleyicinin bu kesintilere yanıt vermesi için kesintilerin yazılım kullanılarak etkinleştirilmesi gerekir.

IE (kesme etkinleştirme) kaydı, kesmeyi etkinleştirmek ve devre dışı bırakmaktan sorumludur. IE, bit adresli bir kayıttır.

Kaydı Etkinleştirin Kes

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA - Global etkinleştirme / devre dışı bırakma.

  • - - Tanımsız.

  • ET2 - Zamanlayıcı 2 kesintisini etkinleştirin.

  • ES - Seri bağlantı noktası kesmeyi etkinleştirin.

  • ET1 - Zamanlayıcı 1 kesintisini etkinleştirin.

  • EX1 - Harici 1 kesmeyi etkinleştirin.

  • ET0 - Zamanlayıcı 0 kesintisini etkinleştirin.

  • EX0 - Harici 0 kesmeyi etkinleştirin.

Bir kesmeyi etkinleştirmek için aşağıdaki adımları atıyoruz -

  • IE kaydının (EA) Bit D7'sinin, kaydın geri kalanının etkili olabilmesi için yüksek olması gerekir.

  • EA = 1 ise, kesmeler etkinleştirilecek ve IE'deki karşılık gelen bitleri yüksekse yanıtlanacaktır. EA = 0 ise, IE yazmacındaki ilişkili pinleri yüksek olsa bile hiçbir kesinti yanıt vermeyecektir.

8051'de Kesme Önceliği

Kesintilerden herhangi birine daha yüksek öncelik atayarak kesme önceliğini değiştirebiliriz. Bu, adı verilen bir kayıt programlanarak gerçekleştirilir.IP (kesinti önceliği).

Aşağıdaki şekil IP kaydının bitlerini göstermektedir. Sıfırlamanın ardından, IP kaydı tüm 0'ları içerir. Kesintilerden herhangi birine daha yüksek bir öncelik vermek için, IP kaydındaki ilgili biti yüksek yaparız.

- - - - PT1 PX1 PT0 PX0

- IP.7 Uygulanmadı.
- IP.6 Uygulanmadı.
- IP.5 Uygulanmadı.
- IP.4 Uygulanmadı.
PT1 IP.3 Zamanlayıcı 1 kesinti öncelik seviyesini tanımlar.
PX1 IP.2 External Interrupt 1 öncelik seviyesini tanımlar.
PT0 IP.1 Zamanlayıcı 0 kesinti öncelik seviyesini tanımlar.
PX0 IP.0 Harici Kesme 0 öncelik seviyesini tanımlar.

Interrupt içinde Interrupt

8051 bir kesmeye ait bir ISR çalıştırıyorsa ve diğeri aktif hale gelirse ne olur? Bu tür durumlarda, yüksek öncelikli bir kesme, düşük öncelikli bir kesmeyi kesintiye uğratabilir. Bu olarak bilinirinterrupt inside interrupt. 8051'de, düşük öncelikli bir kesme, yüksek öncelikli bir kesme tarafından kesilebilir, ancak başka bir düşük öncelikli kesme tarafından kesilemez.

Yazılım Tarafından Kesinti Tetikleme

Simülasyon yoluyla bir ISR'yi test etmemiz gereken zamanlar vardır. Bu, kesmeyi yüksek ayarlamak için basit talimatlarla yapılabilir ve böylece 8051'in kesme vektör tablosuna atlamasına neden olabilir. Örneğin, IE bitini zamanlayıcı 1 için 1 olarak ayarlayın. Bir talimatSETB TF1 8051'i ne yapıyorsa keser ve kesme vektör tablosuna atlamaya zorlar.