Intel MCS-51

(Redirecționat de la MCS 51)

Intel MCS-51 este o serie de microcontrolere cu un singur cip, având o arhitectură Harvard, ce a fost dezvoltată de compania americană Intel în 1980 pentru folosirea în sisteme embedded (sisteme cu microprocesoare integrate). Versiunile originale ale Intel au fost populare în anii 1980 și la începutul anilor 1990, dar astăzi au fost înlocuite de o gamă vastă de dispozitive compatibile cu 8051 ce sunt mai rapide și/sau îmbunatățite din punct de vedere funcțional, fabricate de mai mult de 20 de producători independenți inclusiv: Atmel, Infineon Technologies (fostă Siemens AG), Maxim Integrated Products (prin intermediul filialei sale, Dallas Semiconductor), NXP (fostă Philips Semiconductor), Nuvoton (fostă Winbond), ST Microelectronics, Silicon Laboratories (fostă Cygnal), Texas Instruments și Cypress Semiconductor.

Famila originală MCS-51 a lui Intel a fost dezvoltată utilizând tehnologie NMOS, dar versiunile ulterioare, identificate prin litera C în numele lor (ex.: 80C51) foloseau tehnologie CMOS și necesitau mai puțină putere de alimentare decât predecesoarele lor cu NMOS. Acest lucru le-a făcut mai potrivite pentru dispozitivele cu baterii.

Caracteristici importante și aplicații

modificare

Oferă multe funcții (CPU, RAM, ROM, I/O, logică de întreruperi, timer, etc.) într-un singur pachet; pentru variantele 8051, 8031 și 8751 diferențele apăreau la memoria internă program.

  • UCP pe 8 biți la 12 MHz
  • Capabilități de prelucrare booleană (operator pe 1 bit)
  • 64 K spațiu de adrese (date și program)
  • 128 baiți memorie internă de date
  • 4 KB memorie internă program (ROM, none, EPROM)
  • 32 linii de intrare/ieșire organizate în 4 porturi
  • 2 timere/numărătoare pe 16 biți
  • 1 port serial (full duplex UART)
  • 5 surse de întrerupere (2 externe) pe 2 niveluri de priorități
  • Pentru variantele 8052, 8032 și 8752: 256 baiți memorie date, 8 KB memorie program, 6 surse de întrerupere, 3 timere.

O caracteristică deosebit de utilă a microcontrolerului 8051 este includerea unui motor de procesare boolean care permite operațiilor logice booleene la nivel de bit să fie efectuate în mod direct și eficient cu ajutorul registrelor interne și RAM-ului. Aceasta caracteristică a ajutat la cimentarea popularității 8051 în aplicațiile de control industrial. O altă caracteristică importantă este că are patru seturi de registre separate, care pot fi utilizate pentru a reduce foarte mult latența de întreruperi, comparativ cu metoda mai comune de stocare a contextului de întreruperi într-o stivă.

UART-urile MCS-51 fac simplu de utilizat chip-ul ca o interfață serială de comunicații. Pinii externi pot fi configurați să se conecteze la regiștrii interni într-o varietate de moduri, și timer-ele interne pot fi de asemenea utilizate, permițând comunicații pe serială într-o serie de moduri, atât sincrone și asincrone. Unele moduri permit comunicații fără componente externe. Un mod compatibil cu un mediu multi-punct de comunicații RS-485 este realizabil, dar puterea reală a 8051 este de compatibilitate cu protocoalele ad-hoc existente (de exemplu, atunci când se controlează dispozitivele de control serial).

O dată ce un UART, și un timer dacă este necesar, au fost configurate, programatorul are nevoie doar să scrie o simplă rutină de întreruperi pentru a reumple registrul de send (de trimitere) ori de câte ori ultimul bit este deplasat afară de către UART și/sau să golească întregul registru receive (de primire), să copieze datele în altă parte. Programul principal efectuează apoi citiri seriale și scrie doar prin citirea și scrierea a 8 biți de date în stivă.

