Programator Pentru Microcontrolerul Pic16c84

TEMA PROIECTULUI

Capitolul 1. Prezentarea microcontrolerului PIC16C84

1.0 ARHITECTURA INTERNĂ

2.0 ORGANIZAREA MEMORIEI

2.1 ORGANIZAREA MEMORIEI PROGRAM

2.2.1 GENERAL PURPOSE REGISTER FILE

2.2.2 SPECIAL FUNCTION REGISTERS

2.2.2.1. Registrul de stare “STATUS”

2.2.2.3. REGISTRUL INTCON

4.3.PCL și PCLATH

2.3.1..COMPUTED GOTO.

2.3.2..STUCK ( stiva ).

2.3.3.. PAGINAREA MEMORIEI PROGRAM

3.0 Porturile I/O

3.1. Portul A și registrul TRISA

3.2. Regiștrii PORT B și TRIS B

3.3. Considerații cu privire la programarea pinilor I/O

3.3.1. Porturile I/O bidirecționale

3.3.2. Operații succesive la porturile I/O

4.0. Timerul 0 (TMR0)

4.1. Întreruperile timerului TMR0

4.2. Utilizarea timerului TMR0 cu tact extern

4.2.1. Sincronizarea tactului extern

4.2.2. Întârzierea la incrementare a timerului TMR0

4.3. Prescalarul

4.3.1. Desemnarea destinației prescalarului

5.0. Memoria EEPROM de date

6.0. CARACTERISTICILE SPECIALE ALE UNITĂȚII CENTRALE DE PRELUCRARE PENTRU MICROPROCESORUL PIC16C84

6.1. BIȚII DE CONFIGURARE

6.2. CONFIGURAREA OSCILATORULUI

6.3. Reset

8.4. POR, PWRT și OST

8.4.1. Power-On Reset (POR)

6.5. Întreruperile

6.7. Temporizatorul WDT (Watchdog)

6.8. Modul de funcționare ‘power-down’ (SLEEP).

6.9. Protecția codului

6.10. Locațiile de identificare ID

6.11. Progaramarea serială ‘in circuit’

7.0. Setul de instrucțiuni al microcontrolerului PIC16C84

8.0. Specificații privind programarea memoriei EEPROM

8.1. Programarea microprocesorului PIC16C84

8.2.0. Program mode entry

9.0. CARACTERISTICI ELECTRICE

Capitolul 2. Placa programator

2.0. SOLUȚII DE IMPLEMENTARE HARDWARE

2.1. Exemplul1 de programator pentru microcontrolerului PIC16C84

Capitolul 3. Sistemul de dezvoltare ‘SDD51’

1.1. Alimentare cu tensiune nestabilizată externă

1.2. Alimentare cu tensiune stabilizază externă

2.0. CONECTAREA SDB-51 CU CALCULATORUL PC

3.0. CONFIGURAREA MEMORIEI

3.1. Configurarea memoriei pentru un sistem de dezvoltare

3.2. Configurarea memoriei pentru un sistem de aplicație

4.0. CIRCUITUL DE RESET

5.0. CIRCUITUL DE TACT

6.0. CIRCUITELE SEMNALELOR DE ÎNTRERUPERE

7.0. MONTAREA PE PLACĂ A UNOR CIRCUITE SUPLIMENTARE

8.0. CONECTAREA PE MAGISTRALĂ A CIRCUITELOR DE EXTENSIE1. PREZENTARE GENERALĂ

ANEXA 1

Fara figuri

=== PROTTECT1 ===

TEMA PROIECTULUI

Am ales ca obiect de studiu al proiectului ‘Microcontrolerul PIC16C84’. Am optat pentru acest circuit din mai multe motive pe care le voi prezenta în continuare.

Circuitul PIC16C84 face parte dintr-o generație relativ nouă de circuite din gama de microcontrolere ale firmei ‘Microchip Technology Incorporated’ (de unde au și numele: ‘Peripheral Interface Controlers’ sau ‘PIC’). Este interesant de știut că microcontrolerul PIC16C84 poate fi programat în două moduri: atât printr-o metodă serială cât și printr-una paralelă.

Ceea ce face ca microcontrolerului PIC16C84 să fie și mai interesant de studiat este implementarea memoriei program în tehnologie EEPROM. Aceasta dă microcontrolerului PIC16C84 un mare avantaj față de clasicele microcontrolere EPROM, chiar față de alte ‘PIC’-uri, deoarece în faza de prototip a proiectului PIC16C84 poate fi reprogramat aproape instantaneu (în aprox. 20sec.).

Un alt avantaj oferit de PIC16C84 este arhitectura tip RISC (set redus de instrucțiuni) și arhitectura de tip Harward, în care programele și datele sunt apelate de la memorii diferite. Memoria program si memoria de date au fiecare magistrala sa, accesul la fiecare bloc de memorie putându-se realiza in timpul aceluiași ciclu de oscilație.

Dintre perfomanțele microcontrolerului PIC16C84 mai putem aminti: curentul mare absorbit/debitat pentru comanda directă a unor LED-uri, capsula cu numai 18pini, posibilitatea programării seriale a memoriei EEPROM de date și a memoriei de program EEPROM, consumul redus de energie, posibilitatea alegerii oscilatorullui extern în funcție de necesități (și implicit a frecvenței), și altele.

Circuit temporizator ‘watchdog’, cu propriul oscilator RC intern, asigură protecția împotriva blocăriilor ‘software’.

Familia circuitului PIC16CXX are niște caracteristici speciale prin care se reduce numărul componentelor externe, deci se reduce prețul și consumul de energie, și se mărește durata de viață. Una din metodele de reducere a consumului este modul de funcționare latent (starea SLEEP).

Față de alte microcontrolere pe 8-biți din aceeași clasă, microcontrolerul PIC16C84 poate obține o compresiei de 2:1 a codului și o îmbunătățire de 2:1 a vitezei de lucru.

Programarea serială a microcontrolerului PIC16C84 se realizează simplu prin două linii de ‘tact’ și de ‘date’, și alte 3 linii pentru alimentare, masă și pentru tensiunea de programare. Programarea serială ‘in-circuit’ permite reânnoirea codului fără scoaterea dispozitivului de pe placă. Acest lucru este util mai ales în aplicațiile la care accesul pe placă, la dispozitiv, este greu de efectuat.

Scopul proiectului fiind programarea serială a memoriei EEPROM a microcontrolerului PIC16C84, este de la sine înțeles că vomavea nevoie de un programator. PIC16C84 poate fi programat serial prin intermediul portul paralal al unui calculator compatibil PC. Pentru comunicarea între programator și calculator se folosesc doar două linii ale portului.

Dorim deci și realizarea unei plăci prototip a programatorului care să permită pe lângă programarea memoriei microcontrolerului și verificarea unor aplicații ulterioare. Această placă prototip va conține: un soclu ZIF cu 18-pini, o sursă de alimentare, doi conectori (intrare și ieșire), un oscilato cu cuarț, un buton de reset și un set de LED-uri.

Capitolul 1. Prezentarea microcontrolerului PIC16C84

Circuitul PIC16C86 este un microcontroler EEPROM pe 8 biți construit in tehnologie cmos.

Unitatea centrală de prelucrare (CPU) a microcontrolerului PIC16C84 are următoarele caracteristici:

-este un microcontroler de tip RISC, adică are un set redus de instrucțiuni (doar 35 instrucțiuni de invățat)

-toate instrucțiunile au lungimea de un singur ciclu mașină cu durata de 400ns cu excepția instucțiunilor de salt(2 x 400ns)

-frecvența de operare este de 10MHz

-lungimea instructiunilor este de 14biți

-datele sunt pe 8biți

-o capacitate de 1K x 14biti de memorie program(de adrese)

-o capacitate de 64 x 8 de memorie de date

-un număr de 36 registre SRAM pentru scopuri generale

-un număr de 15 registre cu funcții speciale

-un număr de 8 nivele de stocare hard

-are 3 moduri de adresare:direct,indirect si relativ

-are 4 surse de intrerupere: -externă la pinul RB0/INT

-depașire la timerul’0’

-internă,din program, la portul B 7..4

-când se scrie in EEPROM

Circuitele periferice ale microcontrolerului:

-13 pini I/O cu control individual al direcție

-curent mare absorbit/debitat pentru comanda directă a LED-urilor:

-25mA curent maxim absorbit/pin

-20mA curent maxim debitat/pin

-TMR0: temporizator/numărător cu prescalar programabil pe 8biti

Principalele caracteristici ale PIC16C84 specifice tehnologiei CMOS puterea mică și viteza ridicată.

1.0 ARHITECTURA INTERNĂ

Performanțele microprocesorului PIC16C84 pot fi atribuite unui număr de trăsături arhitecturale deseori intâlnite la microprocesoarele de tip RISC. Pentru început trebuie amintit că microprocesorul PIC16C84 utilizează o arhitectura de tip Harvard, care permit instrucțiuni de dimensiuni diferite de 8biti pentru cuvintele de date. Magistrala program fiind de 14biti face posibilă ca toate instrucțiunile sa fie -SINGLE WORD- și să poată fi executate într-un singur ciclu mașina. Microprocesorul PIC16C84 poate să adreseaza 1K x 14bit de memorie program. Toata memoria program este internă, PIC16C84 putând să-și adrseseze direct sau indirect registrele si memoria de date.Toate registrele cu functionare specială, incluzând si Program Counter-ul (numărătorul de program), sunt descrise in memoria de date. Microprocesorul PIC16C84 conține o unitate aritmetico-logică (ALU) pe 8biti si un registru de lucru (W register) care este utilizat pentru operațiile unității ALU. În funcție de instrucțiunea de executat, ALU poate afecta valorile biților: carry (C), digit carry (DC), și zero (Z) din registrul de stare.Biții C si DC opereaza ca biții de ieșire Borrow si Digit Borrow

Figura 1.1. Arhitectura internă a microcontrolerului PIC16C84 (schema bloc)

–––––

Tabelul 1-1. DESCRIEREA PINILOR LA PIC16C84

Legenda:I-intrare, O-ieșire, I/O-intrare/ieșire, P-power, ST- intrare cu Trigger Schmitt

Notă 1:Acest buffer este o intrare cu Trigger Schmitt când este configurat ca întrerupere externă.

2: Acest buffer este o intrare cu Trigger Schmitt când este utilizat iin modul de programare serială.

3: Acest buffer este o intrare cu Trigger Schmitt când este configurat modul de lucru ‘oscilator RC’ și este o intrare CMOS în rest.

1.1 Schema de tact/Ciclul instructiune

Intrarea de tact (OSC1) este divizată intern cu 4 pentru a forma patru cicluri, care nu se suprapun, denumite: Q1, Q2, Q3 și Q4. Numărătorul de program (PC) se incrementează la fiecare ciclu Q1, instrucțiunea este extrasă din memoria program și intră în registrul de instrucțiuni în timpul ciclului Q4. Instrucțiunea este decodată și executată pe durata dintre Q1 si Q4.

1.2 Mersul instructiunii/Tehnica PIPE-LINE

Un ciclu instrucțiune constă in 4 cicluri Q (Q1 Q2 Q3 Q4) . Extragerea si execuția instrucțiunii se face in tehnica ‘PIPE-LINE’ in așa fel ca extra- gerea ia un ciclu intrucțiune in timp ce decodarea și execuția durează tot un ciclu instrucțiune. Oricum, datorită PIPE-LINE-lui fiecare instrucțiune este executată efectiv intr-un singur ciclu.Daca este vorba de o instrucțiu- ne de salt (GOTO) atunci este nevoie de două cicluri pentru a termina instrucțiunea.

Figura 1.2: Tact/Ciclu instrucțiune

Un ciclu de extragere incepe prin incrementarea PC in Q1.Într-un ciclul de execuție instrucțiunea extrasă este introdusă in Registrul de Instrucțiuni in ciclul Q1. Instrucțiunea este decodată și executată in timpul ciclurilor Q2, Q3 si Q4.Memoria de date este citită in timpul Q2 (citirea operandului) ăi scrisă in timpul Q4 (scrierea destinației).

Exemplul 1.1: Fluxul instrucțiunior în tehnica ‘PIPE-LINE’

2.0 ORGANIZAREA MEMORIEI

In microcontrolerul PIC16C84 exista doua memorii: memoria program si memoria de date. Fiecare bloc are magistrala sa, deci accesul la fiecare bloc de memorie se poate realiza in timpul aceluiași ciclu de oscilație.

Memoria de date poate fi utilizată ca un RAM pentru scopuri generale, și pentru Registrele cu Funcții Speciale. Operațiile registrelor SFR (Special Function Registers), care controlează ‘miezul’, sunt descrise in acest paragraf. Registrele SFR utilizate pentru a controla modulele periferice sunt descrise in paragraful respectiv, discutându-se despre fiecare modul funcțional in parte.

Zona memoriei de date conține de asemenea memoria EPROM de date. Aceasta memorie nu este direct ‘mapată’ in memoria de date, ci indirect. Acesta este un indicator de adresare indirectă care specifică ca din/în adresa memoriei EEPROM de date să se citească/scrie. Cei 64 bytes de memorie EEPROM de date au domeniul de adrese: 00…3Fh. Detaliile vor fi prezentate la paragraful 5.0

2.1 ORGANIZAREA MEMORIEI PROGRAM

PIC16C84 are un numărător de Figura 2.1: Maparea memoriei program și stiva

program PC pe 13 biți capabil să adreseze un spațiu de memorie program de 1Kx14 biți. Pentru microcontrolerul PIC16C84 doar primul ‘kilo’ 1Kx14 (0000…03FFh) este implementat fizic. Accesând o locație de deasupra adresei implementate fizic va cauza un WRAPAROUND. De exemplu locațiile: 20h, 420h, 820h, C20h, 1020h, 1420h, 1820h si 1C20h vor fi aceeași instrucțiune.

Vectorul de reset este la 0000h iar cel de întrerupere este la 0004h ca in figura 2.1.

Figura 2.2: Maparea registrului filă

2.2 ORGANIZAREA MEMORIEI DE DATE

Memoria de date este imparțită în două zone. Prima este zona registrelor SFR, în timp ce a doua este zona registrelor GPR (General Purpose Registers). Registrele SFR controlează operațiile dispozitivului.

Porțiuni din memoria de date sunt restricționate (banked). Acest lucru este valabil pentru ambele zone: SFR si GPR. Zona GPR este bankată pentru a exista mai mult de 96 bytes de memorie RAM de interes general. Zonele bankate din zona GPR-urilor sunt rezervate pentru registrele ce controleaza funcțiile periferice. Bancarea necesită utilizarea biților de control pentru selecția regiunior 'bank'. Acești biți se găsesc în registrul STATUS.

Instrucțiunile ‘MOVWF’ și ‘MOVF’ pot transfera valori din registrul W in orice locație din registrul de pagină F (file) și vice-versa.

Notă: (1) nu este un registru fizic. Zonele hașurate sunt neimplementate (citite ca ‘0’).

Toata memoria de date poate fi accesată fie direct fie indirect prin intermediul registrului FSR (File Select Register). Adresarea indirectă utilizează valorile prezente ale biților RP1 și RP0 pentru acces in zonele bancate ale memoriei de date.

Memoria de date este impărțită în două 'bank'-uri care conțin GPR-le și SFR-le. Bancul '0' este selectabil prin punerea pe '0' a bitului RP0 (STATUS <5>). Punera bitului RP0 pe '1' logic aduce după sine selecția bancului '1'. Fiecare banc conține 128 bytes. Cea mai de jos locație a fiecărui banc este rezervată pentru SFR-uri. Deasupra SFR-urilor sunt GPR-urile implementate ca memorii RAM fixe.

2.2.1 GENERAL PURPOSE REGISTER FILE

Registrul de pagină (File) este accesat fie direct fie indirect prin intermediul FSR. Toate componentele au o anumită importanță în zona GPR-urilor. Acestea sunt registre pe 8 biti. Daca zona GPR-urilor este mai mare de 96 bytes, bancarea trebuie să fie făcută astfel încât să se acceseze spațiul de memorie adițional.

