Sari la conținut
ELFORUM - Forumul electronistilor

Tutorial microcontrollere PIC


diablero

Postări Recomandate

CONVERSIA ZECIMAL / BINAR / HEXAZECIMAL

 

Pentru ca în finalul lecției de azi să revenim cu câteva precizări legate tot de Configuration Word, poate că este necesar să facem o scurtă ramificație în cursul discuției...

 

Deoarece este (mai ales) o lucrare pentru începători, ne vom opri puțin asupra conversiei zecimal / binar. Știm deja din clasele mici că orice număr se poate reprezenta în zecimal (baza de numerație 10), dar la fel de bine și în binar (baza de numerație 2) sau hexazecimal (baza de numerație 16). Dacă sistemul de numerație zecimal pare pentru toți cel mai „natural” posibil - și este de înțeles care este motivul (prezența celor 10 degete la mâini, primul instrument „istoric” de numărare) - celelalte două sisteme sunt extrem de utilizate în știința și arhitectura computerelor.

 

Ca o convenție asupra notației, în cele ce urmează, prin:

- 23 sau D '23' – vom înțelege un număr zecimal

- 10001 sau B '10001' - vom înțelege un număr binar

- 3FFF sau H '3FFF' (sau 0x3FFF / 0X3FFF) – vom înțelege un număr hexazecimal

 

Mulți dintre dvs. probabil știu deja că sunt convenții de notare folosite și în MPLAB (cele din paranteze fiind folosite și în limbajul C).

 

Dacă ar fi să exprimăm algoritmul de conversie zecimal / binar sub forma unui program scris în (pseudo) pseudo-cod, acesta ar avea forma (recunosc că nu este prea riguros exprimat):

 

citește numărul;

 

câtul = numărul / 2;

restul = numărul % 2;

 

cât timp (câtul <> 0)

{

câtul = numărul / 2;

restul = numărul % 2;

}

 

... se formează numărul binar prin citirea resturilor obținute de la coadă la cap;

 

Pentru a ne lămuri, vom lua două exemple. Primul exemplu (numărul zecimal 10):

10 / 2 = 5 rest 0

5 / 2 = 2 rest 1

2 / 2 = 1 rest 0

1 / 2 = 0 rest 1 – este prima cifră a numărului binar => B '1010' = D '10'

 

Al doilea exemplu (numărul zecimal 15):

15 / 2 = 7 rest 1

7 / 2 = 3 rest 1

3 / 2 = 1 rest 1

1 / 2 = 0 rest 1 – este prima cifră a numărului binar => B '1111' = D '15'

Conversia din zecimal în hexazecimal se face absolut la fel, doar împărțirea se face la 16 și nu la 2! Ceea ce este important, remarcăm că peste cifra 9 nu mai avem cifre și trebuie să completăm. În acest sens, vom avea (Tabelul 1):

 

0000 (sau B '0000') = D '0' = H '0'

0001 (sau B '0001') = D '1' = H '1'

0010 (sau B '0010') = D '2' = H '2'

0011 (sau B '0011') = D '3' = H '3'

0100 (sau B '0100') = D '4' = H '4'

0101 (sau B '0101') = D '5' = H '5'

0110 (sau B '0110') = D '6' = H '6'

0111 (sau B '0111') = D '7' = H '7'

1000 (sau B '1000') = D '8' = H '8'

1001 (sau B '1001') = D '9' = H '9'

1010 (sau B '1010') = D '10' = H 'A'

1011 (sau B '1011') = D '11' = H 'B'

1100 (sau B '1100') = D '12' = H 'C'

1101 (sau B '1101') = D '13' = H 'D'

1110 (sau B '1110') = D '14' = H 'E'

1111 (sau B '1111') = D '15' = H 'F'

 

Un punct important care trebuie atins (veti vedea, cu aplicabilitate directă asupra Configuration Word), este conversia binar / hexazecimal. Cei mai mulți dintre dvs., probabil știu deja de ce este foarte utilă: în lipsa acesteia, ar trebui să lucrăm cu numere „kilometrice” binare, foarte greu de manevrat. În cele ce urmează, tocmai pentru a face conversiile mai lizibile, între grupele de 4 cifre binare vom folosi drept separatoare caractere „underscore” (ca o remarcă, JALv2 permite asta, exact în acest scop).

 