Microcontrolerele bazate pe MCS-51 includ de obicei unul sau două UART-uri, două sau trei timere, 128 sau 256 biți de memorie internă de date RAM (dintre care 16 bytes sunt bit-adresabili), până la 128 bytes de I/O, de la 512 bytes până la 64KB de memorie internă program și uneori o cantitate de memorie de date RAM extinsă (ERAM) localizată în spațiul de date extern. Nucleul 8051 original rula 12 cicluri de ceas pe ciclu mașină, cu majoritatea instrucțiunilor executându-se în unul sau două cicluri mașină. Cu o frecvență de ceas de 12 MHz, 8051 putea astfel să execute un milion de instrucțiuni de un ciclu pe secundă sau 500 000 de instrucțiuni de două cicluri pe secundă. Nucleele 8051 îmbunătățite, ce sunt astăzi folosite, rulează șase, patru, două sau chiar un ceas pe ciclu mașină și au frecvențe de ceas de până la 100 MHz, fiind astfel capabile de un număr mult mai mare de instrucțiuni pe secundă.

Caracteristici comune incluse în microcontrolere moderne bazate pe 8051 includ built-in timere de reset cu detectare brown-out, oscilatoare on-chip, memorie program Flash ROM auto-programabilă, cod bootloader în ROM, spațiu de stocare a datelor EEPROM non-volatilă, I²C, SPI, și interfețe USB host, magistrale CAN sau LIN, generatoare PWM, comparatoare analogice, convertoare A/D și D/A, RTC-uri, contoare și timere suplimentare, facilități de debugging in-circuit, mai multe surse de întrerupere, și moduri suplimentare de economisire a energiei.

Arhitectura internă

modificare

Microcontrolerele din familia MCS-51 au o arhitectură internă bazată pe cea a microprocesoarelor de uz general. Diferențele față de microprocesoarele de uz general au pornit de la faptul că se dorea o unitate de procesare cât mai ieftină și care să fie folosită în sisteme de conducere. Microprocesoarele Intel 8080 și 8085 au o arhitectură orientată spre procesare a datelor de uz general. Pentru realizarea unui sistem de conducere, o unitate centrală cu microprocesor de uz general, nu poate fi folosită fără a face apel și la anumite circuite externe specializate. Astfel, pentru introducerea timpului în sistem este nevoie de un circuit digital numit timer, pentru achiziția datelor din exterior trebuie prevăzută o interfață paralelă (porturi), pentru comunicație între diverse module ale sistemului de conducere este nevoie de o interfață serială. Se obține în final un sistem destul de complex, cu o dimensiune mare și fiabilitate redusă determinată de numărul destul de mare de circuite digitale folosite. Microcontrolerele elimină aceste neajunsuri prin includerea pe același cip a acestor circuite specializate, ceea ce a condus la o arhitectură internă mai complexă. Astfel, au rezultat structuri de conducere mult mai simple și mai puternice.

Un microcontroler 8051 este organizat în jurul unei unități centrale similare cu un microprocesor de uz general. Resursele hardware on-chip care nu se regăsesc la microprocesoarele de uz general sunt:

  • facilitatea de operare directa pe bit a unității aritmetico-logice (acumulator) datorită integrării unui procesor boolean;
  • organizarea internă a unei stive de maxim 128KB;
  • existența un set de instrucțiuni mai elaborat;
  • capabilitatea de calcul binar și zecimal;
  • 4 porturi bidirecționale a câte 8 linii fiecare;
  • 2 timere pe 16 biți;
  • port serial de mare viteză cu mai multe moduri de lucru;
  • structură de întreruperi cu două nivele de prioritate;