PIC16C84 nu are în zona GPR memorie bancată. Orice acces la bancul '1' va cauza ca accesul să se găsească în bancul '0'. Aceasta înseamnă că bitul cel mai semnificativ (MSB) al adresei directe va fi ignorat.

Tabelul 2.1: Conținutul registrului filă

Legendă: X= necunoscut. U=neschimbat. – = neimplementat, citit ca ‘0’ logic.

?= valoare care depinde de condiții.

Notă 1: Byte-ul superior al PC nu este direct accesibil. PCLATH este un registru ‘slave’ pentru PC <12:8>. Conținutul lui PCLATH poate fi transferat byte-ului superior al PC, dar conținutul PC <12:8> nu este transferat niciodată în PCLATH.

2: Biții de stare /TO și /PD din registrul de stare ‘STATUS’ nu sunt afectați de /MCLR reset.

2.2.2 SPECIAL FUNCTION REGISTERS

SFR-urile sunt utilizate de CPU și de funcțiile periferice ca să controleze operațiile componentelor. Aceste registre sunt de tip RAM static.

2.2.2.1. Registrul de stare “STATUS”

Figura 2.3: Registrul STATUS

R/W R/W R/W R R R/W R/W R/W

bitul 7 bitul0

bitul C: Carry/Borrow

pentru instrucțiunile ADDWF și ADDLW

1= extrage MSB al rezultatului

Notă: scăderea se efectuează prin adunarea celor doi complemenți ai celui de-al doilea operand. Pentru instrucțiunile de rotire (RRF, RLF) acest bit este încărcat impreună cu unul din biții ‘low’ sau ‘high’ ai registrului sursă.

0= nu extrage MSB al rezultatului

Notă: Pentru ‘borrow’ (împrumut) polaritatea este inversată.

bitul DC: Digit Carry / Digit Borrow

pentru instrucțiunile ADDWF și ADDLW

1= extrage rezultatul din ultimii 4-biți mai puțin semnificativi

0= nu extrage rezultatul din ultimii 4-biți mai puțin semnificativi

Notă: Pentru ‘borrow’ (împrumut) polaritatea este inversată.

Bitul Z: bitul zero

1= rezultatul unei operații aritmetice sau logice este zero.

0= rezultatul unei operații aritmetice sau logice nu este zero.

Bitul /PD: Power Down

1= apare după pornire (power-up) sau printr-o instrucțiune CLRWTD

0= prin executarea instrucțiunii SLEEP

bitul /TO: bitul de ‘time-out’

1= apare după pornire (power-up) sau printr-o instrucțiune CLRWTD sau SLEEP

0= ‘time-out’-ul timerului WDT s-a terminat

bitul RP0,RP1: biții de selecție al bancului de registre

00= bancul ‘0’(00h – 7Fh)

01= bancul ‘1’(80h – FFh)

10= bancul ‘2’(100h – 17Fh)

11= bancul ‘3’(180h – 1FFh)

Fiecare banc are 128-bytes. Pentru microcontrolerul PIC16C84 se utilizaeză doar bitul RP0. Bitul RP1 ar trebui programat pe ‘0’ logic,deoarece nu este recomandabilă utilizarea lui în scopuri generale pentru citit/scris.

Bitul IRP: bitul de selectare a băncii registrului, în cazul adesării indirecte.

0= bancul ‘1,2’(00h – FFh)

1= bancul ‘3,4’(100h – 1FFh)

Bitul IRP nu este utilizat de PIC16C84. El ar trebui programat pe ‘0’ logic. Nu este recomandabilă utilizarea lui în scopuri generale pentru citit/scris.

Registrul “Stare” conține starea aritmetică a ALU, starea resetului, și titlul de selecție a băncii de memorie de date. La fel ca orice registru, registrul de stare poate fi destinația oricărei instrucțiuni.

Dacă registrul de stare este destinat pentru o instrucțiune ce afectează biții Z, DC, sau C, rezultă că scrierea în acești biți este dezasamblată. Acești biți sunt pe “0” sau pe “1”, acordându-se componentei logice. În plus, biții TO și PD nu sunt inscriptibili. De aceea rezultatele unei instrucțiuni cu destinația registrului stare poate fi diferit față de cel intenționat.

De exemplu: CLRF STATUS va șterge cei mai de sus 3 biți și va pune pe “1” bitul Z, deci registrul stare = 000u1uu (u – nemodificabil).

Doar BCF, BSF, SWAPF și NOVW ar trebui folosite pentru a schimba registrul de stare, deoarece aceste instrucțiuni nu afectează nici un bit.

Notă 1. Biții 1RP și RP1 nu sunt utilizați de PIC16C84 și ar trebui programați pe “0”. Utilizarea acestor biți pentru scopuri generale de scriere/citire nu este recomandată deoarece ar putea afecta compatibilitatea cu produsele viitoare.

Notă 2. Biții C și DC operează ca biții de ieșire barrow și digit barrow, respectiv în scădere. A se vedea instrucțiunile SUBLW și SUBWF.

2.2.2.2. REGISTRUL DE OPȚIUNI

Registrul de opțiuni este inscriptibil și citibil și conține biți variați de control pentru a configura prescalarul TMR0/WDT, întreruperea externă INT a TMR0, și pentru a stabili ‘pull-up’-ul portului B.

Figura 2.4: registrul ‘OPTION’

R/W R/W R/W R /W R/W R/W R/W R/W

bitul 7 bitul 0

biții PS0:PS2

bitul PSA: desemnarea prescalarului

1= precalarul atribuit timerului WDT

0= precalarul atribuit timerului TMR0

bitul TOSE: bitul de selecție a frontului sursei TMR0

1= la pinul RA4 / TOCKI incrementarea se face la tranziția ‘high – low’

0= la pinul RA4 / TOCKI incrementarea se face la tranziția ‘low – high’

bitul TOCS: bitul de selecție a sursei de tact penru TMR0

1=tranziția se faca la pinul RA4 / TOCKI

0= tactul se generează printr-un ciclu de instrucțiune intern

bitul INTDEG: bitul de selecție a frontului pentru întreruperi

1= întreruperea se facepe frontul crescător al pinului RB4 / TOCKI

0= întreruperea se facepe frontul descrescător al pinului RB4 / TOCKI

bitul /RBPU: bitul de validare a ‘pull-up’-ului pentru portul ‘B’

1= ‘pull-up’-ul portului ‘B’ este invalidat

0= ‘pull-up’-ul portului ‘B’ este validat, prin valorile latchurilor portului.

2.2.2.3. REGISTRUL INTCON

Este R/W și conține biți pentru toate sursele de întreruperi.

Notă: TOIF, INTF sau RBIF vor fi setați prin specificarea condițiilor chiar dacă bitul corespunzător întreruperii este șters (întreruperea dezactivată) sau bitul GIE este șters (toate întreruperile dezactivate).

Figura 2.3: Registrul INTCON

R/W R/W R/W R /W R/W R/W R/W R/W

bitul 7 bitul 0

bitul RBIF: marchează o întreruperii la modificarea biților la intrarea portului ‘B’

1= când cel puțin una din intrările RB< 7:4 > se modifică

0= când nu se modifică nici una din intrările RB< 7:4 >

bitul INTF: marchează o întrerupere externă

1= are loc întreruperea externă INT (trebuie șters prin soft)

0= nu are loc întreruperea externă INT

bitul TOIF: marchează întreruperea la depășire a timerului TMR0

1= are loc depășirea la timerul TMR0 (trebuie sters prin soft)

0= nu are loc depășirea la timerul TMR0

bitul RBIE: validează întreruperile cauzate de modificările la intrarea portului ‘B’

1= validează întreruperea RBIF

0= invalidează intreruperea RBIF

bitul INTE: validează întreruperea INT

1= validează întreruperea INTF

0= invalidează intreruperea INTF

bitul TOIE: validează întreruperea TOIF

1= validează întreruperea TOIF

0= invalidează intreruperea TOIF

bitul EEIE: validează intreruperea cauzată de scrierea completă în memoria EE

1= validează întreruperea ‘EE write complete’

0= invalidează intreruperea ‘EE write complete’

bitul GIE: valideză întreruperea globală

1= validează intreruperile nemascate

0= invalidează toate întreruperile

4.3.PCL și PCLATH

Program counterul este pe 13 biți. PCL este byte-ul low, și este un registru R/W. Byte-ul high al PC (PCH), nu poate fi direct scris sau citit. PCLATH (PC latch high) este un registru ‘holding’ pentru biții 12…8 ai numărătorului de program, in care conținutul este transferat in PCH. Când numărătorul de program este încărcat cu o nouă valoare în timpul :CALL, GOTO sau a scierii în PCL, biții high ai PC sunt încărcați din PCLATH.

Figura 2.6: Încărcarea numărătorului de program

12 (PCH) 8 7 (PCL) 0 12 11 10 8 7 0

PC PC

5 PCLATCH< 4:0> 8 a) 2 PCLATCH <4:3> 11 b)

rezultate de la opcode <10:0> PCLATH ALU PCLATCH

În figura 2.6. se prezintă două situații de încărcare a PC: a) în urma unor instrucțiuni care au PC-ul ca destinație iar b) rezultă în urma unor operații: GOTO sau CALL.

2.3.1..COMPUTED GOTO.

Când facem o citire a unui tabel utilizând metoda de calcul GOTO trebuie avut grijă dacă locația tabelului intersectează limita memoriei PCL (fiecare bloc de 256 bytes).

2.3.2..STUCK ( stiva ).

PIC16C84 are 8 stive hard pe 13 biți (fig 4.1). Spațiul alocat stiei nu face parte din nici un program de date, iar pointerul stivei nu poate fi citit sau scris. Toți cei 13 biți ai PC sunt înpinși (push) într-o stivă când se execută o instrucțiune de CALL sau la apariția unei întreruperi. Stiva este introdusă în desfășurarea execuției instrucțiunilor: RETURN, RETLW, sau RETFIE. PCLATH nu este afectat de nici o operație PUSH sau POP.

Stiva operează ca un buffer circular. Asta inseamnă că după ce stiva a fost împinsă de 8 ori, al nouălea PUSH scrie peste valoarea ce a fost înscrisă la primul PUSH. Cu a zecea împingere se scrie peste valoarea celei de-a doua împingeri.

Dacă stiva este ‘trasă’ (POP-ed) de 9 ori, valoarea numărătorului de program este aceeași cu valoarea de la primul POP.

2.3.3.. PAGINAREA MEMORIEI PROGRAM

PIC16C84 are 1K de memorie program. Instrucțiunile CALL și GOTO au o adresă pe 11 biți. Această adresă pe 11 biți permite o ramificare înăuntru a mărimii paginii memoriei program cu 2K.

Pentru viitoarea expansiune a memoriei program la PIC16C84 trebuie să existe alți doi biți care să specifice pagina memoriei de program. Acești biți de pagină vin din PCLATH. Cănd se execută o instucțiune CALL sau GOTO , utilizatorul trebuie să se asigure că acești biți de pagină, biții 4 și 3 ai PCLATH, sunt programați pentru pagina de memorie dorită. Dacă este executată instrucțiunea CALL ( sau o întrerupere), toți cei 13 biți ai PC sunt transferați în stivă. De aceea manipularea biților de pagină nu este cerută pentru instrucțiuni de revenire (care extrag conținutul numărătorului de program din stivă).

Adresarea indirectă ; registru INDF și FSR.

Registrul INDF nu este un registru fizic și este folosit în conjuncție cu registrul FSR pentru adresarea indirectă.

Adresarea indirectă este posibilă utilizând registrul INDF. Orice instrucțiune care utilizează INDF, în realitate accesează și pointerul de date prin FSR (File Releat Registor). Citirea lui INDF în sine (FSR=0) va produce indirect 00h. Scrierea în registru INDF rezultă indirect într-o non-operație (altfel biții de stare ar putea fi afectați). O adresă efectivă de 9 biți este obținută concatenând cei 8 biți ai registrului FSR cu bitul IRP (STATUSC <7>), așa cum se vede în figura 2.7. Oricum, IRP nu este utilizat de PIC16C84.

Iată un program simplu pentru a șterge locațiile 20h-2Fh din RAM utilizând adresarea indirectă:

MOVLW 0x20; inițializarea pointerului pentru RAM

MOV F FSR;

NEXT CLRF INDT: ștergerea registrului INDF

INCF FSR: ….tarea pointerului

BTFSS FSR,4; all done? Totul este gata?

GOTO NEXT; Nu, clear NEXT

CONTINUE; Da, continuăm.

Figura 4.7. Adresarea directă/indirectă

––-

3.0 Porturile I/O

PIC16C84 are 2 porturi: PORTA și PORTB. Unii pini ai porturilor sunt multiplicați cu o funcție alternată pentru alte caracteristici ale dispozitivului.

3.1. Portul A și registrul TRISA

Portul A este un latch pe 5 biți. RAM este cu intrare trigger schmitt și ieșire open colector. Toți ceilalți pini ai portului RA sunt de tipul intrare pe rulele TTL și ieșire cu CMOS. Toți pinii au biți de date pentru direcție (reg. TRIS) care pot configura acești pini ca I/O. Un “1” logic la orice bit din registrul TRISA pune în corespondență ieșirea în ‘high Z’. Un ‘0’ logic pune conținutul latch-ului de ieșire la pinul selectat. Citind registrul PORTA, citim starea pinilor câtă vreme scriind către ele vom scrie la latch-ul portului. Toate operațiile de scriere sunt operații de citire–modificare-scriere. Deci scrierea la un port implică ca pinii portului să fie întâi citiți, apoi această valoare este modificată și scrisă latch-ului de date al portului.Pinul RA4 este multiplexat cu intrarea de tact a timerului TMR0.

Figura3.1: Diagrama bloc a pinilor RA3:RA0 Figura 3.2: Diagrama bloc a pinului RA4

Tabelul 3.1: Funcțiile portului ‘A’

Legendă: TTL= intrare TTL; ST= trigger schmitt

Exemplu: inițializarea Portului A.

CLRF PORTA; inițializarea portului A prin setarea pe ieșire a latch-ului de date.

BSF STATUS.RPO; selectarea

MOVLW OXCF; valoare utilizată pentru a inițializa direcția datelor;

MOVWF TRISA; setăm RA<3:0> ca intrări

; RA<5;4 ca ieșiri.

; TRISA<7;6> sunt citiți tot timpul ca “0” logic.

Tabelul 3.2: Registrele asociate portului ‘A’

3.2. Regiștrii PORT B și TRIS B

Portul B este pe 8 biți și este bidirecțional. Registrul TRISB este responsabil de direcția datelor în Portul B. Un “1” logic la oricare bit din registrul TRISB pune în stare “Z” ieșirea corespunzătoare a Portului B. Zero “0” logic la orice bit din TRISB pune conținutul latch-ului de ieșire la pinul selectat. Fiecare pin al Portului B are un pull-up intern slab. Un singur bit de control poate activa toate pull-up-urile. Aceasta este făcută ștergând bitul RBPU (option <7>). Pull-up-ul slab este automat stins când pinul portului este configurat ca o ieșire.

