Jump to content
ELFORUM - Forumul electronistilor

Cum functioneaza un MicroControlerUnit ??


Recommended Posts

Salutam cu respect ,Poate intrebarea este banala la prima vedere , dar eu cred ca este de baza in conceptia de fabricare a codului. Deci , avem un MCU , dotat cu un clock si are injectat in el un cod de instructiuni . Codul contine functia Main precum si alte functii , instructiuni , directive, fuctii neapelate de main . Ce se intimpla dupa ce punem sub tensiune MCU ,astfel : -varianta 1- citeste tot codul la primul ciclu .Incepind cu cilu 2 , cileaza in interior fuctie Main si se opreste doar daca sint intreruperi . -varianta 2-cicleza tot codul permanent ;intreruperire trebuie folosite tinind cont de acest lucru . -varianta 3 -nu cicleaza nimic daca nu i se cere ;citeste si executa o data codul si asteapta, daca in cod nu s-au prevazut instructiuni de ciclare cod . In acesta situatie ce instructiuni se recomanda pentru obtinere ciclare sectiune de cod sau tot codul.

Link to comment
  • Replies 10
  • Created
  • Last Reply

Top Posters In This Topic

Din pacate nu e deloc asa cum spui tu...

 

Pentru explicatii voi folosi notatia uC pentru microcontroller.

 

Deci , avem un MCU , dotat cu un clock si are injectat in el un cod de instructiuni.

 

uC nu au nimic injectat. Ele pot contine un program si atunci spui despre uC ca este programat, nu injectat. Sau pot fi cu memoria goala, adica neprogramate. Un program este alcatuit din mai multe instructiuni.

 

Codul contine functia Main precum si alte functii , instructiuni , directive, fuctii neapelate de main .

 

Vad ca vorbesti de functia Main, aia este specifica limbajului C, alte limbaje nu au functia main.

uC nu stiu niciun alt limbaj in afara de limbajul de asamblare PROPRIU modelului respectiv de uC. Adica exista un limbaj de asamblare pentru PIC, alt limbajul de asamblare pentru AVR, altul pentru uProcesoarele Pentium si tot asa, fiecare cu limbajul lui de asamblare, complet diferite intre ele.

 

Buuuuun si atunci ce fac? Invat 100 de limbaje de programare in asamblare, cate unul pentru fiecare uC?

DA! Daca ai de scris soft IN LIMBAJ DE ASAMBLARE pentru 100 de uC diferite atunci inveti 100 de limbaje de programare in asamblare, ca doar fiecare vorbeste pe limba lui...

 

Si nu se poate mai simplu, sa lucrez cu 100 uC diferite si sa invat un singur limbaj de programare?

Ba da, se poate. Pentru asta s-au inventat limbajele de nivel inalt, cum ar fi C, Basic, Pascal, etc.

Tu scrii, sa zicem, in C si apoi ce ai scris in C este tradus de compilator in limbaj de asamblare specific pentru uC pe care vrei sa il folosesti.

 

E ca la limbi straine, daca vrei sa vorbesti cu 100 de popoare ai 2 posibilitati:

- sau inveti 100 de limbi (asamblare) sau

- vorbesti intr-o limba universala cum ar fi engleza © si apoi folosesti 100 de traducatori (compilatoare) fiecare traducator stie sa traduca din engleza © in limbajul unui popor anume (asamblare pentru PIC)

 

Dupa ce s-a facut de catre compilator traducerea din limbajul C in limbaj de asamblare, rezultatul va fi un program in limbaj de asamblare cu care se va programa memoria uC. Deci in memoria uC nu vei gasi programul tau in C ci vei gasi traducerea in asamblare. De retinut este ca in memoria uC se afla limbaj de asamblare indiferent ca tu ai scris in C, Basic sau direct in asamblare. Oricum ar fi totul se traduce pana la urma in asamblare.

 

O instructiune de limbaj inalt se traduce in una sau MAI MULTE instructiuni de limbaj de asamblare.

 

Ce se intimpla dupa ce punem sub tensiune MCU?

Dupa alimentarea unui uC si resetarea lui, uC ia prima instructiune (vorbim aici numai de instructiuni in asamblare nu instructiune de C) din memorie si o executa, apoi urmatoarea si tot asa. Daca sa zicem, a doua instructiune este: salt la instructiunea a 5-a atunci uC sare direct la instructiunea a 5-a fara a mai citi sau executa instructiunea a 3-a si a 4-a.

 

Daca programul tau este mai scurt decat memoria uC atunci dupa ultima instructiune uC trece si citeste mai departe urmatoarea locatie de memorie, locatie care este neprogramata, si executa ce scrie acolo, adica o tampenie.

 

Dupa ultima locatie de memorie a uC (care nu e acelasi lucru cu ultima instructiune ca tu poti avea un program de 50 de instructiuni iar uC are mai multa memorie) sare din nou la prima adresa.

 

Cand este deservita o intrerupere, indiferent unde te afli in program, se termina instructiunea in curs de executie, uC isi noteaza la ce adresa a ramas (salveaza adresa pe stiva) si sare direct la executia intreruperii. Cele mai multe uC nu salveaza NIMIC in afara de adresa unde ramasese inainte sa sara la executia intreruperii.

 

La intoarcerea din intrerupere executia se reia de la adresa pe care si-a salvat-o uC pe stiva. Daca subrutina de tratare a intreruperii modifica registrii si tu nu ai avut grija sa-i salvezi la intrarea in intrerupere atunci cand se va relua programul va iesi o mare incurcatura si nu va functiona corect.

 

