Lucrarea 2 – Programarea în Tiger Basic  1.

 Generalităţi 
TigerBasic® este un limbaj de programare foarte complex care permite programarea microcalculatoarelor TinyTiger. Complexitatea limbajului este dată de capacitatea sa de multitasking, adică o aplicație poate să conţină mai mult decât un program în sensul convenţional. Astfel o aplicaţie poate fi formată din mai multe programe individuale denumite task (sarcini), fiecare task fiind iniţial un program complet independent, care poate fi pornit şi oprit la întâmplare. Fiecare task poate efectua funcții independente sau mai multe task-uri împreună pot efectua o funcție mai complexă. Task-urile se pot afecta reciproc şi să comunice unul cu celălalt în cel mai simplu caz, un task constă din doar câteva instrucţiuni. Fiecare aplicație TigerBasic® constă din cel puţin un task, care este denumit task principal (MAIN TASK). Trebuie menţionat faptul că la rularea unei aplicaţii prin pornirea sistemului sau în urma unei resetări hardware este iniţializat 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 intrări şi în funcţie de acestea se generează rezultatele. În general o subrutină poate avea orice dimensiune, iar funcţionarea sa este total independentă de restul programului. Avantajele subrutinelor sunt în special, „aerisirea” codului sursă a unei aplicaţii şi faptul că o subrutină poate fi apelată concomitent de mai multe sarcini ale aceleiaşi aplicaţii. Pre-procesorul reprezintă un program separat care primeşte anumite date la intrare şi generează rezultate care sunt apoi folosite ca şi intrări pentru alte programe. Aceasta este una dintre facilităţile cele mai importante ale limbajului de programare, deoarece se pot scrie programe cu caracter general (programe care pot fi utilizate în mai multe aplicaţii), independente, care se pot utiliza foarte simplu în orice aplicaţie se dezvoltă ulterior, prin simpla apelare a fişierului în care este salvat programul. Sub această formă se pot păstra şi librării de subrutine, cu precizarea că trebuie să se cunoască cu exactitate modul de apelare a fiecărei subrutine din librărie. Codul sursă TigerBasic este de formă text ASCII şi este generat de către mediul de dezvoltare cu ajutorul interfeței de editare, prin asta se înțelege că operatorul uman programează microcontrolerul folosind interfața Tiger Basic aceasta la rândul 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 diferenţiere î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 alți indici pentru program care sunt nevoiți a fi scriși legat, în acest caz se pot folosi alternativ atât majuscule cât şi literele mici de exemplu: "DriveXWheel" = DRIVEXWHEEL, de asemenea Instrucţiuni compuse din două cuvinte pot fi scrise cu '_' în loc de un spaţiu (RUN TASK = RUN_TASK). Instrucţiuni şi argumentele pot fi separate de cel puţin un spaţiu. Fiecare linie poate conţine numai o instrucțiune de bază cu un comentariu. Liniile care sunt prea lungi pot fi împărţite pe un număr mai mare de linii folosind simbolul „&”.

2. Structură program 
Structura unui program în TigerBasic are următoarea formă:  Zonă pentru definiţii generale:  directive ale compilatorului;