Patru din pinii portului B, RB7-RB4 au caracteristică “interupt on change”. Doar pinii configurați ca intrări pot face ca întreruperea să aibă loc (oricare pin RB7:RB4 configurați ca ieșire se exclud din comparația “interupt on change”. În modul intrare valoarea pinilor este comparată cu valoarea anterioară găsită la ultima citire a portului B. “Nepotrivirea” ieșirilor pinilor sunt “adunate” printr-o poartă SAU pentru a genera întreruperea RBIF (INTCON <0>).

Această întrerupere în stil “nepotrivire”,împreună cu opririle (pull-up), configurabile soft a acestor 4 pini, permite o interfață ușoară spre un “key pad”.

Tabelul 3.3 : Funcțiile portului ‘B’

Legendă: TTL= intrare TTL; ST= trigger schmitt

* = Când este configurat ca întrerupere externă acest ‘buffer’ este un trigger schmitt

* = Când este utilizat în modul de programare serială acest ‘buffer’ este un ‘ST’

Figura 3.3: Diagrama bloc a pinilor Figura 3.4: Diagrama bloc a pinilor

RB7:RB4 RB3:RB0

Notă 1: TRISB=1 permite un slab ‘pull-up’ dacă bitul /RBPU=0

2: pinii de intrare/ieșire au diode de protecție legate la Vdd și Vss

Notă: Dacă o schimbare a pinilor I/O are loc când operația de citire este în timpul executării, eticheta întreruperii “on change” este recomandată pentru operația “wake-up on key depression” și în operațiunile în care pentru întreruperile “on change” este utilizat doar portul B.

Alegerea portului B nu este recomandată atâta timp cât se utilizează întreruperile “on change”.

Exemplu: inițializarea portului B

CLRF PORTB; inițializează portul B setând latch-urile de date la ieșire.

BSF STATUS, RPO; selectează bancul 1.

MOVLW OXCF; valoare utilizată pentru inițializarea direcției datelor.

MOVWF TRISB; se setează RB<3-0> ca intrări

RB<5:4> ca ieșiri

TRISB <7:6> sunt întotdeauna citite ca “0” logic.

Tabelul 3.4 : Registrele asociate portului ‘B’

Legendă : x = necunoscut

3.3. Considerații cu privire la programarea pinilor I/O

3.3.1. Porturile I/O bidirecționale

Orice instrucțiune care este scrisă operează intern ca o operație de citire urmată de una de scriere. Instrucțiunile BCF și BSF de exemplu, citesc registrul în CPU, execută operația de bit și scriu rezultatul înapoi în registru. Trebuie avut grijă când aceste instrucțiuni sunt aplicate unui port cu amândouă direcții (intrare/ieșire) definite. De exemplu, o operație BSF la bitul 5 al portului B ca cauza citirea tuturor celor 8 biți ai portului B în CPU. Apoi operația BSF are loc în bitul 5 și portulB este scris la latch-urile de ieșire. Dacă un alt bit al portului B este utilizat ca pin I/O bidirecțional și dacă acest bit este configurat ca “intrare” la acest moment, semnalul de intrare prezentat la pinul însuși va fi citit în CPU și rescris la latch-ul de date al acestui pin, scriind peste conținutul anterior. Atâta timp cât pinul stă pe mod input, nu există nici o problemă. Totuși, dacă bitul “0” este comutat în mod “ieșire” mai târziu, conținutul latch-ului de date nu este cunoscut.

Citind regiștrii porturilor A și B, citim de fapt valorile pinilor porturilor. Scrierea în regiștrii porturilor A și B este de fapt scrierea valorilor în latch-urile porturilor A și B.

Când utilizăm o instrucțiune de citire – modificare- scriere. (de exemplu: BCF, BSF, etc.) la un port, valoarea pinilor porturilor este citită, operația dorită este făcută la această valoare, și apoi această valoare este scrisă la latch-urile porturilor.

3.3.2. Operații succesive la porturile I/O

Scrierea la un port I/O se întâmplă la sfârșitul unui ciclu instrucțiune, pe când pentru citire, datele trebuie să fie valide la începutul ciclului instrucțiune (figura 5.5). De aceea trebuie avut grijă dacă o operație de scriere este urmată de una de citire este adusă la același port I/O.

Secvența instrucțiunilor trebuie să fie în așa fel încât tensiunea la pini să fie stabilizată înainte de execuția următoarei instrucțiuni ce cauzează citirea paginii în CPU. Dacă nu, starea anterioară a șirului poate fi citită în CPU mai degrabă decât noua stare.

În concluzie, este mai ușor să separăm astfel de instrucțiuni cu un NOP sau cu alte instrucțiuni care nu afectează (accesează) acest port I/O.

Exemplul 3.3. arată efectul pe care îl au două instrucțiuni de citire –memorare- scriere consecutivă la același port I/O.

Exemplul 3.3.

; setarea inițială a portului: PORT B<7:4> Inputs

; PORT <3:0> Outputs.

; Portul B<7:6> au pull-up-uri exterioare și nu sunt conectate la alte circuite.

Latch-ul portului Pinii portului

BCF PORTB, 7 ; 01pp pppp 11pp pppp

BCT PORTB, 6 ; 10pp pppp 11pp pppp

BCF STATUS, RP0 ;

BCF TRISB, 7 ; 10pp pppp 11pp pppp

BCF TRISB, 6 ; 10pp pppp 10pp pppp

Figura 3.5: Operațiile I/O succesive

––––––

4.0. Timerul 0 (TMR0)

Modulul TMR0 este un numărător/temporizator și are următoarele caracteristici:

– numărător/temporizator pe 8-biți

în/din el se poate scrie/citi

are un prescalar pe 8-biți programabil soft

are tact programabil intern sau extern

are sistem de întrerupere la depășire (de la FFh la 00h)

frontul tactului extern poate fi selectat

Funcționarea ca temporizator este selectabilă ștergând bitul TOCS (OPTION<5>). În acest mod de lucru, modulul TMR0 va incrementa orice ciclu instrucțiune (fără prescalar). Dacă se scrie în TMR0 incrementarea este inhibată pentru următoarele două cicluri (fig 4.2 și 4.3). Utilizatorul poate lucra în jurul acestei chestiuni, ajustând valoarea modulului TMR0.

Funcționarea în regim de numărător este posibilă prin punerea pe ‘1’ logic a bitului TOCS (OPTION <5>). În modul de funcționare ca numărător TMR0 va incrementa pe frontul crescător sau căzător al semnalului de la pinul RA4/TOCKI in funcție de valoarea bitului TOSE (OPTION < 4 >). Ștergerea bitului TOCS selectează frontul crescător. Restricțiile pentru clock-ul extern sunt discutate în paragraful 4.2.

Figura 4.1: Schema bloc a timerului TMR0

–––-

Notă 1: Biții TOCS, TOSE, PS2, PS1, PS0 și PSA sunt localizați în registrul OPTION

Prescalarul este împărțit între TMR0 și WDT (timerul ‘watchdog’). Destinația prescalarului este controlată soft prin bitul de control PSA (OPTION < 3 >). Ștergerea bitului PSA va atribui prescalarul modulului TMR0. Prescalarul nu este nici citibil nici inscriptibil. Când prescalarul este destinat lui TMR0, valorile acestuia (1:2 ; 1:4 ; 1:8 ; 1:16 ; 1:32 ; 1:64 ; 1:128 ; 1:256 ) sunt selectabile prin soft. Paragraful 6.2 detaliază operațiile prescalarului.

Figura 4.2: Temporizarea TMR0: tactul intern /fără prescalar

––––

Figura 4.3: Temporizarea TMR0: tactul intern / cu rata prescalarului de 1:2

4.1. Întreruperile timerului TMR0

Întreruperea TMR0 este generată când modulul TMR0 intră în depășire de la FFh la 00h. Această depășire setează bitul TOIF (INTCON < 2 >). Întreruperea poate fi mascată punând pe ‘0’ logic bitul TOIE (INTCON < 5 >). Bitul TOIF trebuie să fie sters prin soft în rutina de întrerupere a modulului TMR0 înainte de a reactiva această întrerupere. Întreruperea TMR0 nu poate scoate microcontrolerul din starea ‘SLEEP’. Figura 4.4 arată diagrama de timp a intreruperii TMR0.

Figura 4.4: Temporizarea întreruperilor timerului TMR0

Notă 1: semnalizarea întreruperii TOIF este arătată pentru fiecare ciclu Q1

2: întârzierea la întrerupere este 3.25 Tcy, unde Tcy= peioada ciclului instrucțiune

3: CLKOUT este disponibil doar în modul de funcționare cu oscilator RC

4.2. Utilizarea timerului TMR0 cu tact extern

Când se utilizează tactul extern la intrarea timerului TMR0, trebuie să fie îndeplinite anumite cerințe pentru tactul extern, cerințe care vizează sincronizarea acestuia cu faza internă a tactului (Tosc). Mai există, de asemsnea, o înârziere a incrementării timerului TMR0 după sincronizare.

4.2.1. Sincronizarea tactului extern

Când nu se utilizează nici un prescalar, intrarea tactului extern este aceeași cu ieșirea prescalarului. Sincronizarea pinului TOCKI cu faza internă a tactului este îndeplinită prin eșantionarea ieșirii prescalarului în timpul ciclurilor Q2 și Q4 ale tactului intern (vazi fig 4.5.). De aceea, este necesar ca semnalul TOCKI să stea în stare ‘high’ pe o durată egală cu cel puțin două perioade de oscilație (Tosc) plus o mică întârziere RC, și în stare ‘low’ tot două perioade de oscilație plus o întârziere RC.

Când se utilizează prescalarul, intrarea externă de tact este divizată de un prescalar de tipul ‘numărător cu ripple asincron’ și, de aceea, ieșirea este simetrică. Pentru ca tactul extern să îndeplinească condițiile de eșantionare, trebuie luat în cosiderare numărătorul de ‘ripple’. Pentru aceasta este necesar ca perioada semnalului la intrarea TOCKI să fie de cel puțin 4 ori mai mare decât perioada Tosc împărțită la valoarea prescalarului. Singura cerința pentru timpii tL și tH ai intrării TOCKI este ca aceștia să fie mai mari de 10ns.

Figura 4.5: Temporizarea timerului TMR0 cu tact extern

Notă 1: semnalizarea întreruperii TOIF este arătată pentru fiecare ciclu Q1

2: întârzierea la întrerupere este 4 Tcy, unde Tcy= peioada ciclului instrucțiune

3: CLKOUT este disponibil doar în modul de funcționare cu oscilator RC

4.2.2. Întârzierea la incrementare a timerului TMR0

Având în vedere că ieșirea prescalarului este sincronizată cu tactul intern, există o mică întârziere intre momentul de apariție a frontului semnalului de tact și momentul incrementării reale a modulului TMR0 (figura 4.5).

4.3. Prescalarul

Pentru modulul numărător/temporizator TMR0 este disponibil un numărător pe 8 biți ca prescalar, care se transformă în numărător pe 8-biți ca ‘postscalar’ pentru modulul WDT (figura 4.6). Pentru a simplifica lucrurile, acest numărător a fost intitulat, simplu, ‘prescalar’. Esde de notat că există un singur prescalar care este rezervatfie pentru TMR0, fie pentr4u WDT. Astfel dacă prescalarul este atribuit modulului TMR0 înseamnă că modulul WDT nu are prescalar, și invers.

Biții PSA și PS2:PS0 (OPTION < 3:0 >) determină rata prescalarului și atribuirea lui unuia din cele două module. Când prescalarul este atribuit timerului TMR0, toate instrucțiunile scrise în TMR0 (CLRF 1; MOVWF 1; BSF 1,x; …) vor șterge conținutul prescalarului. Când se atribuie prescalarul timerului ‘Watchdog’ (WDT), instrucțiunea CLRWDT va șterge prescalarul împreună cu conținutul timerului WDT. Conținutul prescalarului nu poate fi citit și nici scris.

4.3.1. Desemnarea destinației prescalarului

Destinația prescalarului este controlată soft astfel încât poate fi schimbată ‘din mers’ în timpul rulării unui program. Pentru a evita o resetare nedorită la schimbarea destinției prescalarului trebuie executată următoarea secvență de instrucțiuni.

Exemplul 4.1. Schimbarea prescalarului (TMR0 WDT)

BCF STATUS, RP0 ; bancul 0

CLRF TMR0 ; șterge TMR0 și prescalarul

BSF STATUS, RP0 ; bancul 1

CLR WDT ; șterge WDT

MOVLW ‘xxxx 1xxx’b ; selectarea noului prescalar

MOVWF OPTION ; valoare

BCF STATUS, RP0 ; bancul 0

Figura 4.6: Schema bloc a prescalarului

––––-

Notă: biții TOCS, TOSE, PSA, PS2:PS0 fac parte din componența registrului OPTION

Secvența de schimbare a prescalarului de la WDT la TMR0 este prezentată în exemplul.4.2.

Exemplul 4.2. Schimbarea prescalarului (WDT TMR0)

CLR WDT ; șterge WDT și prescalrul

BSF STATUS, RP0 ; bancul 1

MOVLW ‘xxxx 0xxx’b ; selectarea TMR0 noua valoare a prescalarului și

; sursa tactului

MOVWF OPTION ; valoare

BCF STATUS, RP0 ; bancul 0

5.0. Memoria EEPROM de date

În/din conținutul memorieiEEPROM de date se poate scrie/citi în timpul unei operații normale (full Vdd range). Această memorie nu este mapată direct în spațiul registrului de pagină, în schimb este adresabilă inirect prin intermediul registrului SFR. Există 4 registre SFR utilizate pentru citirea și scrierea în această memorie. Aceștia sunt:

EECON1

EECON2

EEDATA

EEADR

Registrul EEDATA memorează cei 8-biți de date pentru citire/scriere, iar registrul EEADR memorează adresa locației de memorie EEPROM accesate. Microcontrolerul PIC16C84 are 64-bytes de memorie EEPROM de date cu domeniul de adrese între 00h și 3Fh.

Memoria EEPROM de date permite octeți de scriere și de citire. Un octet de scriere sterge automat coținutul locației de memorie și scrie noile date (‘ștergere înainte de scriere’). Memoria EEPROM de date este concepută pentru cicluri ‘high’ de ștergere/scriere. Timpul de scriere este de 10ms și este controlat de un temporizator (timer) intern deoarece timpul de scriere variază cu temperatura și cu tensiunea.

Când dispozitivul este protejat de un ‘cod de protecție’, doar CPU poate citi și scrie în/din memoria de date. Asta înseamnă că accesul din exterior nu mai este posibil.

5.1. EEADR

Registrul EEADR poate adresa până la 256 octeți ai memoriei EEPROM de date. Doar primii 64 octeți sunt implementați, și sunt necesari doar 6 din cei 8 biți ai registrului (EEADR <5:0 >).

5.2. EECON1 și EECON2.

EECON1 este registrul de control, și are doar ultimii 5 biți implementabili fizic. Primii 3 biți nu există și sunt citiți ca ‘0’ logic.

Biții de control RD și WR inițiază citirea respectiv scrierea. Acești biți nu pot fi sterși ci doar setați prin soft. Ei pot fi șterși prin hard la terminarea operației de citire sau scriere. Imposibilitatea ștergerii bitului WR prin soft previne terminarea accidentală a operașiei de scriere.

Bitul WREN permite operația de scriere când este setat pe ‘1’ logic. În mod ‘power-up’ bitul WREN este șters. Bitul WRERR este setat atunci când operația de scriere este întreruptă de ‘/MCLR-reset’ sau de ‘WDT time-out reset’. În această situație, care urmează activării resetului, utilizatorul poate să verifice bitul WRERR și să reprogrameze locația de memorie. Datele și adresele vor rămâne neschimbate în registrele EEADR și EEDATA.

Bitul EEIF (indicator de întrerupere) este setat când scrierea a fost efectuată. El trebuie șters prin soft.

Registrul EECON2 nu este un registru fizic, el fiind citit ca ‘0’ logic.

5.3. Citirea memoriei EEPROM de date

Pentru a citi locațiile memoriei de date, utiliyatorul trebuie să scrie adresa în registrul EEADR și apoi să seteze bitul de control RD (EECON1 < 0 >). Datele sunt disponibile în registrul EEDATA înciclul următor, și de aceea ele pot fi citite la următoarea instrucțiune. Registrul EEDATA va păstra această valoare până la o nouă ,citire sau până când utilizatorul scrie ceva în registru printr-o operație de scriere.

Exemplul 5.1. Citirea memoriei EEPROM de date.

BCF STATUS, RP0 ; bancul 0

MOVLW CONFIG_ADDR ;

MOVWF EEADR ; adresa de citit

BSF STATUS, RP0 ; bancul 1

BCF STATUS, RP0 ; citește din EE

MOVF EEDATA, W ; W = EEDATA

5.4. Scrierea în memoria EEPROM de date

Pentru a scrie într-o locație a memoriei EEPROM de date utilizatorul trebuie mai întâi să scrie adresa locației respective în registrul EEADR și apoi să scrie datele în registrul EEDATA. După aceea utilizatorul trebuie să urmeze o secvență specifică de inițiere a scrierii.

Exemplul 5.2. Scrierea în memoria EEPROM de date

BSF STATUS, RP0 ; bancul 1

BCF INTCON, GIE ; invalidarea întreruperilor

MOVLW 55h ;

MOVWF EECON2 ; scrie 55h

MOVLW AAh ;

MOVWF EECON2 ; scrie AAh

BSF EECON1, WR ; inceperea scrierii prin setarea bitului WR

BSF INTCON, GIE ; validează întreruperile

Scrierea nu va fi începută dacă această secvență nu este urmată în ordinea exactă (scrie 55h în EECON2, scrie AAh în EECON2, setează bitul WR). Se recomandă ca întreruperile să fie onvalidate în timpul acestei secvențe de program.

În plus, bitul WREN din registrul EECON1 trebuie să fie setat pentru permiterea scrierii. Acest mecanism previne înscrierile accidentale în EEPROM-ul de date datorate executării greșite (neașteptate) a codului (rezultând pierderea programelor). Utilizatorul ar trebui să țină tot timpul bitul WREN pe “0” logic.

După ce a fost inițiată o secvență de scriere, ștergerea bitului WREN nu va afecta acest ciclu de scriere. Bitul WR va fi inhibat de la început, până când bitul WREN va fi setat.

La sfârșitul ciclului de scriere, bitul WR este șters (din hard), iar bitul EEIF va fi setat. Utilizatorul poate, de asemenea, să permită această întrerupere sau să “dragă” acest bit. Bitul EEIF poate fi șters prin soft.

5.5. Protecția împotriva înscrierilor false

Există condiții în care dispozitivul să nu poată efectua scrierea în memoria EEPROM de date. Pentru a proteja împotriva înscrierilor false, s-au construit diferite mecanisme. La nivel ridicat, bitul WREN este șters (“0” logic).

Secvența de inițiere a scrierii, împreună cu bitul WREN ajută la prevenirea înscrierilor accidentale în timpul “glitch”-urilor tensiunii sau a unor defecțiuni soft.

6.0. CARACTERISTICILE SPECIALE ALE UNITĂȚII CENTRALE DE PRELUCRARE PENTRU MICROPROCESORUL PIC16C84

Ceea ce diferențiază microcontrolerul de alte procesoare este necesitatea lucrului cu circuitele speciale în aplicațiile în timp real. Microcontrolerul PIC16C84 are o sumendenie de astfel de trăsături, în ideea de a-I crește durata de viață, de a minimiza costul (prin eliminarea componentelor externe), de a furniza un mod de funcționare cu consum de energie minim, și de a oferi un cod de protecție. Aceste caracteristici speciale sunt:

Selectarea oscilatorului

Resetul

Power –on reset (POR)

Power –up reset (PWRT)

Oscilator start-up timer (OST)

Întreruperile

Timerul watchdog (WDT)

SLEEP

Protecția codului

Locațiile ID

Programarea serială ‘in circuit’ (pe placă)

Microcontrolerul PIC16C84 are un temporizator watchdog care poate fi invalidat doar prin biții de configurare. Pentru a-și mări durata de viață WDT își închide oscilatorul RC propriu. Există 2 temporizatoare care oferă întârzierea necesară la “power-up”:

Unul este OST și menține cipul în reset până când oscilatorul este stabil iar celălalt este PWRT care furnizează o întârziere fixă de 72 ms numai în modul de funcționare “power-up”. Prin această arhitectură se menține circuitul în stare de reset până cân sursa de alimentare se stabilizează. Datorită acestor 2 temporizatoare interne, în majoritatea aplicațiilor nu este nevoie de un circuit extern pentru reset.

Modul de funcționare ‘SLEEP’ oferă un curent absorbit foarte mic (în modul ‘power-down’). Utilizatorul poate să scoată circuitul din această stare latentă prin intermediul:

resetului extern, a timerului WDT sau

printr-o întrerupere.

Pentru a permite microcontrolerului să corespundă în aplicații, sunt furnizate mai multe opțiuni de configurare a oscilatorului. Oscilatorul RC are avantajul unui preț redus, pe când varianta cu cristal LP oferă avantajul unui consum redus.

6.1. BIȚII DE CONFIGURARE

Biții de configurare pot fi programați (citiți ca “0” logic) sau lăsați nemodificați (citiți ca “1” logic) pentru a selecta diferitele configurații posibile. În memoria program acești biți se găsesc la locația de memorie cu adresa 2007h care se află dincolo de memoria program utilă. de fapt, locația 2007h aparține spațiului de memorie special alocat pentru testare/configurare (2000h:3FFFh), spațiu care poate fi accesat numai în timpul programării.

Figura 6.1: Cuvântul de configurare

Nr. Bitului:

13 12 11 10 9 8 7 6 5 4 3 2 1 0

biții FOSC1, FOSC0: biții pentru selectarea oscilatorului

11= oscilator RC

10= oscilator HS

01= oscilator XT

00= oscilator LP

bitul WDTE: validarea configurării timerului WDT

1= timerul WDT este activat

0= timerul WDT este dezactivat

bitul PWRTE: bitul de validare al timerului ‘power-up’

1= timerul ‘power-up’ este validat

0= timerul ‘power-up’ este invalidat

bitul CP: configurarea codului de protecție

1= codul de protecție este validat

0= codul de protecție este invalidat

6.2. CONFIGURAREA OSCILATORULUI

6.2.1. Tipurile de oscilatoare folosite

Microprocesorul PIC16C84 poate opera în 4 moduri diferite în funcție de circuitul oscilator ales. Prin programarea celor 2 biții FOSC1 și FOSC0, utilizatorul poate selecta unul din următoarele 4 moduri de lucru:

LP LOW POWER CRYSTAL (consum mic)

XT CRYSTAL/RESONATOR

HS CRYSTAL/RESONATOR DE MARE VITEZĂ

R/C RESISTOR/CAPACITOR

6.2.2. Oscilator cu cristal/rezonator ceramic

În modurile de funcționare XT, LP și HS, între pinii OSC1/CLKIN și OSC2/CLKOUT este plasat un cristal de cuarț sau un rezonator ceramic (figura 6.2.). o cerință pentru oscilatorul microcontrolerului PIC16C84 este aceea de a utiliza un cristal de cuarț cu rezonanță paralel. Utilizarea unui cuarț cu rezonanță serie ar putea duce la o frecvență care nu s-ar încadra în specificațiile de catalog ale cuarțului.

Când se folosește una din configurațiile XT, LP sau HS, circuitul poate avea o sursă externă de tact pentru a ‘conduce’ pinul OSC1/CLKIN (figura 6.3.)

6.2.3. Circuitul oscilant (cu cuarț) extern.

Se poate utiliza fie un circuit integrat specializat, fie un simplu circuit oscilant cu porți TTL. Circuitele integrate specializate oferă un domeniu de operare larg și o bună stabilitate, pe când circuitele cu porți TTL, bine dimensionate, pot asigura performanțe bune la un preț scăzut. Sunt disponibile două tipuri de oscilatoare cu cuarț: cu rezonanță serie și cu rezonanță paralel.

Figura 6.2: Oscilatorul extern (HS, XT SAU LP)

În figura 6.4. se prezintă un oscilatorcu cuarț cu rezonanță paralel. Circuitul este astfel proiectat încât să lucreze la frecvența fundamentală a cuarșului. Montajul în paralel necesită o schimbare de fază (180) care este îndeplinită de invertorul 74AS04. Rezistența de 7,4k furnizează un ‘feed-back’ negativ pentru imbunătățirea stabilității, și potențiometrul de 10K aduce circuitul 74AS04 în regiunea de funcționare liniară. Aceasta este una din configurațiile care pot fi folosite pentru proiectarea oscilatorului extern.

Figura 6.5. prezintă un oscilator cu cuarț cu rezonanță serie. Circuitul este de asemenea proiectat ca să lucreze pe frecvența fundamentală a cristalului de cuarț. Invertorul îndeplinește funcția de schimbare de a fazei cu 180, iar rezistența de 330k furnizează ‘feed-back’-ul negativ pentru aducerea circuitului 74AS04 în regiunea liniară de funcționare.

6.2.4. Oscilatorul RC

Pentru aplicațiile nepretențioase în domeniul temporizării, configurația RC oferă avantajul unui preț redus. Frecvența de oscilație RC depinde de tensiunea de alimentare, de temperatura mediului ambiant, de valoarea rezistenței Rext și de valoarea capacității condensatorului extern Cext. În plus frecvența oscilatorului RC variază de la unitate de test la unitate de test din cauza variației parametrilor în funcționarea ‘normală’.

În plus, variația capacități între diferitele tipuri de capsule poate afecta frecvența de oscilație, în special pentru valori mici ale capacității Cext. Utilizatorul trebuie să ia în semă și variațiile datorate toleranțelor componentelor externe: rezistențaq R și condensatorul C. în figura 8.6 se arată modul de conectare a unui oscilator RC la microcontrolerul PIC16C84. Pentru valori ale rezistenței Rext mai mici de 2,2k oscilatorul poate să devină instabil sau chiar să se oprească. Pentru valori ale rezistenței Rext mai mari decât 1M oscilatorul devine sensibil la ugomot, umiditate și scurgeri de curent. Se recomandă, deci, ca valoarea rezistenței Rext să fie cuprinsă între 3k și 100k.

Deși oscilatorul va funcționa fără condensator extern (Cext=0pF), se recomandă pentru condensatorul Cext o valoare simbolică de aproximativ 20pF, din motive de zgomot și stabilitate. Frecvența oscilatorului variază foarte mult, chiar dramatic, în prezența unui condensator de valoare mică sau în absența acestuia, datorită modificării capacităților externe.

Variațiile de frecvență sunt mai accentuate pentru o valoare mai mare a rezistenței Rext (deoarece scurgeile de curent vor fi mai mari pentru o rezistență mai mare) și pentru o valoare mai mică a condensatorului Cext (deoarece variația capacității de intrare afectează mult frecvența oscilatorului RC).

La pinul OSC2/CLKOUT este accesiblă frecvența oscilatorului divizată cu 4, frecvență ce poate fi utilizată pentru testări sau pentru sincronizarea altor circuite logice (vezi figura 1.2. pentu forme de undă).

6.3. Reset

Microcontrolerul PIC16C84 face diferența între diferitele moduri de reset:

POR – power-on reset

/MCLR – reset în timpul funcționării normale

/MCLR – reset în starea latentă ‘SLEEP’

WDT time-out reset în timpul funcționării normale

WDT time-out reset în starea latentă ‘SLEEP’

Unele registre nu sunt afectate de nici o condiție de reset; starea lor ffind necunoscută la resetul POR, și neschimbată la orice alt tip de reset. Multe din celelalte registre sunt resetate când apare una din condițiile următoare: POR, resetul ‘/MCLR sau WDT time-out în timpul funcționării normale’, și resetul /MCLR din starea latentă SLEEP. Aceste registre nu sunt afectate de resetul ‘WDT time-out’din starea latentă SLEEP, deoarece acest reset este văzut ca reluarea unei operații normale. Biții /TO și /PD sunt setați sau șterși diferit în cele 5 situații de reset (vezi tabelul 8.4). acești biți sunt utilizați în soft pentru determinarea naturii resetului. Tabelul 8.6 oferă o descriere completă a stărilor de reset pentru toate registrele. În figura 6.7 este prezentată schema simplificată a ircuitului de reset intern (‘on-chip’).

8.4. POR, PWRT și OST

8.4.1. Power-On Reset (POR)

Când este detectată o creștere a tensiunii Vdd (în domeniul 1,6V:1,8V) se generează intern un impuls POR. Pentru a profita de POR trebuie doar să conectăm pinul /MCLR direct (sau printr-o rezistență) la tensiunea Vdd. În acest mod se vor elimina componentele externe R și C, utilizate în mod normal pentru generarea POR. Pentru o funcționare corectă se specifică pentru tensiunea Vdd un timp maxim de creștere (vezi secțiunea ‘specificații electrice’ pentru detalii). Când tensiunea Vdd scade, circuitul POR nu mai generează resetul intern.

Figura 6.7: Schema bloc simplificată a circuitului de reset ‘on-chip’

6.4.2. Power-Up Timer (PWRT)

Timerul PWRT furnizează o întârziere fixă de 72ms de la POR, numai în starea power-up. PWRT funcționează ca un oscilator RC intern. Atâta timp cât PWRT este activ, ‘chip’-ul este ținut în stare de reset. Întârzierea timerului PWRT permite tensiunii Vdd să crească până la un nivel acceptabil, bitul PWRTE putând, printr-o configurație de siguranță, să valideze (dacă este setat) sau să invalideze (dacă este șters) timerul PWRT.

Întârzierea timerului PWRT variază cu tensiunea Vdd, cu temperatura, și de la ‘chip’ la ‘chip’(vezi ‘parametrii DC’pentru detalii).

6.4.3.Oscilator Start-Up Timer (OST)

OST furnizează o întârziere de 1024 cicluri de oscilație (der la intrarea OSC1) după sfârșitul întârzierii date de PWRT. Prin aceasta se asigură stabilizarea circuitului oscilator/rezonator.

‘Time-out’-ul temporizatorului OST este apelat doar în cazurile oscilatoarelor XT, LP, și HS, și doar pentru resetul POR și la ieșirea din starea latentă SLEEP.

6.4.4. Time-out sequence (secvența de ‘time-out’)

Pentru cazul ‘power-up’ secvența de ‘time-out’ esteurmătoarea: după expirarea resetului POR se apelează la început ‘time-out’-ul corespunzător timerului PWRT iar apoi se activează timerul OST. Timpul total de pauză (‘time-out’) variază în funcție de configurația oscilatorului și de valoarea bitului PWRTE. Figurile 6.6, 6.9, și 6.10 descriu secvențele de pauză pentru ‘power-up’.

Tabelul 6.3:

De vreme ce ‘pauzele’ sunt caquzate de impulsul POR, dacă pinul /MCLR este ținut destul timp în stare ‘low’ timpul ‘pauzelor’ va expira și imediat după, /MCLR va fi adus în stare ‘high’ (figura 6.3). Această operație este utilă pentru testarea microcontrolerului și pentru sincronizarea mai multor dispozitive PIC16CXX care lucrează în paralel.

În tabelul 6.4. se arată semnificația biților /TO și /PD, în tabelul 6.5. se prezintă lista condițiilor de reset pentru câteva registre speciale iar în tabelul 6.6. se prezintă lista condițiilor de reset pentru toate registrele.

Tabelul 6.4: Biții de stare și semnificația lor

Tabelul 6.5: Condițiile de reset pentru registrele PCL și STATUS

Legendă :u= nemodificat , x= necunoscut

Nota 1: când trezirea se datorează unei întreruperi, și bitul GIE este setat, numărătorul de program PC se încarcă cu vectorul de întrerpere (0004h).

Tabel 6.6: Condițiile de inițializare pentru toate registrele

Figura 6.8: Secvența de ‘time-out’ în mod ‘power-up’ (cu /MCLR nelegat la Vdd): cazul 1

Figura 6.9: Secvența de ‘time-out’ în mod ‘power-up’ (cu /MCLR nelegat la Vdd): cazul 2

Figura 6.10: Secvența de ‘time-out’ în mod ‘power-up’ (/MCLR legat la Vdd)

6.5. Întreruperile

Familia microcontrolerului PIC16C84 utilizează cel mult 4 surse de întrerupere:

Întrerupere externă la pinul RBO/INT

Întrerupere cauzată de depășirea la temporizatorul TMR0

Întrerupere cauzată de modificările stării pinilor la portul B (RB7:4)

Întrerupere cauzată de inscrierea completă a memoriei EEPROM

Registrul de control al întreruperilor (INTCON) înregistrează cererile individuale de întrerupere sub forma unor biți de semnalizare. Acest registru mai conține biții de validare a întreruperilor individuale și globale.

Bitul de validare a întreruperii globale GIE (INTCON < 7 >), activează, dacă este setat, toate întreruperile nemascate. Dacă este șters, bitul GIE invalidează toate intreruperile. Întreruperile individuale pot fi inactivate prin bitul corespunzător de validare a întreruperii din registrul INTCON. La reset bitul GIE este șters.

Instrucțiunea ‘return from interrupt’ (revenire din întrerupere),RETFIE, are ca efect ieșirea din rutina de întrerupere și în același timp setează bitul GIE care reactivează întreruperile.

Întreruperea la pinul RB0/INT, cea datorată modificării starii pinilor la portul B, și cea cauzată de depășirea la TMR0, sunt semnalizate de biți din conținuți în registrul INTCON.

Nota 1: Biții de semnalizare a întreruperilor individuale sunt setați indiferent de starea biților mascați corespondenți sau de starea bitului GIE.

Nota 2: Dacă, în timp ce bitul GIE este șters are loc o întrerupere, acest bit ar putea fi activat, fără intenție, de ‘utilizatorul’ rutinei de întrerupere (instrucțiunea RETFIE). Acest fapt poate să aibe următoarele cauze:

o instrucțiune șterge bitul GIE în momentul confirmării unei cereri de întrerupere

programul este direcționat spre vectorul de întrerupere, și se execută rutina de întrerupere

când rutina de întrerupere se completează cu instrucțiunea RETFIE.

Aceasta duce la setarea bitului GIE, și programul revine la instrucțiunea ce urmează cele care a avut ca scop invalidarea întreruperilor. Ne putem asigura că întreruperile sunt invalidate global prin urmatoarea metodă: verificăm ca bitul GIE să fie șters de către instrucțiune, ca în exemplul următor.

LOOP BCF INTCON, GIE ; invalidează întreruperile globale

BTFSC INTCON, GIE ; întreruperile globale sunt invalidate??

GOTO LOOP ; NU: încercăm din nou

DA: continuăm rularea programului

Figura 6.15: Temporizarea întreruperilor pinul INT

Notă 1: semnalizarea întreruperii TOIF este arătată pentru fiecare ciclu Q1

2: întârzierea la întrerupere este 3-4 Tcy, unde Tcy= perioada ciclului instrucțiune

3: CLKOUT este disponibil doar în modul de funcționare cu oscilator RC

4: Pentru ca lățimea impulsului INT să fie cât mai mică, vezi specificațiile AC

5: INTF poate fi vizualizat oricând în timpul ciclurilor Q4 – Q1

Figura 6.15: Logica întreruperilor

6.5.1. Întreruperea INT

Întreruperea externă la pinul RB0/INT este ‘trigger’-ată pe frontul crescător, dacă bitul INTEDG este setat (OPTION < 6 >), sau pe frontul căzător, când bitul INTEDG este șters. Apriția unui front valid la pinul RB0/INT aduce după sine setarea bitului INTF (INTCON < 4 >). Înainte de reactivarea întreruperii bitul INTF trebuie șters prin soft printr-o rutină de întrerupere. Întreruperea INT poate ‘trezi’ procesorul din starea latentă (SLEEP) doar dacă bitul INTF a fost setat înainte de intrarea în această stare latentă. În funcție de starea bitului GIE, procesorul intră sau nu în subrutina de întrerupere.

6.5.2. Întreruperea TMR0

Bitul TOIF (INTCON < 2 >) va fi setat atunci când la timerul TMR0 se produce o depășire (FFh 00h). Întreruperea poate fi validată/invalidată prin setarea/ștergerea bitului TOIE (INTCON < 3 >).

6.5.3. Întreruperea cauzată de modificarea starii pinilor la portul B.

O schimbare a stării pinilor portului B (RB 7:4) setează bitul RBIF (INTCON<0>). Prin setarea/ștergerea bitului RBIF (INTCON <0>) întreruperea poate fi validată/invalidată.

Notă: Dacă, în timpul executării unei operații de citire are loc o modificare a stării pinilor I/O (începând din ciclul Q2) atunci s-ar putea întâmpla ca bitul de semnalizare a întreruperii RBIF să nu fie setat.

6.6. Salvarea ‘contextului’ pe durata întreruperilor

Pe durata pauzelor se salvează în stivă doar valoarea de revenire a numărătorului de program PC. De obicei, pe durata intreruperilor utilizatorul dorește să salveze conținutul registrelor cheie (de ex. registrul W și registrul STATUS).acest lucru poate fi implementat soft.

În exemplul următor se arată operația de memorare a informației conținute în registrele W și STATUS urmată de operația de extragere a acestei informații. Registrul W_TEMP trebuie definit în adresa de bază a celor două bancuri cu același ‘offset’ (dacă registrul W_TEMP este definit în bancul ‘0’ la adresa 0x20, el va trebui să fie definit în bancul ‘1’ la adresa 0xA0 ). Registrul util STATUS_TEMP trebuie definit în bncul ‘0’. Operațiile efectuate în exemplul 6.1. sunt următoarele:

stochează conținutul registrului W

stochează conținutul registrului STATUS în bancul ‘0’

execută rutina de întrerupere

extrage conținutul registrului STATUS și bitul de selecție al bancului

extrage conținutul registrului

Exemplul 6.1. Salvarea registrelor STATUS și W în RAM

MOVWF W_TEMP ; copiază W în registrul W_TEMP

SWAPF STATUS, W ; registrul STATUS este salvat în W

BCF STATUS, RP0 ; trecere la bancul ‘0’, indiferent de bancul curent

MOVWF STATUS_TEMP ; salvează registrul STATUS în registrul

; STATUS_TEMP din bancul ‘0’

: ;

: ; Rutina de întrerupere

: ;

SWAPF STATUS_TEMP, W ; schimbă conținutul registrului

; STATUS_TEMP în W

MOVWF STATUS ; mută W în registrul STATUS

SWAPF W_TEMP, F ; schimbă W_TEMP

SWAPF W_TEMP, W ; schimbă W_TEMP în W

6.7. Temporizatorul WDT (Watchdog)

Timerul WDT este conceput ca un oscilator RC intern care nu necesită nici o componentă externă. Acest oscilator RC este separat de oscilatorul RC de la pinul OSC1/CLKIN. Aceasta înseamnă că timerul WDT funcționează chiar dacă tactul extern de la pinii OSC1/CLKIN și OSC2/CLKOUT este oprit (printr-o instrucțiune SLEEP de exemplu). În timpul funcționării normale resetarea circuitului este generată de ‘time-out’-ul WDT. Dacă dispozitivul se află în stare latentă (SLEEP), ‘time-out’-ul temporizatorului WDT va provoca isșirea din starea latentă și continuarea funcționării normale. WDT poate fi dezactivat pein punerea pe ‘0’ logic a bitului de siguranță WDTE (vezi figura 6.1).

6.7.1. Perioada WDT

WDT are o durată nominală a ‘time-out’-ului de 18ms (fără prescalar). Perioada de pauză variază cu temperatura și cu tensiunea de alimentare Vdd. Dacă se dorește o durată mai mare a pauzei (time-out), timerului WDT I se poate atribui un prescalar cu rata mazimă de divizare 1:128. Prescalarul este controlat soft prin scrierea în registrul OPTION și cu ajutorul lui se pot realiza pauze de până la 2.3 secunde.

Instrucțiunile CLRWDT și SLEEP șterg timerul WDT și postscalarul, și inhibă astfel condiția de reset (la terminarea pauzei). 'Time-out’-ul timerului WDT bitului /TO din registrul STATUS.

6.7.2. Considerații de programare a timerului WDT

Faptul că în cele mai defavorabile condiții (Vdd=min, temperatura= max, prescalarul=max )timerului WDT i-ar trebui mai multe secunde a termina pauza, ar trebui luat în calcul.

Figura 8.16:Schema bloc a timerului ‘WATCHDOG’

Tabelul 6.7: Registrele asociate timerului ‘WATCHDOG’

6.8. Modul de funcționare ‘power-down’ (SLEEP).

ĂÎn acest mod de funcționare se intră prin executarea instrucțiunii SLEEP. Dacă este validat timerul WDT va fi șters dar va funcționa în continuare, bitul /PD din registrul STATUS va fi șters, bitul /TO din același registru va fi setat iar driverul oscilatorului va fi oprit (stins). Porturile I/O își mențin starea care o aveau înainte ca instrucțiunea SLEEP să fie executată.

Pentru reducerea consumului de curent, toți pinii I/O ar trebui să fi legați fie la tensiunea Vdd fie la masă (Vss), iar teactul extern ar trebui invalidat. Pentru a evita scurgerile de curenți datorete intrărilor flotante, pinii I/O aflați în stare high Z ar trebui aduși în stare ‘low’ sau ‘high’. Intrarea TOCKI ar trebui legată de asemenea la Vdd sau la Vss. Trebuie luată în considerare și contribuția ‘pull-up’-urilor interne de la portul B. Pinul /MCLR trebuie ținut pe nive logic ‘high’ (ViHMC). Este de notat că resetul datorat ‘time-out’-ului timerului WDT nu trage pe nivel ‘low’ pinul /MCLR.

6.8.1. Ieșirea din starea latentă SLEEP (‘wake-up from sleep’)

Circuitul poate fi scos din această stare prin următoarele metode:

un semnal de reset la pinul /MCLR

resetarea cauzată de ‘time-out’-ul timerului WDT, dacă WDT este activ

întreruperea externă la pinul RB0/INT, mdoificarea stării pinilor portului B și din cauza scrierii complete a memorie EEPROM de date.

Pe durata stării latente SLEEP circuitele periferice nu pot genera întreruperi deoarece nu există cicluri interne detact.

Prima metodă (/MCLR reset) determină resetarea circuitului. Următoarerle două metode sunt considerate ca o continuare a execuției programului. Pentru determinarea resetării circuitului se pot folosi biții /TO și /PD. În modul de funcționare ‘pover-up’ bitul /PD este setat, și când se trece în starea SLEEP este adus pe nivel logic ‘0’. ‘Time-out’-ul timerului WDT șterge bitul /TO și, prin asta, determină trezirea din starea SLEEP.

Fig 8.17: Trezirea din starea ‘SLEEP’ printr-o întrerupere

Notă 1: e valabilă pentru unul din modurile de funcționare: XT, HS, LP

2: Tost=1024 Tosc. Această întârziere nu va exista în modul de lucru RS

3: dacă GIE=1, după trezire se face salt la rutina de întrerupere; GIE=0, se continuă așa

În timp ce începe să se execute instrucțiunea SLEEP, următoarea instrucțiune este deja pre-extrasă. Pentru ca dispozitivul să se ‘trezească’ când are loc întreruperea, bitul corespondent de validare a întreruperii trebuie setat (validat).’Trezirea’ are loc indiferent de valoarea bitului GIE. Dacă bitul GIE este șters, execuția programului continuă de la instrucțiunea de după instrucțiunae SLEEP și apoi se ramifică spre adresa de întrerupere (0004h). În cazul în care instrucțiunea ce urmează după SLEEP nu este dorită, utilizatorul pote să pună după SLEEP o instrucțiune NOP. În momentul revenirii din starea latentă timerul WDT este șters indiferent de cauza acestei reveniri.

6.9. Protecția codului

Codul memoriei program și al memoriei EEPROM de date poate fi protejat prin programarea bitului de protecție al codului (vezi figura 6.1).

6.10. Locațiile de identificare ID

Există 4 locații de memorie desemnate pentru locațiile de identficare (2000h – 2003h). aceste locații nu sunt accesibile în timpul funcționării normale, ele putând fi citite sau înscrise doar în modul de lucru programare/verificare. Din locațiile de memorie destinate pentru ID se utilizează doar ultimii 4 biți mai puțin semnificativi.

6.11. Progaramarea serială ‘in circuit’

Microcontrolerele din familia PIC16C84 pot fi programate serial chiar pe placa de aplicație a circuitului. Programarea se realizează simplu prin două linii de ‘tact’ și de ‘date’, și prin alte 3 linii pentru alimentare (Vdd), masă (Vss) și pentru tensiunea de programare. Utilizatorul poate construi plăci de aplicație cu componente neprogramate, și apoi să programeze microcontrolerul înainte de a pune în funcțiune proiectul.

Dispozitivul este adus în modul de lucru ‘programare/verificare printr-un nivel ‘low’ la pinii RB6 și RB7 în timp ce la pinul /MCLR nivelul se modifică de la ViL la ViH. Pinul RB6 devine atfel intrare de tact pentru programare iar pinul RB7, intrare de date. Pentru acest mod de funcționare, pinii RB6 și RB7 sunt intrări de tip Trigger Schmitt.

După reset, pentru plasarea dispozitivului in modul ‘programare/verificare’, numărătorul de progogram (PC) va indica către locația 00h. Apoi se furnizează circuitului o comandă pe 6-biți, și se înscrie/citește în/din circuit un cuvânt de date pe 14-biți printr-o instrucțiune de scriere sau citire. Despre programarea serială a microcontrolerului se va vorbi pe larg în paragraful 8.

7.0. Setul de instrucțiuni al microcontrolerului PIC16C84

Fiecare instrucțiune a microcontrolerului PIC16C84 sete un cuvânt pe 14-biți. Acest cuvânt este împărțit în: codul operației (OPCODE), care specifică tipul de instrucțiune, șiunul sau mai mulți operanzi, care specifică ce operație face instrucțiunea. Setul de instrucțiuni al microcontrolerului PIC16C84 aste prezentat în tabelul 7.2. iar în tabelul 7.1. este arătată descrierea câmpurilor OPCODE.

Tabelul 7.1: Descrierea câmpurilor ‘OPCODE’

Setul de instrucțiuni este grupat în 3 categorii de bază:

Instrucțiunile de operare cu octeți (bytes): ‘f’ reprezintă registrul filă ales iar ‘d’ reprezintă registrul destinație ales. Registrul filă ales specifică registru filă care este utilizat de instrucțiune. Registrul destinație desemnat specifică locul unde să fie plasat rezultatul operației. Dacă ‘d’ este ‘0’, rezultatul va fi pus automat în registrul W iar dacă ‘d’ este ’1’ rezultatul este pus în registrul filă specificat de instrucțiunea respectivă.

Instrucțiunile de poperare cu biți: ‘b’ specifică câmpul bitului ales și are ca efect selectarea numărului bitului ce va fi afectat de operație. ‘f’ reprezintă adresa locației în care se găsește bitul.

Operații literale și de control: ‘k’ reprezintă o constantă sau o valoare literală pe

8-biți sau pe 11-biți.

Toate instrucțiunile sunt executate într-un singur ciclu onstrucțiune, excepție făcând instrucțiunile care au ca rezultat modificarea numărătorului de program. Execuția durează două cicluri instrucțiune, cu al doilea ciclu excutat ca o instrucțiune NOP. Fiecare ciclu constă în 4 perioade de oscilație și de aceea, pentru un oscilator cu frecvența de 4MHz, timpul normal de execuție a instrucțiunii este de 1s. Pentru ramificările proggramului timpul de execuție a unei instrucțiuni este de 2s.

În tabelul 7.2. este prezentată lista de instrucțiuni pentru microcontrolerului PIC16C84, listă ce este recunoscută de asamblorul MPSAM conceput de Microchip.

În figura 7.1. sunt prezentate 3 formate generale ale instrucțiunilor.

Toate exemplele utilizează următorul format pentru reprezentarea unui număr in hexazecimal: 0xhh, unde ‘h’ semnifică un digit hexazecimal.

Tabelul 7.2: Lista de instrucțiuni a microcontrolerului PIC16C84

Legendă: **= număr de cicluri, @@= note

Notă 1: când un registru I/O este modificat ca o funcție proprie lui însuși (de ex:

MOVF_PORTB, 1), valoarea utilizată va fi chiar acea valoare prezentă la pini.

2: dacă instrucțiunea este executată în registrul timerului TMR0, prescalarul va fi șters

și va fi destint timerului TMR0.

3: dacă numărătorul de program (PC) este modificat, sau un test condițional este

adevărat, instrucțiunile necesită două cicluri. Al doilea ciclu este executat ca

un NOP.

Figura 7.1.Formatul general al instrucțiunilor

Instrucțiunile de operare cu octeți (bytes)

13 8 7 6 0

d=0 pentru destinația ‘W’, d=1 pntru destinația ‘f’

f= adresa pe 7-biți a registrului

Instrucțiunile de poperare cu biți

13 10 9 7 6 0

b= adresa pe 3-biți a bitului

f= adresa pe 7-biți a registrului

Operații literale și de control

13 8 7 0

k= valoarea imediată pe 8-biți

8.0. Specificații privind programarea memoriei EEPROM

8.1. Programarea microprocesorului PIC16C84

Microprocesorul PIC16C84 este programat utilizând o metodă serială. Modul de programare serială va permite microprocesorului să fie programat în timpul utilizării sistemului. Aceasta aduce după sine mărirea flexibilității designului.

8.1.1.Recomandări hardware

PIC16C84 necesită o sursă programabilă de tensiune pentru Vdd (4,5V – 5,5V) și una pentru Dpp (12V-14V). Amândouă surse ar trebui să aibă o rezoluție de minim 0,25V.

8.1.2. Modul de programare

Modul de programare al microcontrolerului PIC16C84 permite programarea de către utilizator a: memoriei program, memoriei de date, a locațiilor speciale utilizate pentru ID (adrese) și a configurației cuvintelor.

Descrierea pinilor în timpul programării la microprocesorul PIC16C84.

Legendă: P= power ; Notă : *= La PIC16C84 tensiunea ridicată este generată intern. Pentru intrarea în modul de lucru ‘programare’ trebuie aplicată o tensiune ridicată la intrarea /MCLR. Aceasta înseamnă că la pinul /MCLR nu se absoarbe un curent semnificant.

8.2.0. Program mode entry

8.2.1.Folosirea hărții memoriei program

Spațiul de memorie folosită se întinde de la 0x0000: 0x1FFF (8k), din care 1k(oooo – o3FF) este implementată fizic. În aplicațiile actuale, memoria program folosită este accesată prin cei 10 biți mai puțin semnificativi ai numărătorului de program (PC), primii 3 biți ai PC fiind ignorați. De aceea, dacă PC > 03FF, PC va face un salt și va adresa o locație de memorie din interiorul zonei implementabile fizic a memoriei (figura 8.2.1.).

Figura 8.2.1: Maparea memoriei program

În modul programare, spațiul memoriei program se întinde de la 0000 la 3FFF, cu prima jumătate fiind spațiul de memorie program util (oooo-1FFF), iar cea de-a doua jumătate este configurația memoriei (1FFF-3FFF). Numărătorul de program va incrementa de la 0000h la 1FFFh la 2000h la 3FFFh și apoi, salt la 2000h(și nu la 0000h). Bitul cel mai semnificativ stă pe “1” logic, indicând astfel, tot timpul, spre configurația memoriei.

Singura cale de a indica spre memoria program utilă este resetarea și reintrarea în modul program/verificare (vezi 8.2.3.).

În configurația spațiului de memorie, zona 2000h-200Fh este implementabilă fizic. Locațiile de după 200Fh vor accesa fizic memoria utilă (figura 8.2.1.).

8.2.2. Locațiile ID (de identificare)

Utilizatorul poate să depoziteze informațiile de identificare în 4 locații ID. Locațiile ID sunt mapate și se găsesc la adresa 2000h-2003h. Este recomandabil ca utilizatorul să folosească numai ultimii 4 biți mai puțini semnificativi ai fiecărei locații ID. În unele dispozitive locațiile ID sunt citite într-un mod încâlcit, după ce este activată protecția codului. Pentru aceste cazuri este bine ca locațiile ID să fie scrise ca: ’11 1111 1000 bbbb’, unde ‘bbbb’ este informația de identificare.

În aceste cazuri locațiile sunt citite normal chiar după codul de protecție (pentru înțelegerea comportării dispozitivului vezi tabelul 8.3.1 ).

8.2.3.Modul de lucru Programare/Verificare

Modul programare/verificare este accesat prin ținerea pinilor RB6 și RB7 în stare low în timp ce pinul MCLR trece de la Vil la Vihh (tensiune high). O singură dată, în acest “mod”, cele două jumătăți ale memorie program pot fi accesate și programate serial. Felul operației este serial iar memoria accesată este memoria program utilă. În acest mod de funcționare, pinii RB6 și RB7 sunt intrări cu trigger schmitt.

Secvența care plasează microcontrolerul în modul programare/verificare, pune toate celelalte intrări logice în stare highZ (pinul MCLR a fost inițial în stare ViL). Aceasta înseamnă că toate intrările/ieșirile sunt în stare de blocare (cu impedanță ridicată).

8.2.3.1. Operațiile în modul de programare/verificare serială

Pinul RB6 este utilizat ca intrare de tact (clock) iar RB7 este folosit pentru intrarea biților de comandă și pentru intrări/ieșiri de date în tinpul operației seriale. Pentru a primi la intrare o comandă sunt necesare 6 cicluri de tact (la pinul RB6). Fiecare bit de comandă este memorat în latch-uri pe frontul căzător al semnalului de tact începând cu LSB .

Datele de la pinul RB7 trebuie să aibă o setare minimă și timpi de menținere (date stabile) care să respecte frontul căzător al tactului. Comenzile care au asociate date (read and load) trebuie să aibe o întârziere minimă între comandă și date. După această întârziere, vor fi 16 semnale de tact cu primul tact fiind bitul de start iar ultimul tact bitul de stop. Datele sunt introduse sau extrase începând cu bitul cel mai puțin semnificativ (LSB). De aceea, în timpul operației de citire, bitul LSB va fi transmis la pinul RB7 pe frontul crescător al celui de-al doilea tact, iar în timpul operației de încărcare bitul LSB va fi înscris în latch pe frontul căzător al celui de-al doilea tact. Se mai specifică o întârziere minimă de 1s între comezile consecutive.

La toate comenzile se transmite întâi bitul LSB. Cuvintele de date sunt transmise pe același principiu. Datele sunt transmise pe frontul de creștere al semnalului de tact și înscrise în latch-uri pe frontul căzător.

Pentru a permite decodificarea comenzilor și întoarcerea datelor cu configurația pinilor este necesară o separare în timp de cel puțin 1s între comandă și cuvântul de date (sau altă comandă).

Sunt disponibile următoarele comenzi:

A) load configuration (încarcă configurația)

După primirea acestei comenzi, numărătorul de program (PC) va fi setat pe 2000h. Deci, aplicând 16 cicluri la pinul clock, chipul va încărca 14 biți într-un “cuvânt de date”, biți în care să fie programată configurația memoriei. O descriere schematică a hărții memoriei program pentru operații normale și operații în modul configurare este arătată in figura 8.2.1. După ce configurația memoriei este făcută, singura cale de a reveni la memoria program utilă este ieșirea din modul test de programare/verificare, prin punerea în poziție low a pinului MCLR (= ViL).

B) load data for program memory (încărcarea datelor pentru memoria program).

După recepționarea acestei comenzi, chip-ul va încărca un cuvânt de date de 14-biți după aplicarea a 16 impulsuri de tact, cum a fost descris mai sus.diagrama de timp pentru această comandă este prezentată în figura 8.2.4.

Figura 8.2.4:Comanda de încărcare a datelor în memoria program (programare/verificare serială)

c) load data for data memory (incîrcarea datelor pentru memoria de date).

După această comandă chipul va încărca un cuvânt de date de 14-biți după 16 impulsuri de tact.oricum, memoria de date este doar pe 8-biți, și deci numai primii 8-biți după bitul de start vor fi programați în memoria de date. Este necesar,totuși, ca tactul să funcționeze toate cele 16 cicluri pentru a permite resetarea corectă a circuitelor interne. Memoria de date conține 64 de cuvinte. Doar primii 8 biți ai PC sunt decodați de memoria de date și de aceea dacă PC>3F, se va executa un salt și se va adresa o locație din interiorul memoriei implementabile fizic.