Aceeasi poveste este valabila si cand ai o subrutina in loc de intrerupere.

 

Daca vrei sa-ti clarifici lucrurile cauta si citeste despre arhitectura interna a microprocesoarelor.

Link to comment

De retinut este ca in memoria uC se afla limbaj de asamblare indiferent ca tu ai scris in C, Basic sau direct in asamblare. Oricum ar fi totul se traduce pana la urma in asamblare.

As face o mica observatie. Tot ce a spus RoGeorge este corect, dar lucrurile sunt un pic mai complicate. In memoria procesorului nu se gaseste limbajul de asamblare. Mai e un pas pana la executie. Programul scris in limbaj de asamblare este un fisier text pe care uC nu il poate executa direct. Ca sa poata fi executat, programul trebuie asamblat. Rezultatul asamblarii este codul obiect si acesta este executabil. In consecinta, etapele necesare executiei unui program scris in limbaj de nivel inalt, de exemplu C, sunt:Sursa C (neexecutabila) -> prin compilare rezulta sursa in asamblare (neexecutabila, este text)Sursa in asamblare -> prin asamblare rezulta cod obiect (executabil)Codul obiect se programeaza in memoria uC si este executatCirip
Link to comment

Am inteles de la tine cam asa :1.daca chipul este programat corect , in asm va cicla tot timpul si se va opri doar daca sint intreruperi ,reset.2.Poate ca nu am pus prea corect chestiunea ; am studiat un cod scris in C care era partajat intre ce era scris in afara main si ce era scris in main (s-au apelabil de catre main); m-am intrebat de ce acest lucru si ce deosebire este intre ce se scrie in interior main si exterior main ?3.Inca nu sint lamurit in C daca cicleaza sau nu , daca trebuie puse instructiuni speciale de ciclare ?

Link to comment

1. In asm cicleaza, daca este prevazuta o instructiune de salt, de obicei la sfarsitul prog, ex:

 

bucla_infinita:

nop

rjmp bucla_infinita

 

Cicleaza doar portiunea de cod cuprinsa de la eticheta bucla_infinita si pana la rjmp, nu tot programul de la inceput. E esential de a avea la sfarsit o astfel de bucla (daca nu exista o alta bucla fara cale de iesire in program), alfel Program Counterul (PC) ce adreseaza memoria de program va trece mai departe (fara sa stie ca programul utilizatorului s-a terminat) si uC va incepe sa execute ce gaseste in memorie la adresele urmatoare (zona ce apare cu 0xFF in Pony Prog).

 

2. In C e obligatoriu sa existe o functie main, de fapt codul se grupeaza in functii. In afara functiilor se pot defini variabile globale. E la fel ca la C pt PC, definire functii, apelare cu parametrii, asta nu e diferit pt uC - in afara de detalii despre cum se transfera parametrii prin stiva, asta e util daca vrei sa combini C cu asm.

Executia incepe cu functia main. Din main se pot chema alte functii definite in exterior. Si aici e valabil cu bucla infinita ca in asm, adica tb pus un while(1); sau for(;;);

 

3. Daca nu exista in main o bucla fara iesire, sau chemata o functie care nu se mai intoarce, trebuie pus la sfarsit while(1); sau for(;;);

 

Ca sa vezi exact ce se intampla AVR Studio:

- in asm dupa ce dai Build, Debug si urmaresti prog si registrele uC sa vezi ce se intampla;

- proiectul in C poate fi importat in AVR Studio si simulat la fel, vazute instr asm generate de compilator etc.

Link to comment

Mersi pentru completare Cirip, asa este.Am vrut sa punctez diferenta intre codul executabil si limbajul de asamblare dar tot editand ditamai postul pana la urma am uitat :smt003

Link to comment

1.Deci sa inteleg ca daca in cod nu exista instructiuni spacifice de salt sau ciclare , codul se executa o singura data si apoi asteapta . Sa zicem ca este asa ; atunci ce se intimpla daca dupa prima executie se produce o schimbare la periferie (la nivelul pinilor) ? schimbarea nu va fi perceputa si nu se va executa nimic ? Singura sansa de perceptie si eventual executie ar fi daca in permanenta codul este rulat ciclic si poate sa sezizeze orice schimbare de la periferie.2.Inca nu sint lamurit in C daca este vreo regula despre ce prevedem in cod in interior main (main =atit main propiuzis cit si functiile ce sint apelate de main) sau in exterior main.

Link to comment

1.Deci sa inteleg ca daca in cod nu exista instructiuni spacifice de salt sau ciclare , codul se executa o singura data si apoi asteapta .

Se executa si trece mai departe. Daca folosesti limbajul de asamblare este usor de urmarit modul de executie a codului prin simularea pas cu pas a programului.

Sa zicem ca este asa ; atunci ce se intimpla daca dupa prima executie se produce o schimbare la periferie (la nivelul pinilor) ? schimbarea nu va fi perceputa si nu se va executa nimic ? Singura sansa de perceptie si eventual executie ar fi daca in permanenta codul este rulat ciclic si poate sa sezizeze orice schimbare de la periferie.

Depinde. Daca folosesti intreruperile in momentul in care ai un semnal pe pinul corespunzator se lanseaza in executie partea programului care trateaza intreruperea. Este si citirea constanta a porturilor o varianta, dar e mai "ergonomic" sa folosesti intreruperile, din mai multe motive. Sper ca am inteles bine ce ai intrebat.
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines