Sunteți pe pagina 1din 14

Lucrarea2ProgramareanTigerBasic 1.

Generaliti
TigerBasic este un limbaj de programare foarte complex care permite programarea microcalculatoarelor TinyTiger. Complexitatea limbajului este dat de capacitatea sa de multitasking, adic o aplicaie poate s conin mai mult dect un program n sensul convenional. Astfel o aplicaie poate fi format din mai multe programe individuale denumite task (sarcini), fiecare task fiind iniial un program complet independent, care poate fi pornit i oprit la ntmplare. Fiecare task poate efectua funcii independente sau mai multe task-uri mpreun pot efectua o funcie mai complex. Task-urile se pot afecta reciproc i s comunice unul cu cellalt n cel mai simplu caz, un task const din doar cteva instruciuni. Fiecare aplicaie TigerBasic const din cel puin un task, care este denumit task principal (MAIN TASK). Trebuie menionat faptul c la rularea unei aplicaii prin pornirea sistemului sau n urma unei resetri hardware este iniializat task-ul principal. Orice task secundar poate fi pornit sau oprit doar de un task care este deja activ, cu alte cuvinte primul task secundar poate fi pornit doar din cadrul task-ului principal. Un alt avantaj al limbajului de programare este acela de a putea utiliza subrutine. O subrutin poate fi definit ca o procedur care are anumite intrri i n funcie de acestea se genereaz rezultatele. n general o subrutin poate avea orice dimensiune, iar funcionarea sa este total independent de restul programului. Avantajele subrutinelor sunt n special, aerisirea codului surs a unei aplicaii i faptul c o subrutin poate fi apelat concomitent de mai multe sarcini ale aceleiai aplicaii. Pre-procesorul reprezint un program separat care primete anumite date la intrare i genereaz rezultate care sunt apoi folosite ca i intrri pentru alte programe. Aceasta este una dintre facilitile cele mai importante ale limbajului de programare, deoarece se pot scrie programe cu caracter general (programe care pot fi utilizate n mai multe aplicaii), independente, care se pot utiliza foarte simplu n orice aplicaie se dezvolt ulterior, prin simpla apelare a fiierului n care este salvat programul. Sub aceast form se pot pstra i librrii de subrutine, cu precizarea c trebuie s se cunoasc cu exactitate modul de apelare a fiecrei subrutine din librrie. Codul surs TigerBasic este de form text ASCII i este generat de ctre mediul de dezvoltare cu ajutorul interfeei de editare, prin asta se nelege c operatorul uman programeaz microcontrolerul folosind interfaa Tiger Basic aceasta la rndul ei transform codul scris de operator n cod ASCII pe care l trimite mai departe la controler pentru a fi interpretat. Nu se face nici o difereniere ntre scrisul cu majuscule sau cu litere mici pentru simboluri i cuvinte cheie aceast utilitate ne ajuta n momentul n care folosim parametrii, comenzi sau ali indici pentru program care sunt nevoii a fi scrii legat, n acest caz se pot folosi alternativ att majuscule ct i literele mici de exemplu: "DriveXWheel" = DRIVEXWHEEL, de asemenea Instruciuni compuse din dou cuvinte pot fi scrise cu '_' n loc de un spaiu (RUN TASK = RUN_TASK). Instruciuni i argumentele pot fi separate de cel puin un spaiu. Fiecare linie poate conine numai o instruciune de baz cu un comentariu. Liniile care sunt prea lungi pot fi mprite pe un numr mai mare de linii folosind simbolul &.

2.Structurprogram
Structura unui program n TigerBasic are urmtoarea form: Zon pentru definiii generale: directive ale compilatorului;

instruciuni de pre-procesor; declararea variabilelor globale. Zona task-ului principal: definirea variabilelor locale pentru task-ul principal; instalarea driverelor pentru dispozitivele ce vor fi utilizate; definirea prioritilor task-urilor secundare; coninutul programului de baz. Zona de task-uri i subrutine: definirea variabilelor locale pentru task-ul principal; coninutul fiecrei subrutine respectiv task.