Microcontrolerele sunt denumite și "embedded microprocessors" tocmai datorită acestei organizări interne hardware. Scopul de a obține un circuit cât mai compact a determinat o altfel de abordare a conceptului de magistrală față de microprocesoarele de uz general. După cum se observă din figură, un microcontroler scoate în exterior o serie de linii denumite porturi care, funcție de aplicație, pot avea dublă întrebuințare. Datorită acestei facilități, microcontrolerele pot folosi numai resursele integrate pe cip (stand-alone) în sistemele de conducere de nivel mediu, sau, acolo unde aplicația o cere, aceste resurse pot fi completate cu memorie și porturi externe. Astfel, se poate crește spațiul de memorie ROM și/sau RAM sau pot fi conectate dispozitive I/E suplimentare - circuite specializate din familia 8080/8085 (PPI 8255, USART 8251, PIT 8253 etc.). Pentru a realiza comunicarea între aceste extensii și microcontroler, este nevoie ca o parte din liniile de port să fie redirecționate în alte scopuri. De exemplu, adresa pe 16 biți pentru accesul la memoria externă se furnizează cu ajutorul porturilor P0 și P2 care acum joacă rolul de magistrală de adrese. Magistrala de date este obținută din liniile portului P0. Pentru a face deosebirea între adresă și date, liniile portului P0 sunt multiplexate în timp.

MCS-51 are patru tipuri distincte de memorie - RAM intern, registre de uz special, memorie program și memorie externă de date.

Memoria RAM internă (IRAM) este localizată de la adresa 0 la adresa 0xFF, având o capacitate de 256 octeți. IRAM-ul de la 0x00 la 0x7F (primii 128 octeți) poate fi accesat direct, iar biții de la 0x20 la 0x2F sunt de asemenea bit-adresabili. IRAM-ul de la 0x80 la 0xFF (următorii 128 de octeți) trebuie accesat indirect, folosind sintaxa @R0 sau @R1, cu adresa de acces încărcată în R0 sau R1.

Registrele de uz special (SFR) sunt localizate de la adresa 0x80 la 0xFF și sunt accesate direct folosind aceleași instrucțiuni ca pentru partea inferioara (low) a IRAM. O parte din registrele SFR sunt de asemenea bit-adresabile.

Memoria program (PMEM), deși mai puțin folosită decât IRAM sau XRAM, este localizată Începând cu adresa 0. Poate fi on- sau off-chip, depinzând de tipul de chip folosit. Memoria program poate fi doar citită (read-only), deși anumite variante ale 8051 folosesc memorie flash on-chip și oferă o metodă de reprogramare a memoriei. Pe lângă stocarea codului, memoria program poate stoca și tabele de constante ce pot fi accesate prin MOVC A, @DPTR, folosind registrul de uz special @DPTR.

Memoria de date externă (XRAM) de asemenea începe la adresa 0. Poate fi on- sau off-chip; ceea ce o face "externă" este că trebuie accesată folosind instrucțiunea MOVX (Move eXternal). Multe variante ale 8051 includ standardul de 256 bytes de IRAM plus câțiva KB de XRAM pe chip. Dacă mai multă memorie XRAM este necesară unei aplicații, XRAM-ul intern poate fi dezactivat, iar toate instrucțiunile XRAM vor fi descărcate de pe magistrala externă.

Descrierea pinilor circuitului 8051

modificare

Circuitul standard realizat în capsulă DIL prezintă 40 pini. Dintre aceștia, doi pini sunt rezervați tensiunii de alimentare (+5V și masă).

Controlerul conține 4 porturi paralele de câte 8 biți fiecare, ce pot fi folosite pentru generarea și, respectiv, receptarea semnalelor digitale (notate P0, P1, P2, P3). Funcție de modul de lucru în care lucrează, aceste porturi se pot configura și pot avea mai multe situații de lucru. Astfel, dacă se lucrează cu memorie ROM externă, 2 dintre aceste porturi se constituie în linii ce formează magistralele de adrese și de date. Portul P0 generează, multiplexat în timp, partea cea mai puțin semnificativă a informației de adresă (A0-A7) și, respectiv, gestionează magistrala de date (D0- D7). Pentru formarea magistralei de adrese, va fi nevoie să se plaseze în exteriorul MCU-ului un circuit de tip latch (de exemplu 74HCT573), cu scopul de a memora informația de adresă. Acționarea acestui circuit se face utilizând semnalul ALE. Portul P2, în aceleași situații, generează octetul cel mai semnificativ al informației de adrese (A8-A15). Cele 16 linii de adrese astfel formate, permit adresarea a 64 KB memorie. De fapt, se pot adresa 64KB memorie de programe (ce conține instrucțiuni) și, respectiv, 64KB memorie de date, deci în total 128 KB. Notațiile liniilor porturilor sunt Pi.j, cu i = 0, .., 3, iar j = 0, ..., 7.