D) read data from program memory (citește date din mmemoria program).

După această comandă chip-ul va transmite biți de date scoși din memoria program (una din cele două jumătăți: utilă sau configurabilă) accesată curent, începând cu al doilea front crescător al semnalului de tact. Pinul RB7 va trece pe mod ieșire tot la al doilea front crescător al tactului, și va reveni înapoi în mod intrare(impedanță ridicată) după al 16-lea front crescător. Diagrama de timp a acestei comenzi este prezentată in figura 8.2.5

E) read data from data memory (citește date din memoria de date).

După primirea acestei comenzi, chip-ul va transmite biți de date din memoria de date începând cu al doilea front crescător al semnalului de tact. Pinul RB7 va trece in mod ieșire in același timp și va reveni după al 16-lea front crescător al intrării de tact. Cum s-a stabilit anterior, memoria de date fiind pe 8-biți, doar primii 8-biți care sunt scoși la ielire sunt date propriuzise.

F) increment address (incrementarea adresei).

Numărătorul de program (PC) este incrementat când această comandă este recepționată. Diagrama de timp pentru această comandă este prezentată în figura 8.2.6

Figura 8.2.5: Comanda de citire a datelor din memoria program (programare/verificare serială)

Figura 8.5.6: comanda de incrementare a adresei (programare/verificare serială)