3.Variabileioperaiiposibile
Ca i orice limbaj de programare care se respect i TigerBasic permite utilizarea variabilelor. Este important de tiut c variabilele pot fi de dou tipuri: variabile generale care se definesc la nceputul programului i care pot fi utilizate oriunde n program; variabile locale care se declar la nceputul unui task i au funcionalitate doar n task-ul respectiv. Odat cu declararea unei variabile trebuie s se aloce i un anumit tip pentru aceasta. Tipurile de variabile suportate de ctre acest limbaj de programare sunt prezentate n tabelul urmtor. Denumire tip Limite maxime Lungime Variabile simple BYTE 0 - 255 1 Byte WORD 0 - 65535 2 Bytes LONG -2,147,483,648 - 2,147,483,647 4 Bytes REAL 4.19*10^-307 - 1.67*10^308 8 Bytes STRING Toate codurile valide: 00 - 0FFh 0 - 32765 Bytes DATALABEL Reprezint adrese n memoria flash Variabile compuse ARRAY Poate avea maxim 8 dimensiuni (1 dimensiune=vector, 2 dimensiuni=matrice, 3 dimensiuni = structur cubic ) FIFO Bufer care funcioneaz pe principiul primul intrat primul ieit Definirea unei variabile de tip ARRAY se face astfel:
ARRAY Name ( Number1 [,Number2, ... , Number8] ) OF Type

unde: Name reprezint numele alocat variabilei; Number n reprezint numrul de elemente existente pe dimensiunea n; Type reprezint tipul variabilelor stocate n variabila ARRAY. Acesta poate fi: BYTE, WORD, LONG, REAL sau STRINGS (Atenie: pentru array nu se scrie STRING). n exemplul de mai jos se prezint un exemplu prin care se poate definii un ARRAY, precum i modul prin care el poate fi iniializat cu ajutorul unei subrutine i citit cu ajutorul a dou instruciuni de tip FOR..NEXT.

Variabilele tip FIFO au o funcionare mai special i din acest motiv se recomand utilizarea lor de ctre programatorii avansai. Pentru a se ti cnd se scrie un numr i pentru a face diferena dintre un numr i o variabil, indiferent de sistemul n care se reprezint numrul acesta va ncepe cu o cifr. Exemplu:
21 numr 27o 2Bh 1100b 2k numr zecimal numr octal numr hexazecimal numr binar n kilooctei (=2048)

OBSERVAIE: atenie la scrierea numerelor hexazecimale pentru c BFh este considerat denumirea unei variabile, iar pentru a fi considerat numr hexazecimal trebuie nceput cu cifra 0: 0BFh

Operaiile care pot fi efectuate n cadrul acestui limbaj de programare sunt prezentate n tabelul de mai jos. DenumireOperator Tip operaie Exemplu Operaii matematice + Adunare IF A = A + 1.. Scdere IF A = B 3.. * nmulire IF A = B*C.. / mprire IF A = B/2.. Operaii logice AND I logic IF A=1 AND C=2 OR SAU logic IF A$= OR B$=2 XOR SAU Exclusiv logic IF A=1 XOR B>C NOT Funcie de negaie IF NOT (A=1) > Mai mare IF A>B >= Mai mare sau egal IF A>=10 < Mai mic IF A<3.2 <= Mai mic sau egal IF A<=20 <> Diferit de ... IF A<>1 = Egal IF A=B Oberaii bit cu bit BITAND I logic (bit cu bit) A=B BITAND 000110011b BITOR SAU logic (bit cu bit) A=A BITOR 1Fh BITXOR SAU Exclusiv logic (bit cu bit) A=B BITXOR C SHL n Mut biii la stnga cu n bii A=B SHL 4 SHR n Mut biii la dreapta cu n bii A=12 SHR 2 ROL n Rotete spre stnga cu n bii A=B ROL 4 ROR n Rotete spre dreapta cu n bii A=B ROR X

4.Funciifolositelarealizareaunuiprogram
4.1.Funciispecialepentruncepereaunuiprogram
Aa cum s-a artat anterior orice program poate ncepe cu nite funcii speciale grupate n dou categorii: directive ale compilatorului i instruciuni de pre-procesor.

Dintre directivele de compilator se recomand folosirea USER_VAR_STRICT care are rol n a obliga programatorul n declararea tuturor variabilelor pe care le folosete. n funcie de complexitatea aplicaiei ce va fi dezvoltat se pot utiliza i celelalte directive. Instruciunea #DEFINE se folosete pentru substituirea unui text cu un alt text i se recomand utilizarea sa n situaiile n care un text definete mai bine o variabil, funcie sau

