Începând cu acest număr, pe parcursul întregului an, vom prezenta celor interesaţi în programarea microcontrolerelor un excepţional curs primit de la prietenul nostru Kenneth Richardson, un american care de 20 ani încoace nu “visează” decât … microcontrolere …
Lecţia 1
Limbajul Microprocesoarelor
Cei mai mulţi oameni consideră calculatoarele un fel de dispozitive complicate, super inteligente deci imposibil de descifrat şi nu în ultimul rând capabile să gândească mult mai bine decât omul.
Realitatea este însă mai puţin “încântătoare”.
Un calculator poate executa numai ce programatorul îi “spune” să execute prin intermediul unui program.
Programul reprezintă de fapt o succesiune de comenzi foarte simple ce permit calculatorului să rezolve o anumită problemă. Odată scris şi corectat (rareori un program este corect încă din faza iniţială), calculatorul poate executa instrucţiunile foarte rapid, întotdeauna în acelaşi fel şi de fiecare dată fără greşeli (aşa s-au născut “poveştile” despre puterea calculatorului).
Deşi programul este format din instrucţiuni foarte simple, rezultatele generale pot fi impresionante, datorate în general vitezei cu care un calculator poate prelucra instrucţiunile.
Chiar dacă fiecare pas din program este foarte simplu, succesiunea instrucţiunilor – (fiecare instrucţiune este executată de milioane de ori pe secundă) – privită în ansamblu, poate face impresia unui lucru foarte complicat. Ideea este să nu priveşti lucrurile în ansamblu ci ca o succesiune de comenzi sau paşi foarte simpli.
Majoritatea microprocesoarelor (mP) au aproximativ aceleaşi comenzi sau instrucţiuni pe care le pot efectua, diferă doar denumirile folosite pentru descrierea fiecărei comenzi. Cele mai frecvente instrucţiuni folosite sunt instrucţiuni de deplasare a datelor dintr-un loc în altul, instrucţiuni de efectuarea a unor operaţii aritmetice simple (adunări, scăderi, înmulţiri, împărţiri), instrucţiuni de intrare /ieşire (transfer de date din memoria mP către exterior şi invers).
Pare destul de simplu….chiar este!
Orice tip de mP are în structura sa un număr minim de regiştri cu funcţiuni specifice. Pentru început o să amintim doar câteva dintre ele şi anume: numărătorul de adrese al programului, registrul de adresare a memoriei, registrul de intrare/ieşire.
Succesiunea de comenzi ce trebuie executată de mP este înscrisă în locaţii de adrese succesive ale unei memorii externe. Numărătorul de adrese (program counter) conţine adresa locaţiei următoare care se aduce din memorie. Imediat ce se face citirea unei locaţii din memorie, numărătorul de adrese se incrementează automat indicând adresa locaţiei următoare.
Registrul de adresare a memoriei conţine comenzile ce urmează a fi executate.
Prin intermediul registrului de intrare/ieşire se realizează transferul de date între mP şi sistemul exterior Prin exterior înţelegând ceea ce se află dincolo de chip.
Un mP conţine multe alte componente foarte importante dar … prea mult, prea curând, ar creea confuzii. Oricum, le vom aborda ulterior pe fiecare în parte.
Să revenim la noţiunea de program.
Cum am menţionat anterior un program este o succesiune de comenzi sau instrucţiuni foarte simple. Dacă am trece în lumea reală un exemplu de program care rezolvă “problema” traversării unei străzi aglomerate s-ar scrie cu următoarele comenzi:
Etapa 1: Mergi până la colţul străzii şi te opreşti.
Etapa 2: Priveşte semaforul (presupunem că există).
Etapa 3: Indică verde pentru direcţia ta?
Etapa 4: Dacă este aprinsă culoarea roşie atunci întoarce-te la Etapa 2, altfel continuă cu etapa următoare.
Etapa 5: Priveşte spre stânga.
Etapa 6: Mai trec maşini din acestă direcţie?
Etapa 7: Dacă da atunci întoarce-te la Etapa 5, altfel treci la Etapa 8.
Etapa 8: Priveşte spre dreapta.
Etapa 9: Mai sunt maşini care trec ? (N-ar trebui să fie, dar nu se ştie niciodată!)
Etapa 10: Dacă da atunci întoarce-te la Etapa 8, altfel treci la etapa următoare.
Etapa 11: Traversează, dar cu atenţie!!
Pare copilăresc la prima privire, dar este exact ce faci la fiecare traversare a unei străzi cu semafor şi exact la fel ai învăţa un mP să traverseze strada, dacă ar putea desigur.
Este ceea ce înţeleg eu prin paşi simpli.
Priviţi unitar toţi aceşti paşi, îţi permit să traversezi strada şi dacă ar fi fost efectuaţi de un mP ţi s-ar fi părut foarte inteligent.
De fapt, este inteligent, pentru că oamenii sunt inteligenţi.
Un programator care progreamează un procesor să execute aceşti paşi împarte inteligenţa lui cu microprocesorul, altfel acesta n-ar şti cum să traveseze o stradă.
Pe de altă parte, un om ar putea decide ce să facă de la un moment la altul fără o programare anterioară. De fapt există o anume “programare” şi anume experienţa anterioară.
Mai luăm un exemplu şi considerăm un alt program: umplerea unui pahar cu apă.
Pas 1: Deschizi robinetul.
Pas 2: Aduci paharul sub jetul de apă.
Pas 3: Privesti paharul.
Pas 4: Este plin?
Pas 5: Dacă nu s-a umplut te întorci la Pasul 3, altfel continuă cu pasul următor.
Pas 6: Îndepărtezi paharul de robinet.
Pas 7: Închizi robinetul.
Este un program simplu, cu câţiva paşi, dar care rezolvă o problemă – umplerea unui pahar cu apă.
Într-un mP problemele sunt totuşi diferite (altfel te-ai transforma într-un fel de robot de serviciu) dar logic paşii parcurşi în rezolvarea unei probleme sunt similari. Şi încă o observaţie, în exemplele anterioare paşii sunt numerotaţi de la 1 la 7 deci aceasta este ordinea exectă în care sunt executaţi. Numărătorul în acest caz eşti tu, citeşti liniile începând cu prima până la ultima şi execuţi comanda de pe fiecare linie.
Într-un mP numărătorul de adrese este cel care trece automat la următorul pas după ce instrucţiunea din linia curentă a fost executată. Pot exista şi cazuri în care apar salturi sau ramificaţii şi anume numărătorul execută instrucţiunea de pe o anume linie specificată, alta decât cea care urmează în mod firesc în succesiune. De exemplu pasul 5 din programul anterior este o ramificaţie şi chiar o ramificaţie condiţională. Fără aceste posibilităţi de execuţie a instrucţiunilor în bucle de sortare, soluţia ar fi complicată fiind necesară parcurgerea unui număr mult mai mare de paşi.
În această primă lecţie vreau să reţineţi faptul că un set simplu de instrucţiuni poate rezolva o problemă majoră. Privită în ansamblu rezolvarea unei probleme ar părea mai complicată decât oricare din paşii parcurşi separat pentru obţinerea soluţiei.
Cum vi se pare? Greu?
De fapt în programarea mP cel mai greu lucru este definirea problemei ce trebuie rezolvată. Este procesul de gândire logică menţionat mai sus, iar faima unui bun programator este dată de această abilitate de a defini exact problema. Este, în opinia mea, o aptitudine ce se poate dezvolta la care mai adaugi puţin talent şi nu în ultimul rând o înţelegere cât mai corectă a problemei.
• Ioana Enache