Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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.
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.