dispozitiv, dect definiia dat de ctre programatorul anterior n librria de subrutine sau n driverul dispozitivului utilizat. Forma sa este urmtoarea:
#DEFINE Text1 Text2

Instruciunea #INCLUDE se folosete cnd se dorete utilizarea unei librrii de subrutine sau a unui program salvat ntr-un fiier separat. Instruciunea are urmtoarea form:
#INCLUDE Filename

n care Filename este denumirea fiierului care se dorete s fie utilizat. Instruciunile #CM i #ENDCM sunt instruciuni cu ajutorul crora se introduce un set de comentarii. n general acest set de instruciuni se folosesc la nceputul unui program cnd se dorete descrierea general a programului. Forma instruciunii este urmtoarea:
#CM Comentariu ... #ENDCM

4.2.Funciiderulareaprogramului
Acestea se mpart n trei categorii: funcii pentru managementul task-urilor; funcii pentru utilizarea subrutinelor; funcii pentru ramificaii i bucle.

4.2.1.Funciipentrumanagementultaskurilor
Funcia TASKEND se folosete pentru definirea limitelor unui task. Trebuie precizat c este obligatoriu definirea unui task principal astfel:
TASK Main Definire drivere pentru dispozitivele de intrare/ieire Declarare variabile locale Setare prioriti task-uri secundare (dac exist) Corp task principal ... END

Dac programul necesit se pot definii unul sau mai multe task-uri secundare. Definirea unui task secundar se face astfel:
TASK Nume Declarare variabile locale

Corp task ... END

Funcia RUN_TASK se folosete pentru a activa funcionarea unui task secundar. Pentru aceast instruciune exist dou cmpuri i anume: Name reprezint numele task-ului care se dorete a fi pornit; Prioroty reprezint prioritatea task-ului fa de alte task-uri i este un cmp opional. Prioritatea se definete cu ajutorul unui numr de la 1 la 255. Cu ct numrul este mai mare cu att prioritatea este mai mare. Forma instruciunii este urmtoarea:
RUN_TASK Name, Priority

STOP_TASK i CONT_TASK sunt dou funcii folosite pentru oprirea i repornirea unui task. Trebuie menionat c un task se poate opri pe sine sau poate opri orice task secundar. La reactivarea task-ului acesta va continua din poziia n care a fost oprit. Aceste dou funcii se utilizeaz n general mpreun i au urmtoarea form:
STOP_TASK Name CONT_TASK Name

EXIT_TASK este o funcie prin care se oprete definitiv funcionarea unui task. Aceast funcie nu mai poate fi urmat de o continuare (CONT_TASK) ci doar de repornirea task-ului prin activarea RUN_TASK. Forma instruciunii este urmtoarea:
EXIT_TASK Name

Funcia SET_TASK_PRIO se folosete pentru stabilirea prioritii unui task.


SET_TASK_PRIO Name, Priority

Celelalte funcii care se regsesc n grupul de management al task-urilor sunt funcii mai pretenioase a cror utilizare necesit cunotine avansate de programare i din acest motiv nu sunt descrise.

4.2.2.Funciipentruutilizareasubrutinelor
n cazul n care la realizarea unui program sunt secvene de cod care se repeta de mai multe ori se recomand ca acestea s fie introduse ntr-o subrutin. Totodat se pot folosi subrutine create de ctre ali programatori i care sunt incluse n librrii de subrutine. n cazul n care se dorete crearea unei subrutine n cadrul unui program aceasta se poate realiza cu ajutorul urmtoarelor instruciuni:
SUB Nume (variabile de intrare i ieire) Declarare variabile locale ... corp subrutin END

n cazul n care un program folosete subrutine acestea pot fi apelate cu ajutorul funciei CALL. Instruciuni de pornire si oprire subrutina
CALL nume_subrutina (list de argumente)

Lista de argumente poate conine pn la 16 variabile, iar acestea pot fi locale sau globale. Revenirea dintr-o subrutin se face cu ajutorul instruciunii RETURN. Forma acesteia este urmtoarea:
RETURN