G) begin programming (inceperea programării).

Înainte de fiecare comandă ‘incepeți programarea’ trebuie dată o comandă de ‘încărcare’. Programarea memoriei alese (memoria program de test, memoria program utilă sau memoria de date) va începe după ce această comandă este primită și decodată. Un mecanism intern de temporizare va executa o ștergere înainte de scriere. Utilizatorul va trebui să aloce 10ms pentru ca programarea să fie completă. Nu este necesară nici o comandă de genul ‘sfârșește programarea’(end programing).

H) bulk erase program memory (șterge ‘în bloc’ memoria).

După această comandă, următoarea comandă program va șterge în întregime memoria program. Timpul de ștergere specificat este de 10ms. Dacă adresarea se face către memoria program utilă, atunci doar memoria program utilă va fi ștearsă.

Dacă este adresată memoria program de test (200h-200Fh), atunci și memoria utilă și memoria de test vor fi șterse. Cuvântul de configurație nu va fi șters chiar dacă va fi vizată locația de memorie de la adresa 2007h.

I) bulk erase data memory (țterge toată memoria de date).

După ce această comandă este executată, următoarea comandă program va șterge în întregime memoria de date. Timpul de stergere este specificat a fi de 10ms.

8.2.4.Algoritmul de programare cerut de tensiunea variabilă Vdd.

Microcontrolerul PIC16C84 utilizează un algoritm inteligent care cere verificarea programului la tensiunea Vddmin și la Vddmax. Verificarea la tensiunea Vddmin garantează o ‘margine de ștergere’ bună iar verificarea la Vddmax garantează o ‘margine de program’ bună.

Programarea actuală trebuie să fie făcută cu tensiunea Vdd în domeniul (4.5V – 5-5V)

Vddp= domeniul tensiunii continue cerut în timpul programării

Vddmin= valoarea minimă a tensiunii de operare Vdd speculată

pentru microprocesor

Vddmax= maloarea maximă a tensiunii de operare Vdd speculată

pentru microprocesor

Programarea trebuie să verifice microprocesorul PIC16C84 la nivelurile de tensiune Vddmin și Vddmax specifice.

NOTĂ: Orice programator care nu respectă aceste recomandări poate fi clasificat ca ‘prototip’ sau ‘sistem de dezvoltare’ a programatorului dar nu poate fi un programator calitativ pentru ‘producție’.

8.3.0Configuration word (cuvântul de configurare).

Microcontrolerul PIC16C84 are un registru cu 5-biți pentru configurare. Acești biți pot fi setați (citiți ca ‘0’ logic) saulăsați nemodificați (citiți ca ‘1’ logic). Cu ajutorul lor se pot seta diferite configurații ale dispozitivului.

Figura 10.3-1: Cuvântul de configurare

Nr. Bitului:

13 12 11 10 9 8 7 6 5 4 3 2 1 0

bitul CP: configurarea codului de protecție

1= codul de protecție este validat

0= codul de protecție este invalidat

bitul PWRTE: power up timer enable configuration bit

1= timerul ‘power-up’ este validat

0= timerul ‘power-up’ este invalidat

bitul WDTE: validarea configurării timerului WDT

1= timerul WDT este activat

0= timerul WDT este dezactivat

biții FOSC1, FOSC0: biții pentru selectarea oscilatorului

11= oscilator RC

10= oscilator HS

01= oscilator XT

00= oscilator LP

8.3.1 Protecția codului

Pentru PIC16C84, odată ce codul de protecție e activat, toate locațiile de memorie vor putea fi citite doar într-un mod încâlcit. Locațiile ID și cuvântul de configurare sunt citite și ele la fel. În plus, programarea este invalidată pentru toată zona memoriei program și cea de date. Programarea locațiilor ID și a cuvântului de configurare este posibilă.

8.3.1.1. Invalidarea codului de protecție

Este recomandat ca înainte de încercarea oricărei programări să se execute următoarele proceduri. Este de asemenea posibilă,prin această procedură închiderea codului de protecție (CP=1); in orice caz, toate datele din memoria program și cea de date vor fi șterse la executarea acestei proceduri, astfel nefiind compromisă securitatea datelor sau a codului de protecție.

Procedura de invalidare a codului de protecție:

se execută ‘load configuration’ (bitul 4 se pune pe ‘1’ logic)

se incrementează locația cuvântului de configurare (200Fh)

se execută comanda (000001)

se execută comanda (000111)

se execută ‘begin programming’ (001000)

se așteaptă 10ms

se execută comanda (000001)

se execută comanda (000111)

8.3.2. Întipărirea cuvântului de configurare și a informației ID într-o pagină HEXA.

Pentru a putea transporta ‘codul’, programatorul trebuie să citească cuvântul de configurare și informațiile ID dintr-o pagină hexa (hex file) când se încarcă pagina hexa. Dacă informația pentru cuvântul de configurare nu a fost prezentă în pagina hexa, atunci va rezulta un mesaj simplu de avertizare (warning). Similar, când se salvează pagina hexa, toate informațiile despre cuvântul de configurare și desore locațiile ID trebuie să fie incluse. Poate fi inclusă și opțiunea de a nu salva aceste informații.

Specific pentru PIC16C84 aste că și memoria de date ar trebui inclusă într-o asemenea pagină hexa (vezi paragraful 4.0).

Tabelul 3.1: CHECKSUM COMPUTATION

Tabelul 3.2:

Legendă: CFGW= configuration word (cuvântul de configurare)

SUM[a:b]= suma locațiilor de la ‘a’ la ‘b’ inclusiv

SUM_XNOR[a:b]= funcția ‘sau-exclusiv’ aplicată ……………………………

*checksum = [suma tuturor expresiilor individuale] MODULO [0xFFFF]

8.4.0. Intipărirea conținutului EEPROM-ului de date într-o pagină HEXA.

Programatorul ar trebui să fie capabil să citească informația EEPROM-ului de date dintr-o pagină hexa și invers (ca o opțiune), să poată scrie conținutul EEPROM-ului de date într-o pagină hexa împreună cu informațiile din memoria program și informațiile de siguranță.

Cele 64 de locațiiale memoriei de date sunt dispuse (mapate) logic începând cu adresa 0x2100h. Formatul pentru depoyitarea memoriei de date este de un ‘byte’ pentru adresarea unei locații.

Tabelul 8.4.1: Recomandările pentru AC/DC în modul ‘programare/verificare test’

Legendă: ST= trigger schmitt; P/V= programare/verificare

Nota 1: programul trebuie să fie verificat la tensiunile Vddmin și Vddmax

Nota 2: tensiunea VIHH trebuie să fie mai mare decât Vdd (4,5V) pentru a

rămâne în modul de lucru programare/verificare

9.0. CARACTERISTICI ELECTRICE

Valorile maxime absolute:

Temperatura ambiantă (pentru funcționare)…………………………………….. ………-55–+125

Temperatura ambiantă (de depozitare) )……………………………………………….. -65–+150

Tensiunea la Vdd cu privire la Vss)………………………………………………………..0–7,5V

Tensiunea /MCLR cu privire la Vss (nota 2) )……………………………………………..0–+14V