Avem următorul număr: 11_1111_1111_1111. Deoarece prima grupă de 4 cifre (cea mai din stânga, sau cea mai semnificativă) este incompletă, vom completa cu două zero-uri. Numarul devine 0011_1111_1111_1111, iar în acest moment, pentru a face conversia în hexazecimal, este suficient să privim Tabelul 1 (pornim de la stânga la dreapta):

pentru grupa 0011 => H '3'

pentru grupa 1111 => H 'F'

pentru grupa 1111 => H 'F'

pentru grupa 1111 => H 'F'

 

Prin alăturare va rezulta simplu, numărul H '3FFF', număr care, dacă veți citi cu atenție foaia de catalog a dispozitivului, veți constata că este scris implicit drept cuvânt de configurare...

Astfel, în capitolul „Special features of the microcontroller”, fabricantul precizează: biții de configurare pot fi programați (citiți ca 0 logic) sau pot fi lăsați neprogramați (citiți ca 1 logic) pentru a selecta diverse variante de configurare de dispozitiv.

 

Cu alte cuvinte, lăsarea biților de configurare în starea implicită ar însemna ca toți aceștia pot fi citiți drept „1”, ceea ce în hexa ar însemna chiar 3FFF! Trebuie însă spus că păstrarea acestora în starea implicită, nu este întotdeauna favorabilă...

 

 

REGISTRUL DE CONFIGURARE

 

În lecţia de data trecută am văzut că o caracteristică a familiei microcontrollerelor PIC - oarecum neobişnuită în comparaţie cu alte microcontrollere - este implementarea propriului registru de configurare. Biţii registrului sunt utilizaţi pentru a activa componente hardware (sau pentru a configura stări hardware).

 

Acest cuvânt de dimensiunea instrucţiunii, care este plasat "în afara" zonei de memorie program la microcontrollerele din gamele “low-end” (familiile 10Fxx / 12Fxx) şi „mid-range” (familia 16Fxxx), este responsabil pentru specificarea:

- modului de oscilator folosit

- protecţiei codului în memoria program

- parametrilor de reset

- activării / inhibării Watchdog timer-ului

- implementării modului de depanare (la microcontrollerele PIC „evoluate” din gama medie - 16F87x)

 

Am spus deja că este recomandabil ca valoarea pentru registrul de configurare să fie scrisă atunci când dispozitivul este programat. În componentele din gamele tip „low-end” şi „mid-range” trebuie precizat faptul că biţii de configurare nu pot fi accesați de aplicaţie. În timpul programării, program counter-ul (PC – numărătorul de program care conține adresa instrucțiunii curente, registru esențial pentru rularea programului de aplicație – vom reveni) este utilizat pentru a accesa adresa registrului de configurare al microcontrollerului. Pentru dispozitivele din clasa medie („mid-range” - care fac obiectul acestui tutorial), registrul de configurare este întotdeauna la adresa 0x2007.

 

Ca o remarcă, la dispozitivele din clasa înaltă („high-end”), mecanismele implementate pot să difere foarte mult. La PIC 17Cxx, cuvântul de configurare fiind lung, registrul este situat la adresele 0x0FE00 până la 0x0FE07 (pentru octetul low) şi la adresele 0x0FE08 până la 0x0FE0F (pentru octetul high) iar aceste registre pot fi accesate în timpul executării aplicaţiei.

 

Fiecare fişier .inc de dispozitiv din MPLAB curinde o listă de parametri pentru diferite opţiuni. Aceşti parametri sunt folosiţi cu directiva __ CONFIG in fişierul de asamblare.

 

În fapt, directiva __CONFIG este folosită pentru a face o operație de tip ȘI logic (“logical AND”) cu constantele precizate în fişierul de includere (.inc). După cum am spus, lăsarea biţilor neprogramaţi (1 logic) va avea drept consecință scrierea valorii H '3FFF' in registru. Programarea anumitor biți (echivalent trecerii lor în 0 logic – conform precizării fabricantului) va da o altă valoare acestui cuvânt de configurare. În cele ce urmează, vom incerca să o calculăm noi înșine...

 

Pentru simplitate putem lua ca exemplu mai întâi, tot MCU PIC 16F84A. Veți constata în timp faptul că informațiile acumulate despre un anume microcontroller se „moștenesc” la un dispozitiv superior, iar efortul de învățare este „evolutiv”. După ce ne vom familiariza cu 16F84A, vom lua si exemple mai consistente (PIC 16F877A și PIC 16F648A).

 