n cazul n care nu se utilizeaz aceast instruciunea, se va revenii din subrutin n momentul n care se ajunge la finalul acesteia marcat de instruciunea END. Exemplul de mai jos prezint o structur de program care conine majoritatea celor prezentate mai sus. Din acest exemplu se poate observa att modul general de organizare a unui program precum i principalele funcii cum ar fi: instruciunile speciale de la nceputul unui program (comentarii, directive compilator, instruciuni de pre-procesor, declarare variabile globale); instruciuni de management a task-uri si de utilizare a subrutinelor.

4.2.3.Funciipentruramificaiiibucle
n continuare se vor prezenta principalele funcii pentru ramificaii i bucle. Funcia IFTHEN are urmtoarea structur:
IF Condiie THEN Set de instruciuni ELSE Set de instruciuni ENDIF

Instruciunea execut un set de instruciuni n funcie de ndeplinirea condiiei impuse. n partea de condiie se pot folosi diveri operatori, att cei care lucreaz cu numere reale, ct i cei care opereaz la nivel de BIT (vezi Tabel cu operatori). Exemplu:

Funcia SWITCH este o funcie utilizat pentru a determina ce valoare ia o anumit variabil (Variabil), iar n funcie de valoarea acesteia se execut un anumit set de instruciuni. Structura acesteia este urmtoare:
SWITCH Variabil CASE Variabil valoarea_1: Set de instruciuni CASE Variabil Valoarea_n: Set de instruciuni DEFAULT: Set de instruciuni ENDSWITCH

Din structura funciei se observ c se poate utiliza la finalul funciei, expresia DEFAULT, pentru a se executa un anumit set de instruciuni. Acest set de instruciuni se execut dac variabila utilizat nu ia nici o valoare din cele stabilite. Exemplu:

Funcia FOR este o funcie repetitiv care realizeaz un set de instruciuni n funcie de incrementarea unei variabile care pornete de la o valoare i se termin la alt valoare. Structura funciei este urmtoarea:
FOR variabil = Start TO End STEP Val Set de instruciuni NEXT

Semnificaia notaiilor de mai sus este urmtoarea: Variabil variabila care se incrementeaz Start valoarea iniial pe care o ia variabila End valoarea final pe care o ia variabila STEP este opional i cu ajutorul lui se definete pasul cu care s se incrementeze variabila Val reprezint valoarea pasului cu care se incrementeaz variabila (se utilizeaz doar dac se folosete STEP). Aceast funcie se poate folosi pentru realizarea buclelor infinite, prin utilizarea valorii 0 pentru pasul de incrementare al variabilei. Exemplu:

Funcia WHILE este o funcie repetitiv care execut un anumit set de instruciuni atta timp ct condiia luat n considerare este ndeplinit. Structura acestei instruciuni este urmtoarea:
WHILE Condiie Set de instruciuni ENDWHILE

n partea de condiie se pot folosi diveri operatori, att cei care opereaz cu numere reale, ct i cei care opereaz la nivel de BIT (vezi Tabel cu operatori). n plus pentru utilizarea nendeplinirii unei condiii se poate utiliza expresia NOT. Exemplu:

Funcia LOOP este o funcie repetitiv care execut un anumit set de instruciuni de atta ori de cte ori este setat s l execute. Structura funcie este urmtoarea:
LOOP Valoare Set de instruciuni ENDLOOP

Valoare reprezint numrul de repetri a setului de instruciuni. Exemplu:

4.3.Funciideintrare/ieire
Acestea se mpart n trei categorii: funcii pentru comunicarea pe portul serial; funcii pentru comunicarea cu echipamentele de intrare/ieire care dispun de drivere de instalare; funcii pentru transferul de date prin intermediul porturilor. Deoarece pe placa de dezvoltare ce se va utiliza, portul serial este implementat ca i echipament cu driver, primul grup de funcii nu se va prezenta.

4.3.1. Funcii pentru comunicarea cu echipamentele de intrare/ieire care dispundedriveredeinstalare


Rolul driverului pentru un dispozitiv instalat este de a controla funciile specifice dispozitivului instalat i eventual s efectueze operaiuni specifice independente ale dispozitivului.

Acest lucru simplific foarte mult limbajul de programare a intrrilor i ieirilor din moment ce ele sunt deja gestionate de driver. Toate tipurile de echipamente care dein drivere sunt abordate cu aceleai instruciuni de baz care sunt: PUT, GET, INPUT, INPUT LINE, PRINT i PRINT USING. Fiecruia dispozitiv de intrare ieire i este alocat un nume individual n program n baza cruia poate fi apelat pe parcursul executrii programului. Dispozitivele care au un numr de canale, de exemplu, convertoarele analog-numerice cu mai multe canale, dispozitive cu interfee multiple, etc., pot, de asemenea, face uz de adrese secundare cu care este selectat canalul corespunztor al dispozitivului. n funcie de driverul dispozitivului, este posibil s existe canale care s efectueze numai funcii logice fr prezena fizic. De exemplu, dou canale pot fi folosite ca un ceas real unul s nregistreze secundele canal-0 = secunde, iar cel de doilea canal s incrementeze un numr la trecere a 100 de secunde canal-1 = 1/100 secunde. n cele din urm, driverul dispozitivului poate fi utilizat pentru schimbul de date i de control al fluxurilor de informaii. Fluxurile de date sunt intrrile i ieirile care sunt n mod normal primite sau transmise de la un echipament sau ctre un echipament n funcionare normal. Control de informaii este folosit pentru a ajusta anumii parametrii de funcionare sau pentru a se interesa de anumite stare a echipamentului. Instalarea unui driver se face cu ajutorul instruciunii INSTALL_DEVICE care are rol de a include driverul specificat prin numele fiierului n program, de a atribui un numr/nume de identificare n program pentru dispozitivul instalat i de a seta parametrii dispozitivului instalat. De exemplu dac instalm un port serial la opiuni se poate specifica viteza de baud pe care o va avea portul respectiv. Toate intrrile de la i ieirile ctre ale dispozitivului instalat sunt efectuate n cadrul programului, folosind numrul/numele de identificare. Formatul instruciunii este urmtorul:
INSTALL_DEVICE #Dev_No, File name, Options

unde: #Dev_No este o constant. n aceasta se specific numrul sau numele dispozitivului; Nume fisier se refer la calea ctre driverul dispozitivului pe care dorim s l instalm dac aceasta nu este specificat atunci programul va cuta automat n directorul specificat la DIRECTOARE n meniul de opiuni; Opiuni se refer la opiunile (parametrii sau stri) ce pot fi setate pentru un anume dispozitiv (acestea depind de modul cum este realizat driverul propriu-zis). Exemple de parametri ai dispozitivelor sunt: rata baud, banda de tensiune, rata de eantionare, modul de operare etc. Exemple de stri ale dispozitivelor includ statusul zonelor tampon: Liber/Ocupat, orele de funcionare, statutul de eroare, versiune driverului etc. Instruciunile PUT, PRINT i PRINT_USING sunt folosite pentru a scrie constante, variabile sau expresii care se gsesc n lista de ieiri care sunt trimise mai departe ctre un dispozitiv de ieire. Aceste comenzi se pot executa doar dac s-a instalat driverul pentru dispozitivul spre care se trimite datele. Lungimea maxim de caractere care se poate trimite este de 240 de caractere. Sintaxele de comand pentru fiecare instruciune sunt urmtoarele:
PUT #Dev_No. [, #Sec_Adr][, #Func_No], Output list PRINT #Dev_No. [, #Sec_Adr][, #Func_No], Output list PRINT_USING #Dev_No. [, #Sec_Adr][, #Func_No], Output list

unde: #Dev_No. este o variabil, constant sau expresie de tip BYTE, WORD sau LONG i face referire la numrul/numele echipamentului de intrare/ieire care este definit la nceputul programului prin comanda INSTALL_DEVICE;

