Sari la conținut

AT89S52

De la Wikipedia, enciclopedia liberă

AT89S52 este un microcontroler compatibil cu marea familie Intel MCS-51. AT89S52 este creat de către Atmel, lucru indicat de inițialele "AT". Acest microcontroler are un consum scăzut, însă CMOS -ul de 8 biți îi dă performanțe ridicate, având o memorie Flash internă de 8K Bytes. Acesta este realizat utilizând tehnologia cu memorie nevolatilă și densitate ridicată ce aparține Atmel și este compatibil cu standardul 80C51. Chip-ul Flash permite memoriei să fie reprogramată intern sau programată de către o memorie nevolatilă. Prin combinarea a unui UCP de 8 biți cu memorie Flash programabilă pe nucleu monolitic, Atmel AT89S52 este microcontroler foarte puternic ce are o flexibilitate ridicată și este astfel soluția perfectă pentru multe aplicații embedded.

Informații generale

[modificare | modificare sursă]

Un microcontroler este o structură electronică de dimensiune redusă, conținând în general un procesor, o memorie și periferice de intrare/ieșire programabile. Aplicațiile în care se utilizează microcontrolerele sunt cele de control automat, în domenii ca: producția auto, dispozitive medicale, comandă la distanță, precum și multe altele de același gen. În 1976 Intel creează primul microcontroler din familia MCS denumit MCS 48, standardul MCS 51 aparând in 1980. În momentul de față Intel nu mai produce astfel de microcontrolere, insa mari producători cum ar fi Atmel sau Infineon continuă crearea acestor dispozitive.

Caracteristici

[modificare | modificare sursă]

Principalele caracteristici ale acestui microcontroler sunt:

  • compatibilitate cu familia MCS 51;
  • UCP pe 8 biți la o frecvență de maxim 33 MHz;
  • RAM: 256 Bytes;
  • memorie Flash: 8K Bytes;
  • 32 de linii de programare pentru intrare/iesire cu caracter general;
  • 8 surse de înterupere organizate pe 2 niveluri de priorități;
  • 3 timere/countere de câte 16 biți;
  • Watchdog Timer;
  • doi pointeri de date;
  • 1 port serial (full duplex UART);
  • Interfață de programare ISP de 8K Bytes;
  • acceptă până la 10 000 de rescrieri;
  • conține oscilator;
  • durată de programare scurtă.

Configurația pinilor

[modificare | modificare sursă]

AT89S52 este un microcontroler cu 40 de pini, semnificația acestora fiind exprimată în continuare. În paranteză este menționat numărul pinului ținând cont de faptul că pinul 1 este în stânga sus, iar pinul 40 în dreapta sus.

Vcc(40): tensiune de alimentare;

GND(20): împământarea;

Port 0(39 - 32): Portul 0 este un port bidirecțional de intrare/iesire pe 8 biți. Ca port de ieșire, fiecarui pin i se aloca 8 intrări TTL. Când pinii portului 0 sunt înscriși cu valoarea 1 logic, aceștia pot fi folosiți ca intrări de impedanțe ridicate. Portul 0 poate de asemenea fi configurat ca fiind partea mai puțin semnificativă de adrese sau date în timpul accesului la programul extern și la datele din memorie. Portul 0 este de asemenea cel care primește codul în timpul programării Flash și dă ca rezultat biții în urma programului de verificare. Închiderea tranzistorului este obligatorie pe perioada verificării programului.

Port 1 (1-8): Portul 1 este de asemenea un port bidirecțional de intrare/ieșire având pull-up intern(trazistorul este automat închis). Buferele de ieșire ale portului 1 pot suporta 4 intrări TTL. Când portul 1 este înscris cu valoarea 1 logic, adică tranzistorul este închis, putem utiliza portul pentru citire, altfel, pentru cazul în care tranzistorul este deschis utilizăm portul pentru scriere. Portul 1 primește de asemenea partea mai puțin semnificativă a biților adresei în timpul programării și verificării Flash. În plus, pinii 0 și 1 ai portului 1, pot fi configurați ca timer-e și counter-e, iar pinii 5, 6, 7 sunt utilizați pentru Interfața de Programare.