147. Acesta poate fi: BYTE.Number2. 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 funcţionalitate doar în task-ul respectiv. 3 dimensiuni = structură cubică …) FIFO Bufer care funcţionează pe principiul „primul intrat primul ieşit” Definirea unei variabile de tip ARRAY se face astfel: ARRAY Name ( Number1 [. instrucţiuni de pre-procesor. .  Zona de task-uri şi subrutine:  definirea variabilelor locale pentru task-ul principal. Denumire tip Limite maxime Lungime Variabile simple BYTE 0 .  definirea priorităţilor task-urilor secundare. Variabile şi operaţii posibile  Ca şi orice limbaj de programare care se respectă şi TigerBasic permite utilizarea variabilelor.483. Type – reprezintă tipul variabilelor stocate în variabila ARRAY.65535 2 Bytes LONG -2. Number n – reprezintă numărul de elemente existente pe dimensiunea n. 2 dimensiuni=matrice..  conţinutul fiecărei subrutine respectiv task.67*10^308 8 Bytes STRING Toate codurile valide: 00 .1.0FFh 0 .648 .19*10^-307 .255 1 Byte WORD 0 . Tipurile de variabile suportate de către acest limbaj de programare sunt prezentate în tabelul următor.  conţinutul programului de bază.483.32765 Bytes DATALABEL Reprezintă adrese în memoria flash Variabile compuse ARRAY Poate avea maxim 8 dimensiuni (1 dimensiune=vector. WORD.  declararea variabilelor globale. 3.147. LONG.. În exemplul de mai jos se prezintă un exemplu prin care se poate definii un ARRAY..647 4 Bytes REAL 4.  Zona task-ului principal:  definirea variabilelor locale pentru task-ul principal. Odată cu declararea unei variabile trebuie să se aloce şi un anumit tip pentru aceasta. REAL sau STRINGS (Atenţie: pentru array nu se scrie STRING). Number8] ) OF Type unde: Name – reprezintă numele alocat variabilei.  instalarea driverelor pentru dispozitivele ce vor fi utilizate. .NEXT.2. precum şi modul prin care el poate fi iniţializat cu ajutorul unei subrutine şi citit cu ajutorul a două instrucţiuni de tip FOR.

iar pentru a fi considerat număr hexazecimal trebuie început cu cifra 0: 0BFh . Pentru a se şti când se scrie un număr şi pentru a face diferenţa dintre un număr şi o variabilă. indiferent de sistemul în care se reprezintă numărul acesta va începe cu o cifră. Exemplu: 21 număr 27o 2Bh 1100b 2k număr zecimal număr octal număr hexazecimal număr binar în kiloocteţi (=2048) OBSERVAŢIE: atenţie la scrierea numerelor hexazecimale pentru că BFh este considerată denumirea unei variabile.Variabilele tip FIFO au o funcţionare mai specială şi din acest motiv se recomandă utilizarea lor de către programatorii avansaţi.

Scădere IF A = B – 3.. Operaţii 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 Funcţie de negaţie IF NOT (A=1) > Mai mare IF A>B >= Mai mare sau egal IF A>=10 < Mai mic IF A<3. / Împărţire IF A = B/2. Instrucţiunea #DEFINE se foloseşte pentru substituirea unui text cu un alt text şi se recomandă utilizarea sa în situaţiile în care un text defineşte mai bine o variabilă.Operaţiile care pot fi efectuate în cadrul acestui limbaj de programare sunt prezentate în tabelul de mai jos.. În funcţie de complexitatea aplicaţiei ce va fi dezvoltată se pot utiliza şi celelalte directive... IF A<>1 = Egal IF A=B Oberaţii 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ă biţii la stânga cu n biţi A=B SHL 4 SHR n Mută biţii la dreapta cu n biţi A=12 SHR 2 ROL n Roteşte spre stânga cu n biţi A=B ROL 4 ROR n Roteşte spre dreapta cu n biţi A=B ROR X 4. Funcţii folosite la realizarea unui program  4. funcţie sau . Dintre directivele de compilator se recomandă folosirea USER_VAR_STRICT care are rol în a obliga programatorul în declararea tuturor variabilelor pe care le foloseşte. * Înmulţire IF A = B*C. Funcţii speciale pentru începerea unui program  Aşa cum s-a arătat anterior orice program poate începe cu nişte funcţii speciale grupate în două categorii: directive ale compilatorului şi instrucţiuni de pre-procesor...1.2 <= Mai mic sau egal IF A<=20 <> Diferit de . DenumireOperator Tip operaţie Exemplu Operaţii matematice + Adunare IF A = A + 1.

. Funcţii pentru managementul task‐urilor  Funcţia TASK…END se foloseşte pentru definirea limitelor unui task. Instrucţiunea are următoarea formă: #INCLUDE Filename în care Filename este denumirea fişierului care se doreşte să fie utilizat. Trebuie precizat că este obligatoriu definirea unui task principal astfel: TASK Main Definire drivere pentru dispozitivele de intrare/ieşire Declarare variabile locale Setare priorităţi task-uri secundare (dacă există) Corp task principal . Funcţii de rulare a programului  Acestea se împart în trei categorii:  funcţii pentru managementul task-urilor.  funcţii pentru ramificaţii şi bucle.1.dispozitiv. În general acest set de instrucţiuni se folosesc la începutul unui program când se doreşte descrierea generală a programului..2. END Dacă programul necesită se pot definii unul sau mai multe task-uri secundare. #ENDCM 4.2. Forma instrucţiunii este următoarea: #CM Comentariu . Forma sa este următoarea: #DEFINE Text1 Text2 Instrucţiunea #INCLUDE se foloseşte când se doreşte utilizarea unei librării de subrutine sau a unui program salvat într-un fişier separat. 4. decât definiţia dată de către programatorul anterior în librăria de subrutine sau în driverul dispozitivului utilizat.  funcţii pentru utilizarea subrutinelor.. Definirea unui task secundar se face astfel: TASK Nume Declarare variabile locale .. Instrucţiunile #CM şi #ENDCM sunt instrucţiuni cu ajutorul cărora se introduce un set de comentarii.

Prioritatea se defineşte cu ajutorul unui număr de la 1 la 255. iar acestea pot fi locale sau globale. Totodată se pot folosi subrutine create de către alţi programatori şi care sunt incluse în librării de subrutine.. Prioroty reprezintă prioritatea task-ului faţă de alte task-uri şi este un câmp opţional. Priority Celelalte funcţii care se regăsesc în grupul de management al task-urilor sunt funcţii mai pretenţioase a căror utilizare necesită cunoştinţe avansate de programare şi din acest motiv nu sunt descrise. Forma acesteia este următoarea: RETURN .. Forma instrucţiunii este următoarea: EXIT_TASK Name Funcţia SET_TASK_PRIO se foloseşte pentru stabilirea priorităţii unui task. Această funcţie nu mai poate fi urmată de o continuare (CONT_TASK) ci doar de repornirea task-ului prin activarea RUN_TASK.Corp task . La reactivarea task-ului acesta va continua din poziţia în care a fost oprit. Revenirea dintr-o subrutină se face cu ajutorul instrucţiunii RETURN.2. Pentru această instrucţiune există două câmpuri şi anume: Name reprezintă numele task-ului care se doreşte a fi pornit. SET_TASK_PRIO Name. Funcţii pentru utilizarea subrutinelor  În cazul în care la realizarea unui program sunt secvenţe de cod care se repeta de mai multe ori se recomandă ca acestea să fie introduse într-o subrutină. 4. Instrucţiuni de pornire si oprire subrutina CALL nume_subrutina (listă de argumente) Lista de argumente poate conţine până la 16 variabile. END Funcţia RUN_TASK se foloseşte pentru a activa funcţionarea unui task secundar. În cazul în care se doreşte crearea unei subrutine în cadrul unui program aceasta se poate realiza cu ajutorul următoarelor instrucţiuni: SUB Nume (variabile de intrare şi ieşire) Declarare variabile locale . Cu cât numărul este mai mare cu atât prioritatea este mai mare. corp subrutină END În cazul în care un program foloseşte subrutine acestea pot fi apelate cu ajutorul funcţiei CALL.2. Aceste două funcţii se utilizează în general împreună şi au următoarea formă: STOP_TASK Name CONT_TASK Name EXIT_TASK este o funcţie prin care se opreşte definitiv funcţionarea unui task.. Forma instrucţiunii este următoarea: RUN_TASK Name. Priority STOP_TASK şi CONT_TASK sunt două funcţii folosite pentru oprirea şi repornirea unui task.. Trebuie menţionat că un task se poate opri pe sine sau poate opri orice task secundar.

Funcţia IF…THEN are următoarea structură: IF Condiţie THEN Set de instrucţiuni ELSE Set de instrucţiuni ENDIF . se va revenii din subrutină în momentul în care se ajunge la finalul acesteia marcat de instrucţiunea END. 4. Funcţii pentru ramificaţii şi bucle  În continuare se vor prezenta principalele funcţii pentru ramificaţii şi bucle.2. instrucţiuni de management a task-uri si de utilizare a subrutinelor. Exemplul de mai jos prezintă o structură de program care conţine majoritatea celor prezentate mai sus.În cazul în care nu se utilizează această instrucţiunea. instrucţiuni de pre-procesor. Din acest exemplu se poate observa atât modul general de organizare a unui program precum şi principalele funcţii cum ar fi: instrucţiunile speciale de la începutul unui program (comentarii. declarare variabile globale).3. directive compilator.

pentru a se executa un anumit set de instrucţiuni. iar în funcţie de valoarea acesteia se execută un anumit set de instrucţiuni. Exemplu: Funcţia SWITCH este o funcţie utilizată pentru a determina ce valoare ia o anumită variabilă (Variabilă). Exemplu: . expresia „DEFAULT”. Structura acesteia este următoare: SWITCH Variabilă CASE Variabilă valoarea_1: Set de instrucţiuni CASE Variabilă Valoarea_n: Set de instrucţiuni DEFAULT: Set de instrucţiuni ENDSWITCH Din structura funcţiei se observă că se poate utiliza la finalul funcţiei.Instrucţiunea execută un set de instrucţiuni în funcţie de îndeplinirea condiţiei impuse. cât şi cei care operează la nivel de BIT (vezi Tabel cu operatori). atât cei care lucrează cu numere reale. Acest set de instrucţiuni se execută dacă variabila utilizată nu ia nici o valoare din cele stabilite. În partea de condiţie se pot folosi diverşi operatori.

Exemplu: .Funcţia FOR este o funcţie repetitivă care realizează un set de instrucţiuni în funcţie de incrementarea unei variabile care porneşte de la o valoare şi se termină la altă valoare. Structura funcţiei este următoarea: FOR variabilă = Start TO End STEP Val Set de instrucţiuni NEXT Semnificaţia notaţiilor de mai sus este următoarea: Variabilă – variabila care se incrementează Start – valoarea iniţială pe care o ia variabila End – valoarea finală pe care o ia variabila STEP – este opţional şi cu ajutorul lui se defineşte pasul cu care să se incrementeze variabila Val – reprezintă valoarea pasului cu care se incrementează variabila (se utilizează doar dacă se foloseşte STEP). Această funcţie se poate folosi pentru realizarea buclelor infinite. cât şi cei care operează la nivel de BIT (vezi Tabel cu operatori). prin utilizarea valorii „0” pentru pasul de incrementare al variabilei. Structura acestei instrucţiuni este următoarea: WHILE Condiţie Set de instrucţiuni ENDWHILE În partea de condiţie se pot folosi diverşi operatori. Exemplu: Funcţia WHILE este o funcţie repetitivă care execută un anumit set de instrucţiuni atâta timp cât condiţia luată în considerare este îndeplinită. În plus pentru utilizarea neîndeplinirii unei condiţii se poate utiliza expresia NOT. atât cei care operează cu numere reale.

 funcţii pentru transferul de date prin intermediul porturilor. Exemplu: 4. 4. Structura funcţie este următoarea: LOOP Valoare Set de instrucţiuni ENDLOOP Valoare reprezintă numărul de repetări a setului de instrucţiuni.Funcţia LOOP este o funcţie repetitivă care execută un anumit set de instrucţiuni de atâta ori de câte ori este setat să îl execute. Funcţii de intrare/ieşire  Acestea se împart în trei categorii:  funcţii pentru comunicarea pe portul serial. primul grup de funcţii nu se va prezenta.3. Deoarece pe placa de dezvoltare ce se va utiliza.  funcţii pentru comunicarea cu echipamentele de intrare/ieşire care dispun de drivere de instalare.1. portul serial este implementat ca şi echipament cu driver.3.  Funcţii  pentru  comunicarea  cu  echipamentele  de  intrare/ieşire  care  dispun de drivere de instalare  Rolul driverului pentru un dispozitiv instalat este de a controla funcțiile specifice dispozitivului instalat şi eventual să efectueze operaţiuni specifice independente ale dispozitivului. .

#Func_No]. GET. WORD sau LONG şi face referire la numărul/numele echipamentului de intrare/ieşire care este definit la începutul programului prin comanda INSTALL_DEVICE. statutul de eroare. de a atribui un număr/nume de identificare în program pentru dispozitivul instalat şi de a seta parametrii dispozitivului instalat. Instrucţiunile PUT. PRINT şi PRINT_USING sunt folosite pentru a scrie constante. De exemplu. dispozitive cu interfeţe multiple. variabile sau expresii care se găsesc în lista de ieșiri care sunt trimise mai departe către un dispozitiv de ieșire. În cele din urmă. Fluxurile de date sunt intrările şi ieşirile care sunt în mod normal primite sau transmise de la un echipament sau către un echipament în funcţionare normală. Options unde: #Dev_No – este o constantă. #Func_No]. „File name“. [. driverul dispozitivului poate fi utilizat pentru schimbul de date şi de control al fluxurilor de informaţii. INPUT LINE. două canale pot fi folosite ca un ceas real unul să înregistreze secundele canal-0 = secunde. Lungimea maximă de caractere care se poate trimite este de 240 de caractere. PRINT şi PRINT USING. este posibil să existe canale care să efectueze numai funcții logice fără prezenţa fizică.Acest lucru simplifică foarte mult limbajul de programare a intrărilor şi ieşirilor din moment ce ele sunt deja gestionate de driver. Toate tipurile de echipamente care deţin drivere sunt abordate cu aceleaşi instrucțiuni de bază care sunt: PUT. orele de funcţionare. Control de informaţii este folosit pentru a ajusta anumiți parametrii de funcţionare sau pentru a se interesa de anumite stare a echipamentului. folosind numărul/numele de identificare. rata de eşantionare. de exemplu. etc. banda de tensiune. Opțiuni – se referă la opțiunile (parametrii sau stări) ce pot fi setate pentru un anume dispozitiv (acestea depind de modul cum este realizat driverul propriu-zis). Toate „intrările de la” şi „ieşirile către” ale dispozitivului instalat sunt efectuate în cadrul programului. convertoarele analog-numerice cu mai multe canale. [. Exemple de parametri ai dispozitivelor sunt: rata baud. #Sec_Adr][. Output list PRINT_USING #Dev_No. #Func_No]. #Sec_Adr][. [. de asemenea. În aceasta se specifică numărul sau numele dispozitivului. versiune driverului etc. Dispozitivele care au un număr de canale. #Sec_Adr][. Aceste comenzi se pot executa doar dacă s-a instalat driverul pentru dispozitivul spre care se trimite datele. iar cel de doilea canal să incrementeze un număr la trecere a 100 de secunde canal-1 = 1/100 secunde. Output list PRINT #Dev_No. În funcţie de driverul dispozitivului. . pot. Sintaxele de comandă pentru fiecare instrucţiune sunt următoarele: PUT #Dev_No. Instalarea unui driver se face cu ajutorul instrucţiunii INSTALL_DEVICE care are rol de a include driverul specificat prin numele fişierului în program. „Nume fisier” – se referă la calea către driverul dispozitivului pe care dorim să îl instalăm dacă aceasta nu este specificată atunci programul va căuta automat în directorul specificat la DIRECTOARE în meniul de opţiuni. – este o variabilă. Fiecăruia dispozitiv de intrare ieșire îi este alocat un nume individual în program în baza căruia poate fi apelat pe parcursul executării programului. face uz de adrese secundare cu care este selectat canalul corespunzător al dispozitivului. INPUT. constantă sau expresie de tip BYTE. Formatul instrucţiunii este următorul: INSTALL_DEVICE #Dev_No.. De exemplu dacă instalăm un port serial la opțiuni se poate specifica viteza de baud pe care o va avea portul respectiv. modul de operare etc. Exemple de stări ale dispozitivelor includ statusul zonelor tampon: Liber/Ocupat. Output list unde: #Dev_No.

INPUT şi INPUT_LINE sunt folosite pentru a citii constante.  instrucţiunea PRINT se foloseşte pentru transferul datelor formatate. Variable INPUT #Dev_No. #Func_No]. constante sau expresii de tip BYTE. WORD. Sintaxele de comandă pentru fiecare instrucţiune sunt următoarele: GET #Dev_No. WORD sau LONG. [. Acest parametru poate fi o variabilă. o constantă sau o expresie de tip BYTE. – este o variabilă. [. WORD sau LONG. Acest parametru poate fi o variabilă. Variable INPUT_LINE #Dev_No. Instrucţiunile GET. aceste setări sunt menționate de către producător în manualul driverului şi cu ajutorul acestei funcții se pot implementa în program. aceste setări sunt menționate de către producător în manualul driverului şi cu ajutorul acestei funcții se pot implementa în program. WORD. #Sec_Adr – se referă la adresa secundară a canalului dispozitivului instalat cu care se doreşte comunicarea. #Func_No – este un parametru opțional care se folosește în cazul în care driverul echipamentului instalat are nevoie de anumite setări adiționale. Pentru comanda PRINT caracterele de control care se pun între elementele din listă au fiecare un efect diferit asupra formatării datelor care se trimit. Variable unde: #Dev_No. #Func_No]. variabile sau expresii care se găsesc la bornele dispozitivelor de intrare. Lungimea maximă a blocului de date care se pot citii este de 255 de caractere. limita maximă depinzând doar de mărimea variabilei. La sfârșitul acestei liste cursorul este setat la o linie nouă cu condiția ca acesta să nu fie inhibat prin folosirea unuia din caracterele de control respectiv caracterul punct şi virgulă. El are semnificaţie diferită în funcţie de tipul variabilei în care se citeşte. astfel:  dacă variabila este de tip STRING:  Number = 0 – în această situaţie toate datele (toţi bytes) găsite la terminalele echipamentul de intrare vor fi transferate. #Sec_Adr][. o constantă sau o expresie de tip BYTE. ) – următorul element este pus imediat după elementul anterior.#Sec_Adr – se referă la adresa secundară a canalului dispozitivului instalat cu care se doreşte comunicarea.  instrucţiunea PRINT_USING se foloseşte pentru transferul datelor formatate cu specificaţia că formatarea acestora se realizează cu instrucţiunile USING. Fără acest parametru opțional valoarea adresei secundare ia implicit valoarea 0. ) – elementele sunt legate împreună fără spațiu între ele. Diferenţele dintre cele trei instrucţiuni sunt următoarele:  instrucţiunea PUT se foloseşte pentru transferul datelor neformatate. FRAME şi TABS care trebuie puse înaintea comenzii PRINT_USING. [. LONG sau STRING în care se pun datele citite de la dispozitiv. LONG sau STRING. Number – apare doar la instrucţiunea PUT şi are un rol important în modul de citire a datelor. WORD sau LONG şi face referire la numărul/numele echipamentului de intrare/ieşire care este definit la începutul programului prin comanda INSTALL_DEVICE. #Func_No – este un parametru opțional care se folosește în cazul în care driverul echipamentului instalat are nevoie de anumite setări adiționale. Aceste comenzi se pot executa doar dacă s-a instalat driverul pentru dispozitivul de la care se doreşte citirea datelor.  caracterul ( . constantă sau expresie de tip BYTE. . Number. La sfârșitul listei comanda de Linie Noua este ignorată. #Sec_Adr][. #Func_No]. #Sec_Adr][. Variable – reprezintă variabila de tip BYTE. Fără acest parametru opțional valoarea adresei secundare ia implicit valoarea 0. Aceste caractere au următoarele funcții:  caracterul ( . Output list – este o listă ce conține variabile.

Ea poate să fie variabilă. Bitposition – reprezintă bitul corespunzător liniei pentru care dorim stabilirea direcţiei. Diferenţele dintre cele trei instrucţiuni sunt următoarele:  instrucţiunea GET citeşte datele instant (adică în momentul apelării). Acest cod de citire poate fi virgula ( .  funcţii pentru trimiterea datelor la un port (OUT.. Direction – stabileşte direcţia liniei astfel: dacă se pune valoarea 0 linia va fi de ieşire. LONG = 4 bytes. XOUT). Number = n – doar n bytes din blocul de date găsit la terminalele echipamentului de intrare sunt transferate. – reprezintă adresa logică a portului care urmează a fi citit. Spre exemplu: n=1 şi Variable=WORD. Structura instrucţiunii este următoarea: DIR_PORT Log_Portadr. Bitposition. Dacă lungimea numărului nu este suficientă se citeşte valoarea 0. Direction unde: Log_Portadr. DIR_PORT funcţionează la fel ca instrucţiunea DIR_PIN cu precizarea că în această situaţie se stabileşte direcţia întregului port. ).  Number = n – se foloseşte pentru a putea citii numere mici în variabile mari. WORD sau LONG. constantă sau expresie de tipul BYTE. Direction unde: Log_Portadr.  instrucţiunea INPUT_LINE are aceeaşi funcţionalitate ca şi instrucţiunea INPUT. respectiv un cod cuprins în intervalul (00h-1Fh). Structura instrucţiunii este următoarea: DIR_PIN Log_Portadr. Principala modalitate pentru citirea unui port o reprezintă instrucţiunea IN care citeşte valoarea (pe 8 biţi) a portului adresat. iar expresia sa este: IN Log_Portadr..  Dacă variabila este numerică:  Number = 0 – în această situaţie lungimea numărului este citită în funcţie de tipul variabilei astfel: BYTE = 1 byte. – reprezintă adresa portului pentru a cărui linie se doreşte stabilirea unei direcţii. WORD = 2 bytes. iar dacă se pune valoarea 1 atunci linia va fi de intrare. Funcţii pentru transferul de date prin intermediul porturilor  Pentru a asigura transferul datelor de la porturi şi către porturi se folosesc trei tipuri de funcţii:  funcţii de setare a direcţiei transferului (direcţia unui pin a unui port – DIR_PIN.. cu precizarea că în acest caz codul de citire este dat doar de tasta ENTER.2. 4. DIR_PIN este o instrucţiune care are rol în setarea direcţiei de transfer a datelor pe o anumită linie a unui anumit port. iar lungimea informaţiilor citite depind de codul setat pentru Number. Variable unde: Log_Portadr.3. iar dacă se pune o valoare diferită de 0 atunci portul va fi de intrare.  funcţii pentru citirea unui port (IN. REAL = 8 bytes. – reprezintă adresa portului pentru care se doreşte stabilirea unei direcţii. Direction – stabileşte direcţia portului: dacă se pune valoarea 0 portul va fi de ieşire.  instrucţiunea INPUT aşteaptă citirea datelor până se trimite un cod de citire. tasta ENTER. direcţia unui port – DIR_PORT). XIN. XIN$). .

Trebuie precizat ca aceste două instrucţiuni nu mai verifica accesibilitatea portului şi practic accesează direct portul. Number] ) unde: Phys_Portadr – reprezintă adresa fizică a portului citit. Pentru astfel de cazuri se recomandă folosirea instrucţiunii XOUT. Pentru trimiterea datelor către un port se foloseşte în principal instrucţiunea OUT. Variable [. dar în schimb pot apărea distorsiuni ale datelor datorită posibilităţii de accesare a portului de către alt dispozitiv. Number ) unde: Variable – reprezintă variabila în care se pune informaţia ce va fi citită de port/porturi. Astfel viteza de transfer este mult mai mare decât în cazul instrucţiunii IN. Expresiile lor sunt următoarele: Variable = XIN ( Phys_Portadr ) Variable = XIN$ ( Phys_Portadr. . constantă sau expresie de tip BYTE. WORD sau LONG. iar în această situaţie nu se mai poate folosi instrucţiunea IN. WORD sau LONG. Trebui precizat că sunt situaţii în care citirea unui port poate fi blocată (de exemplu de un driver a unui dispozitiv). Number – reprezintă numărul de porturi ce pot fi citite cu ajutorul instrucţiunii. Variable – reprezintă variabila în care există informaţia ce va fi transmisă la port/porturi. WORD sau LONG. Phys_Portadr – reprezintă adresa fizică a portului citit. Value – este o variabilă. Value unde: Log_Portadr. iar în această situaţie nu se mai poate folosi instrucţiunea OUT. constantă sau expresie de tip BYTE.. Mask – este o variabilă.. Trebuie precizat ca instrucţiunea XOUT nu mai verifica accesibilitatea portului şi practic accesează direct portul.Variable – reprezintă numele variabilei în care se pune informaţia citită de la port şi de asemenea poate fi de tipul BYTE. WORD sau LONG şi are rol în a bloca anumiţi biţi transmişi spre port. Number – reprezintă un număr care trebuie specificat doar pentru situaţiile în care variabila este de tip DATALABEL. În aceste situaţii se recomandă folosirea uneia dintre instrucţiunile XIN dacă se doreşte citirea unui singur byte sau XIN$ dacă se doreşte citirea mai multor bytes. Astfel viteza de transfer este mult mai mare decât în cazul instrucţiunii OUT. care conţine datele ce se trimit către port. Ea poate să fie variabilă. dar în schimb pot apărea distorsiuni ale datelor datorită posibilităţii de accesare a portului de către alt dispozitiv. – reprezintă adresa logică a portului la care se trimite datele. constantă sau expresie de tipul BYTE. Mask. Astfel dacă anumiţi biţi din mască are valoarea 0 atunci biţii corespunzători ai portului nu se vor schimba. iar dacă anumiţi biţi din mască au valoarea 1 atunci se transmite spre port biţii corespunzători din variabilă. Şi în această situaţie scrierea la un port poate fi blocată (de exemplu de un driver a unui dispozitiv). care are următoarea sintaxă: OUT Log_Portadr. a cărei expresie are următoarea formă: XOUT ( Phys_Portadr.