#Sec_Adr se refer la adresa secundar a canalului dispozitivului instalat cu care se dorete comunicarea. Fr acest parametru opional valoarea adresei secundare ia implicit valoarea 0. Acest parametru poate fi o variabil, o constant sau o expresie de tip BYTE, WORD sau LONG. #Func_No este un parametru opional care se folosete n cazul n care driverul echipamentului instalat are nevoie de anumite setri adiionale, aceste setri sunt menionate de ctre productor n manualul driverului i cu ajutorul acestei funcii se pot implementa n program. Output list este o list ce conine variabile, constante sau expresii de tip BYTE, WORD, LONG sau STRING. La sfritul acestei liste cursorul este setat la o linie nou cu condiia ca acesta s nu fie inhibat prin folosirea unuia din caracterele de control respectiv caracterul punct i virgul. Diferenele dintre cele trei instruciuni sunt urmtoarele: instruciunea PUT se folosete pentru transferul datelor neformatate; instruciunea PRINT se folosete pentru transferul datelor formatate; instruciunea PRINT_USING se folosete pentru transferul datelor formatate cu specificaia c formatarea acestora se realizeaz cu instruciunile USING, FRAME i TABS care trebuie puse naintea comenzii PRINT_USING; Pentru comanda PRINT caracterele de control care se pun ntre elementele din list au fiecare un efect diferit asupra formatrii datelor care se trimit. Aceste caractere au urmtoarele funcii: caracterul ( ; ) elementele sunt legate mpreun fr spaiu ntre ele. La sfritul listei comanda de Linie Noua este ignorat; caracterul ( , ) urmtorul element este pus imediat dup elementul anterior. Instruciunile GET, INPUT i INPUT_LINE sunt folosite pentru a citii constante, variabile sau expresii care se gsesc la bornele dispozitivelor de intrare. Aceste comenzi se pot executa doar dac s-a instalat driverul pentru dispozitivul de la care se dorete citirea datelor. Lungimea maxim a blocului de date care se pot citii este de 255 de caractere. Sintaxele de comand pentru fiecare instruciune sunt urmtoarele:
GET #Dev_No. [, #Sec_Adr][, #Func_No], Number, Variable INPUT #Dev_No. [, #Sec_Adr][, #Func_No], Variable INPUT_LINE #Dev_No. [, #Sec_Adr][, #Func_No], Variable

unde: #Dev_No. este o variabil, constant sau expresie de tip BYTE, WORD sau LONG i face referire la numrul/numele echipamentului de intrare/ieire care este definit la nceputul programului prin comanda INSTALL_DEVICE; #Sec_Adr se refer la adresa secundar a canalului dispozitivului instalat cu care se dorete comunicarea. Fr acest parametru opional valoarea adresei secundare ia implicit valoarea 0. Acest parametru poate fi o variabil, o constant sau o expresie de tip BYTE, WORD sau LONG. #Func_No este un parametru opional care se folosete n cazul n care driverul echipamentului instalat are nevoie de anumite setri adiionale, aceste setri sunt menionate de ctre productor n manualul driverului i cu ajutorul acestei funcii se pot implementa n program. Variable reprezint variabila de tip BYTE, WORD, LONG sau STRING n care se pun datele citite de la dispozitiv. Number apare doar la instruciunea PUT i are un rol important n modul de citire a datelor. El are semnificaie diferit n funcie de tipul variabilei n care se citete, astfel: dac variabila este de tip STRING: Number = 0 n aceast situaie toate datele (toi bytes) gsite la terminalele echipamentul de intrare vor fi transferate, limita maxim depinznd doar de mrimea variabilei;

Number = n doar n bytes din blocul de date gsit la terminalele echipamentului de intrare sunt transferate; Dac variabila este numeric: Number = 0 n aceast situaie lungimea numrului este citit n funcie de tipul variabilei astfel: BYTE = 1 byte; WORD = 2 bytes; LONG = 4 bytes; REAL = 8 bytes. Dac lungimea numrului nu este suficient se citete valoarea 0; Number = n se folosete pentru a putea citii numere mici n variabile mari. Spre exemplu: n=1 i Variable=WORD. Diferenele dintre cele trei instruciuni sunt urmtoarele: instruciunea GET citete datele instant (adic n momentul apelrii), iar lungimea informaiilor citite depind de codul setat pentru Number; instruciunea INPUT ateapt citirea datelor pn se trimite un cod de citire. Acest cod de citire poate fi virgula ( , ), tasta ENTER, respectiv un cod cuprins n intervalul (00h-1Fh); instruciunea INPUT_LINE are aceeai funcionalitate ca i instruciunea INPUT, cu precizarea c n acest caz codul de citire este dat doar de tasta ENTER.

4.3.2.Funciipentrutransferuldedateprinintermediulporturilor
Pentru a asigura transferul datelor de la porturi i ctre porturi se folosesc trei tipuri de funcii: funcii de setare a direciei transferului (direcia unui pin a unui port DIR_PIN, direcia unui port DIR_PORT); funcii pentru citirea unui port (IN, XIN, XIN$); funcii pentru trimiterea datelor la un port (OUT, XOUT). DIR_PIN este o instruciune care are rol n setarea direciei de transfer a datelor pe o anumit linie a unui anumit port. Structura instruciunii este urmtoarea:
DIR_PIN Log_Portadr., Bitposition, Direction