Atunci când formează magistrala de adrese și date, liniile portului P0 mai sunt notate AD0- AD7, iar liniile lui P2 au denumirea A8-A15. Când nu se lucrează cu magistralele externe, cele 2 porturi P0 și P2 se pot folosi ca porturi de tip paralel. În această situație se atrage atenția asupra faptului că liniile portului P0 sunt de tipul “open drain”, fiind necesară plasarea în exterior de rezistențe către sursa de alimentare, în vederea asigurării polarizării.

Portul P1 este în orice situație de lucru a microcontrolerului, port de tip paralel, biții acestuia fiind configurabili atât ca ieșiri, cât și ca intrări digitale. Liniile portului sunt notate P1.0, ..., P1.7.

Ultimul port (P3) are un caracter multifuncțional, funcție de modul de lucru al microcontrolerului. Pe de o parte, prin liniile acestui port, circuitele I/O existente în MCU (cele 2 canale timer, canalul de comunicație serial, logică pentru gestionarea întreruperilor) sunt accesibile utilizatorului. Dacă nu se lucrează cu circuitele I/O locale, acest port poate să lucreze ca un port de tip paralel, liniile asigurând generarea și preluarea de semnale digitale.

Corespondența liniilor portului 3 cu liniile circuitelor I/O interne este următoarea:

  • P30 - RXD -intrare pentru recepția serială a datelor la unitatea serială;
  • P31 -TXD - ieșire pentru transmisia serială a datelor de la unitatea serială;
  • P32 - INT0 - intrare pe care se poate aplica o cerere de întrerupere externă pe canal 0;
  • P33 - INT1 - intrare pe care se poate aplica o cerere de întrerupere externă pe canal 1;
  • P34 - T0 - intrare pe care se pot aplica impulsuri externe cu numărare de către timerul 0;
  • P35 - T1 - intrare pe care se pot aplica impulsuri externe cu numărare de către timerul 1;
  • P36 - WR - semnal pentru scriere la lucrul cu memoria de date externă;
  • P37 - RD - semnal pentru citire la lucrul cu memoria de date externă;

EA - External Address. Când se lucrează cu magistrale externe, acest pin se conectează la "0"- logic. Când se folosește memoria ROM internă, pinul se leagă la "1”- logic. În această situație, la adresarea ROM-ul intern de 4K, controlerul generează adrese din gama 0000h-0FFFh și nu se emit semnale pe magistralele externe (P0 și P2 putând fi folosite ca porturi paralele). Există posibilitatea folosirii în completare, a unei memorii ROM externe, dar care va fi selectată și adresată începând cu adresa 1000h (P0 și P2 încetând să mai poată fi folosite ca porturi paralele).

ALE - Address Latch Enable. Semnalul este folosit pentru demultiplexarea externă a informațiilor emise pe portul P0. Astfel, semnalul este folosit în vederea memorării în latch-ul extern 74HCT573, a părții mai puțin semnificative a adresei A0-A7 emisă pe liniile acestuia. Semnalul este activ "1" logic.

PSEL - Program SELect. Este semnalul prin care se face activarea memoriei de programe atunci când controlerul realizează extragerea codurilor instrucțiunilor. Dacă se lucrează cu ROM-ul intern, acest semnal nu se generează. Pinul este folosit și în situațiile de programare ale ROM-ului intern. În acest caz, pinul este intrare având notația PROG (Programming).

RESET - Semnal pentru inițializarea controlerului, activ “0”- logic.

XTAL1, XTAL2 - Pini pe care se conectează în exterior cristalul de cuarț în ritmul căruia lucrează oscilatorul local. Se poate lucra și cu oscilator extern, semnalul respectiv aplicându-se pe XTAL1. În acest caz, XTAL2 amplifică semnalul în vederea folosirii de către alte circuite din respectivul microsistem care au nevoie de un astfel de semnal. Varianta standard de μC 8051 lucrează cu un cristal de cuarț de 12 MHz. Au apărut variante la 16 Mhz, ajungându-se-se chiar de 30 Mhz.

Programare

modificare

Există diverse compilatoare de limbaje de programare de nivel înalt pentru 8051. Mai multe compilatoare de C sunt disponibile pentru 8051, majoritatea dispun de extensii ce permit programatorului să specifice unde fiecare variabilă ar trebui stocată în cele șase tipuri de memorie și oferă acces la caracteristici hardware specifice 8051, cum ar fi bancurile de registre multiple și instrucțiunile de manipulare a biților. Există multe compilatoare de C comerciale. SDCC este un compilator open-source popular. Alte limbaje de nivel înalt, ca Forth, Basic, Pascal/Object Pascal, PL/M și Modula-2 sunt disponibile pentru 8051, dar sunt mai puțin folosite decât C și programarea în limbaj de asamblare.

Deoarece IRAM, XRAM și PMEM, toate au o adresă 0x00, compilatoarele pentru 8051 oferă extensii pentru a indica unde o anumită parte de date ar trebui stocată (i.e. constante în PMEM sau variabile ce necesită acces rapid din IRAM). Din moment ce datele pot fi într-unul din cele trei spații de memorie, de obicei, este oferit un mecanism pentru determina la ce memorie se referă un pointer, fie prin constrângerea tipului pointer-ului să includă spațiul de memorie, fie stocând metadate împreună cu pointer-ul.

Set de instrucțiuni

modificare

Setul de instrucțiuni MCS-51[1] oferă mai multe moduri de adresare, incluzând:

  • adresarea registrelor interne

Bancul registrelor, care conține registrele R0÷ R7, poate fi accesat prin anumite instrucțiuni care specifică în opcode registrul prin 3 biți. Instrucțiunile care accesează astfel registrele au codul mai eficient. Când instrucțiunea se execută, numai unul din cele 8 regiștri din bancul selectat este accesat. Bancul de regiștri cu care se lucrează la un moment dat este selectat cu ajutorul a 2 biți din PSW. ex: MOV A, R7 – conținutul registrului R7 este transferat în acumulator

  • adresare directă, ce accesează direct memoria internă RAM sau SFR-urile în funcție de adresă

In adresarea directă, operandul este specificat printr-un câmp de adresă de 8 biți, prin acest mod de adresare se poate accesa atât memoria RAM internă 00-7Fh, cât și zona SFR (80-FFh). ex: MOV A, direct - conținutul memoriei interne de la adresa direct este transferat în acumulator. ADD A, direct – adună conținutul memoriei interne de la adresa direct cu acumulatorul.

  • adresare indirectă, folosind R0-R1, sau DPTR pentru a stoca adresa de memorie. Instrucțiunea folosită poate varia pentru a accesa RAM intern, RAM extern sau memorie program.

Instrucțiunea specifică un registru care conține adresa operandului. Prin acest mod de adresare poate fi accesat atât memoria de date internă cât și cea externă, astfel: - adresare pe 8 biți cu ajutorul registrelor R0 și R1 sau al pointerului de stivă ex: MOV A,@R0 - conținutul locației de memorie internă de la adresa dată de registrul R0 este transferată în acumulator - adresare pe 16 biți utilizând registrul DPTR ex: MOVX A,@DPTR – conținutul locației de memorie de date externă de la adresa din registrul DPTR este transferată în acumulator

  • adresare imediată

Anumite instrucțiuni specifică anumite registre. De exemplu, anumite instrucțiuni operează cu acumulatorul sau DPTR, deci nu este nevoie de o adresa pentru a le accesa. Opcod-ul instrucțiunii conține toate informațiile necesare. ex: MOV A, #100 – acumulatorul este încărcat cu constanta 100; MOV DPTR, #0A43h. SETB C – Bitul de carry devine 1 SETB P1.3 – Bitul 3 al portului P1 devine 1.

  • adresare indexată