Tensiunea la ceilalți pini cu privire la Vss)………………..…………………-0,6V—(Vdd+0,6V)

Puterea totală disipată (nota 1) )……………………………………..…………………… 800mW

Curentul maxim de ieșire la pinului Vss)………………………………………………….. 150mA

Curentul maxim de intrare la pinului Vdd)…………………………..…………………… 100mA

Curentul maxim absorbit de orice pin I/O)……………………………………….………… 25mA

Curentul maxim debitat de orice pin I/O)…………………….…………………………….. 20mA

Curentul maxim absorbit de portul A)………………………………….…………………… 80mA

Curentul maxim debitat de portul A)……………………………………………….……… 50mA

Curentul maxim absorbit de portul B)………………………………………………………150mA

Curentul maxim debitat de de portul B)…………………………………………………….100mA

Notă 1: Puterea disipată este calculată astfel:

Pdis= Vdd x (Idd – IOH) + ((Vdd–VOH) x IOH) + (VOL x IOL)

Notă 2:

Capitolul 2. Placa programator

2.0. SOLUȚII DE IMPLEMENTARE HARDWARE

2.1. Exemplul1 de programator pentru microcontrolerului PIC16C84

Această aplicație descrie construcția unui programator serial, la preț redus, pentru microcontrolerul PIC16C84, care este controlat utilizând portul paralel al unui PC. Acest programator este capabil să programeze microprocesorul PIC16C84 și să citească (să scoată) datele interne, fără să fie nevoie de mutarea componentei din sistemul de dezvoltare.

Această caracteristică este foarte utilă în aplicațiile în care sunt necesare schimbări ale codului programului și ale constantelor pentru a compensa alte caracteristici ale sistemului. De exemplu, un control fix al sistemului, trebuie să compenseze variațiile de performanță sau de incărcare pentru un actuator mecanic. Programul de bază poate fi conceput și testat în faza de proiect. Programul final și controlul constantelor pot fi ajustate mai târziu în faza de producție, fără a fi necesară înlăturarea microcontrolerului din circuit.

Softul automat și îmbunătățirea performanțelor pot fi de asemenea implementate printr-o metodă ‘in sistem’. Cu privire la recepționarea de noi sisteme soft prin intermediul disculi sau modemului, un procesor de control cu codul de programare inclus ar putea îndeplini o reprogramare “pe placă” a altor microcontrolere din sistem.

Acest programator poate încărca codul programului, configurația internă și datele din EEPROM, în PIC16C84. În modul de lucru “citire” din PIC16C84 poate verifica toate intrările de date.

2.1.1.Descrierea funcționării

Microcontrolerul PIC16C84 este pus în mod de lucru “programare” prin forțarea pinilor RB7 (13) și RB6 (12) pe nivel logic scăzut (low), în timp ce pinul MCLR este inițial pus pe “0” logic pentru a reseta circuitul iar apoi este adus la tensiunea pentru programare/verificare de 12-14V. Pinul MCLR (4) rămâne la această tensiune pe toată durata de programare sau verificare rămasă.

După intrarea în modul de lucru “programare”, pinul RB7 este folosit ca intrare serială pentru modurile de programare și pentru date. O tranziție high-low la pinul RB6 (intrare în tact), modifică fiecare bit de date aplicat la RB7. Formatul serial al comenzii de date este specificat în fig. 2-4 (DS30189D): primii 6 biți ai câmpului de comandă și ultimii 16 biți ai câmpului de date. De notat că câmpul de date este compus din bitul de start, “0” logic, 14 biți de date și bitul de stop “0” logic. Comanda de incrementare a adresei este arătată în fig. 2-5 (DS30189D) este alcătuită doar din câmpul de comandă. În tabelul 2-1 (DS30189D) sunt arătate comenzile disponibile și codurile comenzilor pentru modul de “programare serială”.

Modul “citire” din microntroler este similar cu modul “programare” cu diferența că direcția datelor e inversată după cel de-al 6-lea bit de comandă pentru a permite datelor cerute să se întoarcă la programator. Figura 2-5 (DS30189D) ne arată această secvență care începe schimbarea celui de-al 6-lea bit de comandă. După ce comanda de citire este îndeplinită, programatorul comandă bufferele ‘3-stări’ să permită începerea schimbului serial prin trimiterea datelor înapoi la programator. Frontul crescător al lui RB6 (intrarea de tact) controlează fluxul de date schimbând secvențial biții de date programați anterior. Programatorul modifică aceste date pe frontul căzător al lui RB6. Este de notat că pentru 14 biți de date sunt necesari 16 impulsuri de tact.

Reprogramarea accidentală “pe placă” este prevenită în timpul operațiilor normale prin tensiunea la pinul MCLR, care nu trebuie niciodată să depășească valoarea maximă a tensiunii de alimentare de 6V în curent continuu sau să afecteze valorile logice ale biților la pinii RB7 și RB8.

După programare/verificare pinul MCLR este adus la valoarea “low” pentru a reseta microcontrolerul vizat și a-l elibera electric. Circuitul vizat (țintit) este liber atunci să activeze semnalul MCLR. În eventualitatea că MCLR nu este forțat de circuitul țintă, rezistența R4 (de 2k) furnizează un nivel logic “high” pentru microcontrolerul țintă care dă posibilitatea executării programului, indiferent de conexiunile programatorului. Pentru a preveni ca circuitul țintă să reseteze microcontrolerul țintă, cu MCLR, și penru a preveni modificarea valorilor logice aleintrărilor RB6 și RB7, în procesul de programare, trebuie făcute “provizii” (măsuri de prevedere). În cele mai multe cazuri, aceasta poate fi făcută cu “jumperi”.

2.1.2. Descrierea detaliată a circuitului

O valoare logică “high” la interfața paralelă a PC la bitul D4 va deschide tranzistorul Q3, iar MCLR va trece la masă (”0” logic), ceea ce resetează microcontrolerul.

Condiția de “reset” este apoi anulată și se aplică tensiunile pentru programare/verificare plasând “1” logic la D3 și “0” logic la D4. Rezultă că Q3 se blochează iar Q1 și Q2 se deschid. Prin conectarea emitorului la Q2 la D4 se realizează circuitul de protecție al tranzistoarelor Q3 și Q1, prevenind astfel apariția simultană a resetului și a tensiunii pentru programare/verificare. Tranzistorul Q2 este de tip 2N3904 p.n.p..

Rezistențele R1, R2, R3 și dioda D1 furnizează o interfață de nivele logice circuitelor analogice. R4 “ține sus” pe MCLR în timpul modului de funcționare “target circuit run”.

Tensiunea de programare este oferită (dată) și ajustată de la o sursă de tensiune externă. Sursa ar trebui să aibe un curent limită în domeniul de 100mA. Tensiunea de 5V pentru integratul U2 (74L5244) este furnizată cu ajutorul regulatorului local: integratul U1 (LM3400-5). Rezistența R5 este conectată la ieșirea regulatorului și asigură 5V când tensiunea de programare de 13,5V este aplicată prin rezistența R4.

Tactul și intrarea de date sunt conectate la microcontoler prin intermediul unui bufer cu 3 stări (U2). Bitul DO al portului paralel este utilizat pentru intrarea de date a C iar bitul D1 pentru tact. În timpul “modului programare” tactul și intrarea de date este permisă cu ajutorul biților D2 și D5. In timpul citirii din microcontroler buferul de date este blocat prin intermediul bitului D2 iar linia ACK de achiziție a portului paralel este utilizată citirea datelor de verificare de la C.

După programare/verificare, liniile de date și de tact sunt blocate permițând astfel microcontrolerului să folosească aceste linii. Aceasta permite programatorului să rămână conectat fizic, dar nu și electric, de sistemul țintă.

Capitolul 3. Sistemul de dezvoltare ‘SDD51’

1.1. Alimentare cu tensiune nestabilizată externă

Se poate utiliza o sursă externă de tensiune continuă de 7V .. 12V, legată la conectorul de alimentare (CON4), cu polul pozitiv la borna marcată "+" (borna din stânga). Circuitul de alimentare realizeaza protecția circuitelor de pe placă la conectarea unei tensiuni cu polaritate greșită. Pentru utilizarea variantei de alimentare externă, se interconectează jumperii J31 – J32.

Daca se inerconectează și jumperii J32 – J33, la pinul E+5V al cuplei de magistrală (CON1) este disponibilă o tensiune stabilizază de +5V, pentru alte module plasate în același sertar. Curentul maxim disponibil este de aproximativ 500mA.

1.2. Alimentare cu tensiune stabilizază externă

Se conectează o sursă stabilizată cu tensiunea de +5V la pinul E+5V al conectorului de magistrală (CON1) și se inerconectează jumperii J32 – J33. Jumperul J31 se lasă neconectat. Curentul debitat de sursă trebuie să fie în jur de 250mA, în functie de consumul circuitelor cu care este echipata placa. Daca se utilizează varianta de alimentare externă, nu mai este necesară echiparea placii cu componentele aferente stabilizatorului tensiunii de +5V.

ATENȚIE! Pentru varianta de alimentare externă, se vor respecta cu strictețe valoarea și polaritatea sursei de alimentare (polul (+) la E+5V, polul (-) la GND); conectarea greșită duce la distrugerea circuitelor de pe placă!

2.0. CONECTAREA SDB-51 CU CALCULATORUL PC

Sistemul de dezvoltare SDB-51 poate fi conectat la unul din porturile seriale COM1 sau COM2 ale oricarui calculator compatibil IBM PC, prin intermediul unui cablu serial cu 3 fire (TxD, RxD, masă).

Parametrii comunicației pot fi selectați prin meniul "Options" al programului IDE-51 (detalii, în documentație aferentă acestuia ). Circuitele de interfața utilizate respectă specificațiile standardului RS232.

ATENTIE! Dacă se utilizează sistemul SDB-51 pentru comanda unor circuite în care există tensiuni ridicate, este obligatoriu să se utilizeze circuite de izolare galvanică, având parametri corespunzători, între sistem și circuitele comandate. In caz contrar, există pericolul distrugerii sistemului de dezvoltare sau a calculatorului PC. Pentru o protecție suplimentară a calculatorului, se poate intercala un circuit de izolare galvanică pe interfața serială, între calculator și sistemul SDB_51.

Conexiunile la conectorul interfeței seriale (CON3, de tip CANON 9) sunt urmatoarele:

2 : TxD (de la SDB-51 la PC)

3 : RxD (de la PC la SDB-51)

5 : GND (masă).

3.0. CONFIGURAREA MEMORIEI

Sistemul de dezvoltare SDB-51 este prevăzut cu un circuit de memorie EPROM (în care se păstreaza programul monitor și, eventual, rutine specifice aplicației) și un circuit de memorie RAM (în care se păstrează codul și datele aplicației în dezvoltare). Placa poate fi echipat, la alegere, cu circuite având capacități de 2K, 4K, 8K, 16K sau 32K. In funcție de tipul circuitelor utilizate, se ștrapează conexiunile unor găuri de trecere libere din cablaj, în modul descris mai jos. Tabelele se interpretează în felul următor:

– se privește placa dinspre partea fără componente;

– se consideră numerotarea pinilor corespunzătoare unor capsule cu 28 de pini;

– litera "S" indică ștraparea găurilor din partea stângă a pinului, litera "D", ștraparea găurilor din partea dreaptă, iar semnul "-" indică lipsa ștrapării.

Circuit Pin: 23 26 27

–––––––––––

2716 (2K) S S –

2732 (4K) D S –

2764 (8K) D – S

27128 (16K) D D S

27256 (32K) D D D

Circuit Pin: 23 26

–––––––––

6116 (2K) S S

6164 (8K) D S

61256 (32K) D D

ATENȚIE! Dacă se montează capsule cu 24 de pini, se vor lăsa libere găurile din partea superioară (înspre cheie), deci circuitele se vor alinia în partea de jos.

Sistemul SDB-51 poate fi utilizat atât ca sistem de dezvoltare, cât si ca sistem de aplicație. In cele 2 cazuri, memoria are configurații diferite, descrise în cele ce urmează.

3.1. Configurarea memoriei pentru un sistem de dezvoltare

In sistemele de dezvoltare, memoria RAM este adresată de microcontroler atât ca memorie de date, cât și ca memorie de program. Acest mod de adresare este necesar pentru a putea transfera codul programului în memorie și pentru a putea apoi executa acest program.

Pentru această configurare, se inerconectează următorii jumperi: J51 -J52, J62 – J63. Harta memoriei este următoarea:

Adresa Memorie Memorie

de start de program de date

––––––––––––-

0000H RAM RAM (suprapus)

8000H EPROM liber

Spațiul de adresare ocupat de fiecare tip de memorie depinde de capacitatea circuitelor cu care este echipată placa (maxim 32K fiecare). Zona 8000H – FFFFH a memoriei de date nu este utilizată de sistemul de dezvoltare; în acest spațiu se vor conecta circuitele specifice aplicației, adresate ca memorie (de exemplu: buffere, latch-uri, periferice din familiile microprocesoarelor uzuale, circuite de memorie suplimentare, CAN si CNA adresabile ca registre, etc.). La selecția acestor circuite se vor decodifica liniile magistralei de adrese (obligatoriu A15!), împreună cu semnalele nRD si nWR.

3.2. Configurarea memoriei pentru un sistem de aplicație

In sistemele de aplicație, memoria RAM este adresată de microcontroler ca memorie de date, iar memorie EPROM, ca memorie de program.

Pentru această configurare, se inerconectează următorii jumperi: J52 -J53, J61 – J62. Harta memoriei este următoarea:

Adresa Memorie Memorie

de start de program de date

––––––––––––––-

0000H EPROM liber

8000H RAM RAM (suprapus)

Spațiul de adresare ocupat de fiecare tip de memorie depinde de capacitatea circuitelor cu care este echipată placa (maxim 32K fiecare). Zona 0000H – 7FFFH a memoriei de date nu este utilizată de către sistem; în acest spațiu se vor amplasa adresele circuitelor specifice aplicației. La adresarea acestor circuite se vor decodifica liniile magistralei de adrese (obligatoriu A15!), împreuna cu semnalele nRD si nWR.

In varianta de sistem de aplicație, prezența memoriei RAM în spațiul memoriei de program nu este necesară, ea rezultând din considerente de simplificare a configurării.

Microcontrolerul sistemului SDB-51 poate executa programe atât din memoria ROM internă (dacă o posedă), cât și din memoria ROM externă. Pentru utilizarea memoriei externe, se vor interconecta jumperii J81 – J82. Această configurare este obligatorie pentru sistemele de dezvoltare. Pentru utilizarea memoriei interne, se vor interconecta jumperii J82 – J83. Această configurare se va utiliza numai în cazul sistemelor de aplicație, când microcontrolerul este prevăzut cu memorie ROM sau EPROM internă.

4.0. CIRCUITUL DE RESET

Sistemul SDB-51 este prevăzut cu un circuit de RESET, declanșabil în următoarele moduri:

– automat, la conectarea alimentării ("power-on RESET");

– prin butonul RESET;

– prin semnalul extern nRESIN, activ LOW.

Circuitul generează două semnale destinate inițializării circuitelor externe: RST, activ HIGH, și nRST, activ LOW. Semnalele nRESIN, RST și nRST sunt disponibile în conectorul de magistrală (CON1) și la wrap-field.

5.0. CIRCUITUL DE TACT

Microcontrolerul este prevăzut cu oscilator intern, având frecvența dictată de cristalul de cuarț cu care este echipată placa. Valoarea acestei frecvențe se alege în funcție de frecvența maximă de tact a microcontrolerului utilizat și de necesitățile de viteză ale aplicației.

6.0. CIRCUITELE SEMNALELOR DE ÎNTRERUPERE

Sistemul SDB-51 este prevăzut cu două posibilități alternative de declanșare a întreruperii INT0.

Declanșarea manuală se realizează prin butonul SBS. Pentru utilizarea acestui mod de declanșare, se inerconectează jumperii J71 – J72. În această variantă, întreruperea INT0 poate fi utilizată la execuția pas cu pas a programelor (detalii în documentația microcontrolerului).