Port 2 (21-28): Portul 2 este, de asemenea, un port bidirecțional de intrare/iețire pe 8 biți cu pull-up intern. Având același mod de funcționare ca și portul 1, în raport cu tranzistorul existent. Portul 2 este cel care ne da biții cei mai semnificativi ai adresei in timpul extragerii din memoria externă și în timpul accesului la memoria externă de date care utilizează adrese de 16 biți. În acest mod de utilizare, Port-ul 2 utilizează un pull up intern puternic la emiterea valorii 1 logic. În timpul accesului la memoria externă de date care utilizeză adrese de 8 biți, portul 2 este utilizat pentru Registrele Cu Funcții Speciale. Portul 2 de asemenea primește partea cea mai semnificatică a biților de adresa și câteva semnale de control în timpul programării și verificării Flash.

Port 3 (10-17): Portul 3 este, de asemenea, un port bidirecțional de intrare/ieșire pe 8 biți cu pull-up intern, comportându-se la fel ca portul 1 si 2. Portul 3 primește semnale de control pentru programarea și verifcarea memoriei Flash. Alte funcții speciale pe care le poate îndeplini portul 3 sunt:

  • pinul 0 are ca funcție alternativă, intrare a portului serial (RXD);
  • pinul 1 este utilizat și ca ieșire a portului serial(TXD);
  • pinii 2 si 3 sunt utilizați pentru întreruperi externe(#INT0, #INT1);
  • pinii 4 și 5 pot fi utilizați alternativ ca timere(T0 și T1);
  • pinul 6 este utilizat pe post de semnal extern de scriere către memorie(#WR);
  • pinul 7 este utilizat pe post de semnal extern de citire din memorie(#RD).

RST (9): RST are rol de resetare a intrării. O valoare ridicată pe acest pin între două cicluri mașină, în timp ce oscilatorul funcționează, resetează dispozitivul. Acest pin acționează high pentru 98 de perioade ale oscilatorului după ce watchdog-ul se oprește. Pentru a dezactiva aceasta caracteristică se utilizează bitul DISRTO din Regiștrii cu Funcții Speciale mai exact de la adresa 8EH. În starea implicită a bitului DISRTO, caracteristica de RESET HIGH este activă.

ALE/#PROG (30): Acronimul ALE provine de la Adress Latch Enable, iar acesta este cel care comandă buffer-ul ce memorează partea mai puțin semnificativă a adresei. În timpul programării memoriei Flash acest pin are rolul de programare a pulsurilor de intrare: #PROG(Program Pulse Input). Pentru operațiile obișnuite , ALE emite la o perioada de timp constantă, egala cu 1/6 din frecvența oscialtorului și poate fi utilizat pentru temporizări externe sau pe post de ceas. Pentru doritori, funcția pe care ALE o execută poate fi dezactivată prin setarea bitului Regiștrilor Speciali de la adresa 8EH cu valoarea 0 logic. Cu acest bit setat, ALE este activ doar pentru instrucțiunile MOVX și MOVC. Dezactivarea bitul ALE nu are nici un efect asupra microcontrolerului dacă este în modul extern de execuție.

PSEN (29): Acronimul PSEN reprezintă Program Store Enable și reprezintă semnalul de comandă pentru memoria program externă. Când AT89S52 execută cod al memoriei program externe, #PSEN este activat de 2 ori pentru fiecare ciclu al mașinii, excepție când activarea semnalului #PSEN este omisă în timpul accesului la memoria de date externă.

EA / VPP (31): Acronimul EA semnifică External Access Enable. #EA trebuie să fie legat la GRD pentru a putea activa dispozitivul pentru extragerea de cod din memoria program externă începând cu adresa 0000H până la adresa FFFFH.Pentru execuții interne de program #EA trebuie sa fie legat la Vcc.

XTAL1 (19): XTAL1 este utilizat ca intrare a oscilatorului inversor amplificat și ca intrare ceas a circuitului operațional.

XTAL2 (18): XTAL2 reprezintă ieșirea oscilatorului inversor amplificat.

Regiștrii cu Funcții Speciale (RFS)

[modificare | modificare sursă]

Nu toate adresele, în zona în care se găsesc Regiștrii cu Funcții Speciale, sunt ocupate, iar cele neocupate pot să fie inexistente pe chip. Accesul de citire de la aceste adrese va returna în general date aleatorii, iar accesul pentru scriere va avea un efect nedeterminat. Programatorii ar trebui să evite scrierea în aceste locații, deorece aceste locații pot fi utilizate in viitor pentru noi funcții. În acest caz valoarea pentru resetare sau inactivare a acestor noi biți va fi mereu 0. Registrele pentru timere: Controlul și starea biților este conținuta in regiștrii T2CON si T2MOD pentru timer-ul 2. Perechea de regiștrii (RCAP2H, RCAP2L) sunt regiștrii de achiziție sau reîncărcare pentru timer-ul 2 pentru 16 biți de mod de achiziție si 16 biți pentru mod de auto reincarcare. Registrele pentru întreruperi: Biții pentru activarea întreruperilor individuale sunt în registrul IE. Pentru cele 6 tipuri de surse de întrerupere pot fi setate 2 niveluri de prioritate în registrul IP.

Organizarea memoriei

[modificare | modificare sursă]

Dispozitivele din familia MCS-51 au adresa separată pentru program și date. Până la 64K bytes fiecare dintre memoria program sau date poate fi adresat.

Memoria program

[modificare | modificare sursă]

Dacă pinul #EA este conecatat la GRD, toate apelurile de program sunt îndreptate către memoria externă. Dacă #EA este conectat la Vcc, apelurile de program de la adresa 0000H până la adresa 1FFFH sunt directate către memoria internă, iar cele de la adresa 2000H până la FFFFH sunt îndreptate către memoria externă.

Memoria de date

[modificare | modificare sursă]

AT89S52 are un RAM de 256 bytes. Cei 128 Bytes suplimentari, față de cei 128 din familia de bază, ocupă un spațiu de adrese paralel cu cel al Regiștrilor cu Funcții Speciale, adică acești bytes suplimentari și Regiștrii cu Funcții Speciale au aceeleași adrese, însă fizic ei se află în spații diferite. Atunci când o instrucțiune accesează o locație internă sub adresa 7FH, modul de adresare utilizat în instrucțiune specifică faptul că UCP accesează cei 128 bytes superiori ai RAM-ului sau RFS-ul. Se utilizează adresare directă pentru acces la spațiul RFS, și adresare indirectă pentru acessul bytes-ul superiori ai RAM-ului.

Watchdog Timer

[modificare | modificare sursă]

Watchdog Timer(WDT) este utilizat ca o metodă de reconstituire în situații în care UCP-ul este supus unor probleme software. WDT-ul constă într-un numărător pe 14 biți și un Watchdog Timer Reset(WDTRST) ce se află în RFS. Implicit, WDT este dezactivat, pentru activare, utilizatorul scrie 01EH și 0E1H succesiv în registrul WDTRST, adică în locația 0A6H a RFS-ului. Câns WDT este activ, el va incrementa fiecare ciclu mașină, cât timp oscilatorul va rula. Perioada de pauză este dependentă de frecvența ceasului extern. Singura modalitate de dezactivare a WDT-ului este prin resetare. Când WDT-ul depașește limita maximă, va trimite un impuls RESET HIGH pinului de RST.

Watchdog Timer-ul pentru ambele moduri de funcționare

[modificare | modificare sursă]

În modul Power-down oprirea osciloscopului semnifică oprirea WDT-ului. În timpul modului de funcționare Power-down, utilizatorul nu trebuie sa întrețină WDT-ul. Există două metode de ieșire din modul Power-down: printr-o resetare hard sau prin intermediul unei întreruperi externe care este prioritară modului Power-down. Atunci când se iese din modul Power-down prin intermediul unei resetări hardware, serviciul WDT trebuie să se comporte ca și când AT89S52 este resetat. Ieșirea din modul Power-down prin intermediul unei înteruperi are un comportament semnificativ diferit. Întreruperea este menținută suficient timp cât oscilatorul să se stabilizeze. Când întreruperea este dusă la un nivel ridicat, aceasta este deservită. Pentru a preveni WDT-ul de resetarea dispozitivului pentru perioada în care pinul de întrerupere este menținut la un nivel scăzut, WDT-ul nu va porni până când întreruperea nu va fi extinsă la un nivel ridicat. Aceasta semnifică, faptul că WDT-ul va fi resetat în timpul funcției de întrerupere pentru ieșirea din modul Power-down. Pentru a asigura faptul că WDT-ul nu va fi depășit pe perioada câtorva stări de ieșire din Power –down, este bine ca acesta să fie resetat înainte de intrarea în modul Power-down. Înainte de intrarea în modul Idle, bitul WDIDLE din RFS este utilizat pentru a determina de unde să continue WDT-ul în cazul în care devine activ. WDT-ul continuă să contorizeze în timpul modului Idle ca stare implicită. Pentru a preveni ca WDT-ul să reseteze AT89S52-ul în timpul modului Idle, utilizatorul va trebui să seteze mereu un timer care periodic va ieși din Idle, va deservi WDT-ul și va intra din nou în modul Idle. Cu bitul WDIDLE activat WDT-ul va înceta să contorizeze în modul Idle și va continua numărătoare la ieșirea din acest mod.

AT89S52 are un vector de 6 întreruperi: două întreruperi externe (#INT0 și #INT2), trei întreruperi de timer (Timer 0, 1 și 2) și întreruperea portului serial. Fiecare din aceste surse de întrerupere pot fi activate și dezactivate individual prin setarea sau ștergerea unui bit din Regiștrii cu Funcții Speciale IE. IE conține de asemenea un bit de dezactivare global, EA, care dezactivează toate întreruperile în același timp. Bitul de pe poziția 6 este neimplementat. Programatorul însă nu ar trebui să utilizeze acest bit, acesta putând fi utilizat în viitoare produse din familia AT89. Întreruperea de Timer 2 este generată de "sau logic" între biții TF2 și EXF2 ai registrului T2CON. Niciunul din acești indicatori nu este șters de hardware când rutina de ordine indică acea zonă. De fapt, rutina de ordine trebuie să determine care din cei doi biți TF2 sau EXF2 au generat întreruperea, iar acel bit va trebui sa fie setat din software.

În modul Idle, UCP-ul se pune în starea de hibernare, în timp ce toate perifericele ramân active. Modul este invocat de software. Conținutul RAM de pe chip și toți regiștrii cu funcții speciale rămân neschimbați în timp ce acest mod este setat. Modul idle poate fi terminat de activarea oricărei întreruperi sau de către o resetare hardware. Atunci când modul Idle este terminat de o resetare hardware, dispozitivul în mod normal reia execuția programului de acolo de unde a fost întreruptă, până la 2 cicluri de mașină, înainte ca algoritmul de resetare internă să preia controlul. Hardware-ul pe aceeași placă împiedica accesul la RAM-ul intern în timpul acestui eveniment, dar accesul la porturi nu este blocat. Pentru a elimina posibilitatea unei scrieri neașteptate la un pin al unui port, când modul Idle este terminat prin resetare, instrucțiunea ce o urmează pe aceea care invocă modul idle, trebuie sa nu fie de scriere pe pinul unui port sau în memoria externă.

Modul Power-down

[modificare | modificare sursă]

In modul Power-down , oscilatorul este opritm iar intrucțiunea care cheamă modul Power-down este ultima instrucțiune executată. RAM-ul pe aceați chip și Regiștrii cu Funcții Speciale rețin valorile lor până când modul Power-down ia sfârșit. Ieșirea din modul Power-down poate fi inițiată atât printr-o resetare hardware sau prin activarea unei întreruperi externe. Resetarea schimbă valorile Regiștrilor cu Funcții Speciale însă nu modifică RAM-ul de pe chip. Resetarea nu poate fi activată înainte ca Vcc sa revină la nivelul său de operare și trebuie menținută activă suficient de mult pentru a permite oscilatorului resetarea și stabilizarea.