Numai memoria program poate fi accesată astfel. Acest mod de adresare este folosit pentru a citi tabele memorate în memoria program. Registrul de bază pe 16 biți care reprezintă adresa de început al tabelului, poate fi registrul DPTR sau PC, iar ca registru deplasament este folosit acumulatorul. Adresa unui element din tabel accesat la un moment dat, se calculează astfel: DPTR (PC) +Acc. ex: MOVC A,@ A+PC Tot adresare indexată este utilizată și în cazul instrucțiunilor de salt. În acest caz, adresa de destinație a instrucțiunii de salt este calculată ca suma dintre o adresă de bază și o valoare încărcată în acumulator. (salt relativ). ex: SJMP rel

Majoritatea operațiilor permit orice mod de adresare pentru sursă sau destinație, spre exemplu, MOV 020h,03fh va copia valoare din locația de memorie intern RAM 0x3f în locația de memorie 0x20, aflată de asemenea în memoria internă RAM.

Microcontrolerele din seria Intel 8031 au setul de instrucțiuni asemănătoare cu cele ale microprocesoarelor pe 8 biți, însă mai apar o serie de instrucțiuni specifice numai acestor tipuri de circuite.

Instrucțiunile pot fi clasificate în funcție de operația pe care o realizează în:

  • Instrucțiuni de transfer
  • Instrucțiuni aritmetico-logice
  • Instrucțiuni de salt
    • pot fi instrucțiuni de salt absolut sau relativ, condiționat sau nu;
  • Instrucțiuni de manipulare a variabilelor de tip boolean

Sunt instrucțiuni noi, specifice microcontrolerelor. Cu ajutorul acestor instrucțiuni se pot realiza teste la nivel de bit, ceea ce permite un răspuns prompt al aplicației la schimbări și o dimensiune redusă a codului utilizatorului. ex: JB bit ,rel – salt relativ dacă bit este 1; ANL C, bit – SI logic între Carry și bit; SETB bit – setează direct bit;

Deoarece 8051 are o arhitectură acumulator, toate operațiile aritmetice trebuie să folosească acumulatorul, ex: ADD A, 020h va adăuga valoarea din locația de memorie internă RAM 0x20 în acumulator.

Pentru a programa 8051, nu este nevoie să se stăpânească aceste instrucțiuni. Având disponibile compilatoare de C de bună calitate, inclusiv SDCC open-source, practic toate programele pot fi scrise într-un limbaj de nivel înalt.

Procesoare corelate

modificare

Predecesorul 8051, 8048, a fost folosit în tastatura primului PC IBM, unde convertea apăsările de taste în fluxul serial de date ce este transmis unității centrale a calculatorului. 8048 și derivații săi sunt folosiți și astăzi pentru modele de bază de tastaturi.

8031 a fost versiune a originalului Intel 8051 care nu conținea memorie program internă (ROM). Pentru a folosi acest chip, trebuia adăugată memorie externă ROM, conținând programul pe care 8031 urma să-l execute.

8052 a fost o versiune îmbunătățită a originalului 8051 care avea 256 bytes de memorie internă RAM în loc de 128 bytes, 8 KB de ROM în loc de 4 KB și un al treilea timer pe 16 biți. 8032 avea aceleași caracteristici cu excepția memoriei program interne ROM. 8052 și 8032 sunt în mare măsură considerate a fi depășite, deoarece aceste funcții și multe altele sunt incluse in aproape toate microcontrolere moderne bazate pe 8051.

Intel a întrerupt linia sa de producție de microcontrolere MCS-51 în martie 2007 [2], cu toate acestea exista o mulțime de produse 8051 îmbunătățite 8051 adăugate în mod regulat de alți furnizori.

Legături externe

modificare
 
Commons
Wikimedia Commons conține materiale multimedia legate de Intel MCS-51
  1. ^ MCS@51 Microcontroller Family User’S Manual, February 1994
  2. ^ Intel bows out, discontinues MCS-51[nefuncțională].