Se poate utiliza un semnal de întrerupere generat extern (nINT0, din conectorul de magistrală ) interconectând jumperii J72 – J73. În acest caz, semnalul extern trebiue să aibă durata minimă specificată în documentația microcontrolerului (24 perioade ale semnalului de tact).

Intreruperea INT1 este declanșată de către semnalul extern nINT1. Ambele semnale corespunzătoare întreruperilor externe sunt accesibile la conectorul de magistrală (CON1) și la wrap-field.

7.0. MONTAREA PE PLACĂ A UNOR CIRCUITE SUPLIMENTARE

Cablajul imprimat al sistemului SDB-51 are prevazută o zona ("wrap-field") pentru amplasarea unor circuite suplimentare, specifice aplicației; de exemplu, se pot monta porturi de intrare și ieșire, convertoare A/D și D/A, ș.a. Zona de wrap-field are dimensiuni suficiente pentru a amplasa capsule DIP cu 40 de pini și/sau capsule PLCC cu 40-68 de pini.

Pe una din laturile acestei zone (latura de lângă microcontroler) sunt disponibile, la găuri de pin, următoarele semnale: liniile portului 1 al microcontrolerului, semnalele corespunzătoare întreruperilor externe și timerelor, semnalele de RESET, tensiunea de alimentare. Conexiunile acestora la wrap-field sunt următoarele:

1 : Vcc 11: P1.7

2 : Vcc 12: GND

3 : Vcc 13: RESOUT

4 : P1.0 14: RESIN

5 : P1.1 15: nINT0

6 : P1.2 16: nINT1

7 : P1.3 17: T0

8 : P1.4 18: T1

9 : P1.5 19..31: neconectați

10: P1.6 32: GND

Pinii sunt numerotați în ordine, de sus în jos (pinul 1 în dreptul lui C11).

Conectorul de aplicație (CON2, de tip CANON 25) are toți pinii conectați la găuri de pin din wrap-field, putând fi deci configurat în funcție de aplicație. (Se vor urmări traseele de cablaj imprimat pentru a stabili corespondența între pinii conectorului și găurile din wrap-field).

Semnalele corespunzătoare magistralelor microcontrolerului pot fi preluate, pentru circuitele din wrap-field, de la conectorul de magistrală (CON1), prin intermediul unor găuri de pin, conectate împreună cu pinii conectorului. Conexiunile la acest conector sint prezentate în paragraful următor.

8.0. CONECTAREA PE MAGISTRALĂ A CIRCUITELOR DE EXTENSIE

Sistemul de dezvoltare SDB-51 poate fi completat cu diverse module de extensie, specifice aplicației, conectate pe magistrala microcontrolerului. Aceste module se pot conecta direct, prin intermediul conectorului de magistrală , sau pot fi amplasate într-un sertar, împreună cu sistemul SDB-51.

Conexiunile la conectorul de magistrală (CON1, de tip EURO 2X32) sunt următoarele:

1a : nPSEN 1c : ALE/nP

2a : A15 2c : nRD

3a : A14 3c : nWR

4a : A13 4c : A7

5a : A12 5c : A6

6a : A11 6c : A5

7a : A10 7c : A4

8a : A9 8c : A3

9a : A8 9c : A2

10a: AD7 10c: A1

11a: AD6 11c: A0

12a: AD5 12c: AD0

13a: AD4 13c: AD1

14a: AD3 14c: AD2

15a: nINT1 15c: nINT0

16a: RST 16c: nRESIN

17a: nRST 17c: neconectat

18a: neconectat …………

………… …………

29a: neconectat 29c: neconectat

30a: E+5V 30c: E+5V

31a: Vs 31c: Vs

32a: GND 32c: GND

Semnificația semnalelor este prezentata în schema sistemului. Deoarece conectorul conține semnalele magistralei multiplexate de adrese/date și semnalele demultiplexate ale adreselor, rezultă că se pot conecta atât circuite periferice cu magistrala multiplexată (specifice familiei 8051), cât și periferice cu magistrale demultiplexate, specifice, de exemplu, familiei microprocesorului 8080.

ATENȚIE! În actuala variantă, cupla de magistrală a sistemului SDB-51 nu este conformă cu nici un standard de magistrală . Nu se va introduce direct placa în sertare cablate conform acestor standarde (de exemplu, sertare ale microsistemelor MIND sau sertare VME).

ADS-51

Sistem de dezvoltare a aplicațiilor

1. PREZENTARE GENERALĂ

ADS-51 este un sistem de dezvoltare a aplicațiilor bazate pe microcontrolere din familia 8051.

ADS-51 conține trei componente principale, prezentate în figura 1 și descrise pe scurt în cele ce urmează.

1. Sistemul de dezvoltare SDD-51

SDB-51 este un sistem de dezvoltare echipat cu microcontroler 8031, realizat pe o placă de format simplu EUROCARD, în tehnologie dublu strat. Este prevăzut cu: memorie RAM și EPROM (2K pâna la 32K fiecare), interfață serială RS-232, surse de alimentare, posibilități de montare a unor circuite suplimentare pe placă și de conectare a unor module de extensie. Prin interconectarea unor jumperi prevăzuți pe placă, utilizatorul poate selecta diverse variante de configurare a memoriei, a surselor de alimentare, a circuitelor de RESET și întreruperi.

Datorită flexibilității sale, SDB-51 poate fi utilizat atât în configurație de sistem de dezvoltare, pentru instruire și punerea la punct a aplicațiilor, cât și în configurație de sistem de aplicație, în cadrul unor aparate și echipamente proiectate de utilizator.

Atunci când este utilizat pentru instruire, SDB51 are nevoie numai de o sursă externă de alimentare (chiar și nestabilizază) și de interfațare serială cu un calculator compatibil IBM PC.

2. Monitorul MON-51 V1.3

MON-51 este un program monitor, destinat sistemelor de dezvoltare SDB-51. Ocupă un spațiu mai mic de 2K în memoria EPROM a sistemului. Monitorul execută un set de comenzi, pe care utilizatorul le transmite printr-o fereastră specială a programului IDE-51. Comenzile permit următoarele operații: afișarea/modificarea memoriei interne și externe a microcontrolerului, încărcarea de programe și date din fișiere ale calculatorului PC, lansarea în execuție a programelor.

MON-51 pune la dispoziția utilizatorului un set de rutine, care pot fi apelate din programele de aplicație, pentru a realiza sarcini de comunicație pe interfața serială, conversii de format și comparări.

3. Mediul de dezvoltare integrat IDE-51

IDE-51 este un program special conceput pentru a facilita dezvoltarea aplicațiilor cu ajutorul sistemului SDB-51. Rulează sub sistemul de operare MS-DOS, pe orice calculator compatibil IBM PC, fără a solicita resurse deosebite (640K RAM, o interfață serială, orice tip de interfață video, poate fi rulat și de pe disc flexibil).

Dialogul cu programul se face printr-un sistem de ferestre de editare, comunicație și dialog, meniuri, "hot-keys"; toate aceste elemente pot fi accesate și cu mouse-ul. Interfața cu utilizatorul este foarte asemănătoare cu cea a aplicațiilor Borland bazate pe sistemul TurboVision (de exemplu, TurboPascal 6.0).

IDE-51 permite editarea programelor sursă , sub forma unor fișiere pe disc, având încorporat un editor flexibil, cu facilități de căutare, înlocuire și transfer; se pot edita simultan mai multe fișiere, în ferestre diferite. Asamblarea, linkeditarea și conversia în format Intel HEX se fac prin apelarea din mediul integrat a unor programe externe, într-un mod flexibil; utilizatorul poate folosi acel pachet de programe cu care este deja familiarizat. Comunicația cu sistemul de dezvoltare se face prin intermediul unei ferestre dedicate a mediului integrat. Anumite elemente ale mediului pot fi configurate în funcție de preferințele utilizatorului.

ATENTIE ! Monitorul MON-51 V1.3 și mediul de dezvoltare IDE-51 V3.1 nu pot funcționa decât împreună. Nici una din componente nu funcționează separat. Utilizatorul va reseta sistemul de dezvoltare la cererea mediului integrat, pentru ca cele doua programe să se poată identifica reciproc.

2. UTILIZARE

O sesiune tipică de dezvoltare a unui program de aplicație presupune urmatoarele etape:

1. Se alimentează sistemul SDD-51; se lansează programul IDE51.EXE pe calculatorul PC; se resetează sistemul SDD-51, pentru realizarea testului de identificare;

2. Se editează fișierul conținând programul în limbaj de asamblare,utilizând ferestrele de editare și meniurile "File", "Edit", "Search" ale programului IDE-51;

3. Se asamblează, linkeditează și convertește în format Intel HEX programul sursă editat, utilizând comenzile din meniul "Tools" al programului IDE-51; acum se corectează eventualele erori de sintaxă;

4. Se deschide o fereastră de comunicație, utilizând comanda "TTY/Open TTY" din meniul programului IDE-51;

5. Se transferă fișierul în format Intel HEX în memoria sistemului SDB-51, utilizând comanda "TTY/Send file" din meniul programului IDE-51;

6. Eventual, se introduc manual date în memoria sistemului, utilizând comenzile "Mx" ale monitorului;

7. Se lansează în execuție programul, utilizând comanda "X" a monitorului;

8. Se testează corectutudinea execuției, eventual prin vizualizarea conținutului memoriei sistemului, cu ajutorul comenzilor "Mx" ale monitorului;

9. Dacă execuția nu a fost corectă, se modifică programul sursă din fereastra de editare, după care se repetă etapele 3-8; programul IDE-51 permite utilizarea unor combinații de taste ("hot keys"), care determină execuția inlănțuită a acestor etape, scurtând timpul necesar punerii la punct a programului;

10. Fișierul în format Intel HEX obținut se poate utiliza direct pentru programarea memoriei EPROM a sistemului de aplicație, formatul fiind acceptat de către majoritatea programatoarelor de memorii EPROM.

ANEXA 1

Descrierea instrucțiunilor

ADDLW Adună literal la W

Sintaxă: [etichetă] addlw k

Operanzi: 0 k 255

Operația: (W) + k (W)

Biții din registrul

STATUS afectați: C, DC, Y

Descrierea: conținutul registrului W este adunat literal cu cuvântul

pe 8-biți ‘k’, iar rezultatul este memorat în W.

Nr. de cuvinte: 1

Nr. de cicluri: 1

Exemplu: ADDLW 0x15

Înainte de instrucțiune

W = 0x10

După instrucțiune

W = 0x25

––––––––––––––––––––––––––––––––

ANDLW ‘SAU’literal cu W

Sintaxă: [etichetă] ANDLW k

Operanzi: 0 k 255

Operația: (W) .AND. (k) (W)

Biții din registrul

STATUS afectați: Z

Descrierea: se aplică funcția ‘ȘI’ între conținutul registrului ‘W’ și

cuvântul ‘k’, rezultatul fiind scris în ‘W’

Nr. de cuvinte: 1

Nr. de cicluri: 1

Exemplu: ANDLW 0x5F

Înainte de instrucțiune

W = 0xA3

După instrucțiune

W = 0x03

–––––––––––––––––––––––––––––––––––––-

ADDWF Adună ‘f’ la ‘W’

Sintaxă: [etichetă] ADDWF f,d

Operanzi: 0 f 127

d [0,1]

Operația: (W) + (f) (dest)

Biții din registrul

STATUS afectați: C, DC, Z

Descrierea: adună conținutul lui ‘W’ la ‘f’ iar rezultatul trece în ‘W’

dacă d=0, și în ‘f’ dacă d=1

Nr. de cuvinte: 1

Nr. de cicluri: 1

Exemplu: ADDWF FSR, 0

Înainte de instrucțiune

W = 0x17

FSR = 0xC2

După instrucțiune

W = 0xD9

FSR = 0xC2

–––––––––––––––––––––––––––––––––––––-

ANDWF ‘SAU’ între ‘f’ și ‘W’

Sintaxă: [etichetă] ANDWF f,d

Operanzi: 0 f 127

d [0,1]

Operația: (W) .AND. ( f ) (dest)

Biții din registrul

STATUS afectați: Z

Descrierea: execută funcția ‘ȘI’ între registrele ‘W’ și ‘f’ iar rezultatul trece în ‘W’ (dacă d=0), sau în ‘f’ dacă d=1

Nr. de cuvinte: 1

Nr. de cicluri: 1

Exemplu: ANDWF FSR, 1

Înainte de instrucțiune

W = 0x17

FSR = 0xC2

După instrucțiune

W = 0x17

FSR = 0x02

–––––––––––––––––––––––––––––––––––––

BCF Bit clear f

Sintaxă: [etichetă] BCF f , b

Operanzi: 0 f 127

0 b 7

Operația: 0 (f < b >)

Biții din registrul

STATUS afectați: –––––

Descrierea: bitul ‘b’ din registrul ‘f ’ este șters

Nr. de cuvinte: 1

Nr. de cicluri: 1

Exemplu: BCF FLAG_REG, 7

Înainte de instrucțiune

FLAG_REG = 0x0A

După instrucțiune

FLAG_REG = 0x8A

–––––––––––––––––––––––––––––––––––––

Similar Posts

  • Procedeu de Fabricatie a Clincherului In Strat Fluidizat

    Cuprins I.Introducere………………………………………………………………………………3 I.1 Scurt istoric……………………………………………………………………………3 II. Procedeu Pyzel……………………………………………………………………….5 III.Procedeul Kawasaki……………………………………………………………….7 III.1 Etapele dezvoltarii kawasaki………………………………………………..8 III.2Structura sistemului………………………………………………………………9 III.3 Caracteristicile sistemului…………………………………………………..10 IV. Etapele procesului………………………………………………………………..11 V. Rezultatele testelor desfasurate……………………………………………….13 V.1 Granularea…………………………………………………………………………..13 VI. Evaluarea testului de performanta………………………………………..15 VII. Dimensionarea……………………………………………………………………18 VIII.Concluzii……………………………………………………………………………19 IX. Bibliografie………………………………………………………………………….20 Obținerea clincherului în strat fluidizat I Introducere În tehnologia și ingineria materialelor oxidice, domeniul lianților prezintă o…

  • Tehnologii Si Echipamente Utilizate Pentru Calirea Otelurilor

    Cap.1.Utilizarea bazinelor de călire 1.1.Generalități Din punct de vedere tehnologic bazinele pentru călire, sunt utilizate în vederea răcirii la operația de tratament termic de călire. Pentru obținerea unor organe de mașini capabile de performanțe superioare în ceea ce privește durabilitatea în condițiile de exploatare din ce în ce mai dificile impuse de continua dezvoltare a…

  • Aprofundari Privind Operatiunile de Inventariere Si Regularizarea Diferentelor Constatate

    Aprofundări privind operațiunile de inventariere și regularizarea diferențelor constatate Cuprins Introducere Contabilitatea trebuie să prezinte o imagine fidelă, transparentă și completă a patrimoniului, însă, uneori, pot apărea nepotriviri între datele din contabilitate și realitate, cauzate de anumite fenomene economice, greșeli sau neglijențe. Verificarea concordanței dintre realitatea faptică și cea scriptică a elementelor patrimoniale, atât sub…

  • Grup Generator

    GRUP GENERATOR DEFINIȚIE , UTILIZĂRI . Grupurile electrogene sunt surse energetice de rezerva , pentru consumatori ce utilizează sisteme de alimentare cu energie electrică ( spitale , bănci , aeroporturi , hoteluri , pensiuni , restaurant , gări , autogări , magazine , sedii de firme , ambasade , unități militare , unități productive cu…

  • Calculul Necesarului de Frig Pentru Carmangerie

    Bibliografie Carabogdan I.Gh., Badea A., ș.a., 1989 – Instalații termice industriale, Ed. Tehnică, București Lista notațiilor folosite a 1. Schimburi pe zi; 2. Cantitatea de generată pentru producerea energiei electrice, ; C Compresor; Cr Punctul critic; E Energia consumată de mașina frigorifică pe durata de viață, kWh; H 1. Înălțime, m; 2. Raport de comprimare;…