unde: Log_Portadr. reprezint adresa portului pentru a crui linie se dorete stabilirea unei direcii; Bitposition reprezint bitul corespunztor liniei pentru care dorim stabilirea direciei; Direction stabilete direcia liniei astfel: dac se pune valoarea 0 linia va fi de ieire, iar dac se pune valoarea 1 atunci linia va fi de intrare. DIR_PORT funcioneaz la fel ca instruciunea DIR_PIN cu precizarea c n aceast situaie se stabilete direcia ntregului port. Structura instruciunii este urmtoarea:
DIR_PORT Log_Portadr., Direction

unde: Log_Portadr. reprezint adresa portului pentru care se dorete stabilirea unei direcii; Direction stabilete direcia portului: dac se pune valoarea 0 portul va fi de ieire, iar dac se pune o valoare diferit de 0 atunci portul va fi de intrare. Principala modalitate pentru citirea unui port o reprezint instruciunea IN care citete valoarea (pe 8 bii) a portului adresat, iar expresia sa este:
IN Log_Portadr., Variable

unde: Log_Portadr. reprezint adresa logic a portului care urmeaz a fi citit. Ea poate s fie variabil, constant sau expresie de tipul BYTE, WORD sau LONG.

Variable reprezint numele variabilei n care se pune informaia citit de la port i de asemenea poate fi de tipul BYTE, WORD sau LONG. Trebui precizat c sunt situaii n care citirea unui port poate fi blocat (de exemplu de un driver a unui dispozitiv), iar n aceast situaie nu se mai poate folosi instruciunea IN. n aceste situaii se recomand folosirea uneia dintre instruciunile XIN dac se dorete citirea unui singur byte sau XIN$ dac se dorete citirea mai multor bytes. Expresiile lor sunt urmtoarele:
Variable = XIN ( Phys_Portadr ) Variable = XIN$ ( Phys_Portadr, Number )

unde: Variable reprezint variabila n care se pune informaia ce va fi citit de port/porturi; Phys_Portadr reprezint adresa fizic a portului citit; Number reprezint numrul de porturi ce pot fi citite cu ajutorul instruciunii. Trebuie precizat ca aceste dou instruciuni nu mai verifica accesibilitatea portului i practic acceseaz direct portul. Astfel viteza de transfer este mult mai mare dect n cazul instruciunii IN, dar n schimb pot aprea distorsiuni ale datelor datorit posibilitii de accesare a portului de ctre alt dispozitiv. Pentru trimiterea datelor ctre un port se folosete n principal instruciunea OUT, care are urmtoarea sintax:
OUT Log_Portadr., Mask, Value

unde: Log_Portadr. reprezint adresa logic a portului la care se trimite datele. Ea poate s fie variabil, constant sau expresie de tipul BYTE, WORD sau LONG. Mask este o variabil, constant sau expresie de tip BYTE, WORD sau LONG i are rol n a bloca anumii bii transmii spre port. Astfel dac anumii bii din masc are valoarea 0 atunci biii corespunztori ai portului nu se vor schimba, iar dac anumii bii din masc au valoarea 1 atunci se transmite spre port biii corespunztori din variabil. Value este o variabil, constant sau expresie de tip BYTE, WORD sau LONG, care conine datele ce se trimit ctre port. i n aceast situaie scrierea la un port poate fi blocat (de exemplu de un driver a unui dispozitiv), iar n aceast situaie nu se mai poate folosi instruciunea OUT. Pentru astfel de cazuri se recomand folosirea instruciunii XOUT, a crei expresie are urmtoarea form:
XOUT ( Phys_Portadr., Variable [, Number] )

unde: Phys_Portadr reprezint adresa fizic a portului citit; Variable reprezint variabila n care exist informaia ce va fi transmis la port/porturi; Number reprezint un numr care trebuie specificat doar pentru situaiile n care variabila este de tip DATALABEL. Trebuie precizat ca instruciunea XOUT nu mai verifica accesibilitatea portului i practic acceseaz direct portul. Astfel viteza de transfer este mult mai mare dect n cazul instruciunii OUT, dar n schimb pot aprea distorsiuni ale datelor datorit posibilitii de accesare a portului de ctre alt dispozitiv.

S-ar putea să vă placă și