Finalul fișierului de includere al PIC 16F84A arată astfel:

 

 

 

>P16F84A.inc file; ------------_CP_ON		EQU	H '000F' 		; linia 1 _CP_OFF		EQU	H '3FFF'  		; linia 2_PWRTE_OFF	EQU	H '3FF7'  		; linia 4_PWRTE_ON	EQU	H '3FFF' 		; linia 5_WDT_ON		EQU	H '3FFF' 		; linia 6_WDT_OFF 	EQU	H '3FFB' 		; linia 7_LP_OSC		EQU	H '3FFC'		; linia 8_XT_OSC		EQU	H '3FFD'		; linia 9_HS_OSC		EQU	H '3FFE'		; linia 10_RC_OSC		EQU	H '3FFF'		; linia 11

 

 

Observaţi că pentru fiecare opţiune, există o valoare cu toţi biţii setaţi (1 logic), corespunzător setării implicite. Prin operația „AND logic” al valorilor parametrilor, biţii programaţi ar trebui să fie cei specificaţi corect. Reamintim tabelul de adevăr al operației ȘI logic:

 

x y AND

0 0 0

0 1 0

1 0 0

1 1 1

 

La momentul elaborării PIC 16F84, cuvântul de configurare proiectat nu a definit toți biții de configurare, în forma în care îi știm astazi, de exemplu de la PIC 16F877A. Unii dintre ei au rămas rezervați, dar neimplementați – aceasta fiind o practică utilizată și în acest moment. La acel timp doar anumite facilități erau implementate pe cip (proiectantul va rezerva întotdeauna biți pentru dezvoltări ulterioare ale familiei sau gamei):

 

- protecția codului (prin biții CP în pozițiile 13, 12 ... 4)

 

Posibile valori pentru bitul CP:

1 – protecția codului dezactivată (opțiunea implicită - conduce la 11_1111_1111_1111 = H '3FFF')

Obs.: Se observă identitatea valorii cu cea de pe linia 2 a fișierului de includere.

0 - protecția codului activată (conduce la 00_0000_0000_1111 = H '000F')

Obs.: Se observă identitatea valorii cu cea de pe linia 1 a fișierului de includere.

 

- activarea WDT (prin bitul WDTE în poziția 2)

 

Posibile valori pentru WDTE:

1 – WDT activat (opțiunea implicită - conduce la 11_1111_1111_1111 = H '3FFF')

Obs.: Se observă identitatea valorii cu cea de pe linia 6 a fișierului de includere.

0 - WDT dezactivat (conduce la 11_1111_1111_1011 = H '3FFB')

Obs.: Se observă identitatea valorii cu cea de pe linia 7 a fișierului de includere.

 

- activarea temporizatorului start-up (prin bitul PWRTE în poziția 3)

 

Posibile valori pentru PWRTE

1 – PWRTE dezactivat (opțiunea implicită - conduce la 11_1111_1111_0111 = H '3FF7')

Obs.: Se observă identitatea valorii cu cea de pe linia 4 a fișierului de includere.

0 - PWRTE activat (conduce la 11_1111_1111_1011 = H '3FFF')

Obs.: Se observă identitatea valorii cu cea de pe linia 5 a fișierului de includere.

 

- tipurile de oscilator (biții FOSC1:FOSC0 în pozițiile 1 și 0)

 

Posibile valori pentru FOSC1:FOSC0

11 – oscilator RC extern (opțiunea implicită - conduce la 11_1111_1111_1111 = H '3FFF')

10 – oscilator HS (high speed - conduce la 11_1111_1111_1110 = H '3FFE')

01 - oscilator XT („extended” - conduce la 11_1111_1111_1101 = H '3FFD')

00 – oscilator LP (conduce la 11_1111_1111_1100 = H 'FFFC')

 

Obs.: Se observă identitatea valorilor cu cele de pe liniile – respectiv - 11, 10, 9 și 8 ale fișierului de includere. Încă un aspect interesant: opțiunea implicită a oscilatorului este cea cu rețea RC externă.

 

Continuarea în lecția următoare, care va urma foarte curând...

tutorial4.pdf

tutorial4.pdf

Link spre comentariu
  • Răspunsuri 0
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • diablero

    1

Zile populare

Top autori în acest subiect

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări