CATEGORII DOCUMENTE |
Aeronautica | Comunicatii | Electronica electricitate | Merceologie | Tehnica mecanica |
Programare in Limbaj de Asamblare
Introducere
Un exemplu de program scris
Directive de control
1 defineste
2 include
3 constanta
4 variabila
5 set
6 equ
7 org
8 end
Instructiuni conditionale
9 if
10 else
11 endif
12 while
13 endw
14 ifdef
15 ifndef
Directive de date
16 cblock
17 endc
18 db
19 de
20 dt
Configurand o directiva
21 _CONFIG
22 Processor
Fisiere create ca rezultat al translarii de program Macro-uri
Introducere
Abilitatea de a comunica este de mare importanta in orice domeniu. Totusi, este posibila numai daca amandoi partenerii de comunicare cunosc acelasi limbaj, sau urmaresc aceleasi reguli in timpul comunicarii. Folosind aceste principii ca un punct de plecare, putem de asemenea defini comunicarea ce are loc intre microcontrolere si om. Limbajul pe care microcontrolerul si omul il folosesc pentru a comunica este numit 'limbaj de asamblare'. Titlul insusi nu are un inteles deosebit, si este analog numelor altor limbaje, de ex. engleza si franceza. Mai precis, 'limbajul de asamblare' este doar o solutie trecatoare. Programele scrise in limbaj de asamblare trebuie traduse intr-un 'limbaj de zero-uri si unu-uri' pentru ca un microcontroler sa-l inteleaga. 'Limbajul de asamblare' si 'assembler-ul' sau asamblorul sunt doua notiuni diferite. Primul reprezinta un set de reguli folosite in scrierea unui program pentru un microcontroler, iar celalalt este un program in computerul personal care traduce limbajul de asamblare intr-un limbaj de zero-uri si unu-uri. Un program ce este tradus in 'zero-uri' si 'unu-uri' este numit 'limbaj masina'.
Fizic, 'Program' reprezinta un fisier pe discul computerului (sau in memorie daca este citit intr-un microcontroler), si este scris conform cu regulile de asamblare sau ale altui limbaj pentru programarea microcontrolerului. Omul poate intelege pentru ca este constituit din semne si cuvinte ale alfabetului. Cand se scrie un program, trebuie urmarite unele reguli pentru a se obtine un efect dorit. Un Translator interpreteaza fiecare instructiune scrisa in limbajul de asamblare ca o serie de zero-uri si unu-uri ce au o semnificatie pentru logica interna a microcontrolerului.
Sa luam de exemplu instructiunea 'RETURN' pe care microcontrolerul o foloseste pentru a se intoarce dintr-un sub-program.
Cand asamblorul il traduce, obtinem o serie de zero-uri si unu-uri pe care microcontroleul stie cum sa-l interpreteze.
Exemplu RETURN 00 0000 0000 1000
Similar propozitiei de mai sus, fiecare instructiune de asamblare este interpretata ca si corespunzand unei serii de zero-uri si unu-uri.
Locul unde aceasta traducere a limbajului de asamblare se gaseste , se numeste un fisier de 'executie'. Vom intalni adesea numele de fisier 'HEX'. Acest nume vine de la o reprezentare hexazecimala a acelui fisier, ca si de la apendicele 'hex' din titlu, de ex. 'run through.hex'. Odata ce este generat, fisierul de executie este citit in microcontroler printr-un programator.
Un program in Limbaj de Asamblare este scris intr-un program pentru procesarea textului (editorul) si este capabil de a produce un fisier ASCII pe discul computerului sau in zone specializate ca MPLAB ce se va explica in capitolul urmator.
Limbaj de Asamblare
Elementele de baza ale limbajului de asamblare sunt:
Label-uri sau Etichete
Instructiuni
Operanzi
Directive
Comentarii
Label-uri
Un Label este o desemnare textuala (in general un cuvant usor de citit) pentru o linie intr-un program, sau sectiunea unui program unde micro-ul poate sari sau chiar inceputul unui set de linii a unui program. Poate fi folosit de asemenea pentru a executa ramificare de program (ca Goto.) si programul poate chiar avea o conditie ce trebuie indeplinita pentru ca instructiunea Goto sa fie executata. Este important pentru un label de a incepe cu o litera a alfabetului sau cu o subliniere '_'. Lungimea label-ului poate fi de pana la 32 caractere. Este de asemenea important ca un label sa inceapa de la primul rand.
Instructiuni
Instructiunile sunt deja definite prin folosirea unui microcontroler specific, asa ca ne ramane doar sa urmam instructiunile pentru folosirea lor in limbajul de asamblare. Modul in care scriem o instructiune mai este numit 'sintaxa' instructiunii. In exemplul urmator putem recunoaste o greseala in scriere pentru ca instructiunile movlp si goto nu exista pentru microcontrolerul PIC16F8
Operanzi
Operanzii sunt elemente ale instructiunii pentru instructiunea ce este executata. Ei sunt de obicei registri sau variabile sau constante. Constantele sunt numite 'literal-e'. Cuvantul literal inseamna 'numar'.
Comentarii
Comentariul este o serie de cuvinte pe care programatorul le scrie pentru a face programul mai clar si mai usor de citit. Se plaseaza dupa o instructiune , si trebuie sa inceapa cu punct si virgula';'.
Directive
O directiva este similara unei instructiuni, dar spre deosebire de o instructiune este independenta de modelul microcontrolerului, si reprezinta o caracteristica a limbajului de asamblare insusi. Directivelor le sunt date uzual intelesuri de scop prin variabile si registri. De exemplu, LEVEL poate fi o desemnatie pentru o variabila in memoria RAM la adresa 0Dh. In felul acesta, variabila la acea adresa poate fi accesata prin desemnatia LEVEL. Aceasta este mult mai usor pentru un programator sa inteleaga decat sa incerce sa-si aduca aminte ca adresa 0Dh contine informatii despre LEVEL.
Un exemplu de program scris
Urmatorul exemplu ilustreaza un program simplu scris in limbaj de asamblare respectand regulile de baza.
Cand se scrie un program, inafara de regulile obligatorii, sunt de asemenea unele reguli ce nu sunt scrise dar trebuie urmate. Una din ele sa scrii numele programului la inceput, ce face programul, versiunea lui, date cand a fost scris, tipul microcontrolerului pentru care a fost scris, si numele programatorului.
Pentru ca aceste date nu sunt importante pentru translatorul de asamblare, este scris ca si comentarii. Trebuie remarcat ca un comentariu incepe totdeauna cu punct si virgula si ca poate fi plasat intr-un rand nou sau poate urma dupa instructiune. Este cel mai bine tinut in randul al treilea pentru a face traseul usor de urmarit.
Dupa deschiderea comentariului ce a fost scris, trebuie inclusa directiva. Aceasta este aratat in exemplul de mai sus.
Pentru a functiona corect,
trebuie sa definim cativa parametri ai microcontrolerului ca:
- tipul oscilatorului
- daca timer-ul watchdog este pe deschis, si
- daca circuitul de resetare intern este activ.
Toate acestea sunt definite prin urmatoarea directiva:
_CONFIG _CP_OFF&_WDT_OFF&PWRTE_ON&XT_OSC
Cand toate elementele necesare au fost definite, putem incepe scrierea unui program. In primul rand, este necesar de a determina adresa de unde incepe microcontrolerul, dupa pornirea sursei de alimentare. Aceasta este (org 0x00). Adresa de la care incepe programul daca are loc o intrerupere este (org 0x04). Pentru ca acesta este un program simplu, va fi suficient sa directionam microcontrolerul la inceputul programului cu o instructiune 'goto Main'.
Instructiunile gasite in Main sub-routine selecteaza bank-ul 1 al memoriei (BANK1) pentru a accesa registrul TRISIB, asa incat portul B sa fie declarat ca o iesire (movlw 0x00, movwf TRISIB).
Urmatorul pas este de a selecta bank-ul de memorie 0 si de plasa statusul unu-lui logic la portul B( movlw 0Xff, movwf PORTB ), si astfel programul principal este terminat. Trebuie sa facem o alta bucla unde microcontrolerul sa fie tinut ca sa nu se 'rataceasca' daca se intampla o eroare. Pentru acest scop, se face o bucla infinita unde micro-ul este retinut in timp ce sursa este conectata. Necesarul 'sfarsit' de la concluzia fiecarui program informeaza translatorul de asamblare ca nu mai sunt instructiuni in program.
Directive de control
1 #DEFINE Schimba o bucata de text pentru o
alta
Sintaxa:
#define<name> [<text ce schimba numele>]
Descriere:
De fiecare data cand apare <name> in program , va fi inlocuit cu
<text ce schimba numele>.
Exemplu:
#define turned on 1
#define turned off 0
Directive similare: #UNDEFINE, IFDEF,IFNDEF
2 INCLUDE Include un fisier aditional intr-un
program Sintaxa:
#include <file_name>
#include '
Descriere:
O aplicatie a acestei directive are efect ca si cum intregul
fisier a fost copiat intr-un loc unde directiva 'include' a fost
gasita. Daca numele fisierului este in paranteze
patrate, avem de a face cu un fisier de sistem, si daca
este in interiorul ghilimelelor de citare, avem de a face cu fisier de
utilizator. Directiva 'include' contribuie la un traseu mai bun al
programului principal.
Exemplu:
#include <regs.h>
#include 'subprog.asm'
3 CONSTANT Da o valoare numerica constanta
desemnarii textuale
Sintaxa:
Constant <name>=<value>
Descriere:
De fiecare data cand apare <name> in program, va fi inlocuit cu
<value>.
Exemplu:
Constant MAXIMUM=100
Constant Length=30
Directive similare: SET, VARIABLE
4 VARIABLE Da o valoare numerica variabila
desemnarii textuale
Sintaxa:
Variable<name>=<value>
Descriere:
Folosind aceasta directiva, desemnarea textuala se
inlocuieste cu o valoare particulara. Difera de directiva
CONSTANT in aceea ca dupa aplicarea directivei, valoarea
desemnarii textuale poate fi inlocuita.
Exemplu:
variable level=20
variable time=13
Directive similare: SET, CONSTANT
5 SET Definirea variabilei asamblorului
Sintaxa:
<name_variable>set<value>
Descriere:
Variabilei <name_variable> ii este adaugata expresia
<value>. Directiva SET este similara lui EQU, dar cu directiva SET
numele variabilei poate fi redefinit urmand o definitie.
Exemplu:
level set 0
length set 12
level set 45
Directive similare: EQU, VARIABLE
6 EQU Definind constanta asamblorului Sintaxa:
<name_constant> equ <value>
Descriere:
To the name of a constant <name_constant> is added value <value>
Exemplu:
five equ 5
six equ 6
seven equ 7
Instructiuni similare: SET 7 ORG Defineste o adresa de unde programul este
inmagazinat in memoria microcontrolerului Sintaxa:
<label>org<value>
Descriere:
Aceasta este cea mai frecvent folosita directiva. Cu ajutorul acestei
directive definim unde o anumita parte a programului va fi in memoria
program.
Exemplu:
Start org 000
movlw
movwf
Primele doua instructiuni ce urmeaza dupa prima
directiva 'org' sunt memorate de la adresa 00, si celelalte doua
de la adresa 10.
8 END Sfarsit de program
Sintaxa:
end
Descriere:
La sfarsitul fiecarui program este necesar de a plasa directiva
'end' asa ca translatorul de asamblare sa stie ca numai
sunt instructiuni in program.
Exemplu:
.
.
movlw 0xFF
movwf PORTB
end
Instructiuni conditionale
9 IF Ramificare de program conditionala
Sintaxa:
if<conditional_term>
Descriere:
Daca conditia in <conditional_term> este
indeplinita, parte a programului ce urmeaza directivei IF va fi
executata. Si daca nu este, partea ce urmeaza directivei
ELSE sau ENDIF va fi executata.
Exemplu:
if nivo=100
goto PUNI
else
goto PRAZNI
endif
Directive similare: #ELSE, ENDIF
10 ELSE 'IF' alternativa la blocul program cu
termeni conditionali
Sintaxa:
Else
Descriere:
Folosit cu directiva IF ca o alterntiva daca termenul
conditional este incorect.
Exemplu:
If time< 50
goto SPEED UP
else goto SLOW DOWN
endif
Instructiuni similare:
ENDIF, IF
11 ENDIF Sfarsitul sectiunii de program
conditionale Sintaxa:
endif
Descriere:
Directiva este scrisa la sfarsitul blocului conditional pentru
translatorul de asamblare pentru a sti ca este sfarsitul
blocului conditional
Exemplu:
If level=100
goto LOADS
else
goto UNLOADS
endif
Directive similare: ELSE, IF 12 WHILE Executia sectiunii programului cat timp
conditia este indeplinita Sintaxa:
while<condition>
.
endw
Descriere:
Liniile de program intre WHILE sI ENDW vor fi execuate cat timp
conditia este indeplinita. Daca conditia se opreste
din a mai fi valida, programul continua executarea
instructiunilor urmand linia ENDW. Numarul de instructiuni
dintre WHILE si ENDW poate fi cel mult 100, si numarul de
executii 256.
Exemplu:
While i<10
i=i+1
endw
13 ENDW Sfarsitul partii conditionale
a programului
Sintaxa:
endw
Descriere:
Instuctiunea este scrisa la sfarsitul blocului WHILE
conditional, asa ca translatorul de asamblare sa stie
ca este sfarsitul blocului conditional
Exemplu:
while i<10
i=i+1
endw
Directive similare: WHILE
14 IFDEF Executia unei parti de program
daca simbolul este definit
Sintaxa:
ifdef<designation>
Descriere:
Daca desemnarea <designation> este definita anterior (cel mai
adesea prin instructiunea#DEFINE), instructiunile ce urmeaza
sunt executate pana ce nu se ajunge la directivele ELSE si ENDIF.
Exemplu:
#define test
.
ifdef test ;how the test is defined
; instructions from these lines will execute
endif
Directive similare: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE
15 IFNDEF Executia unei parti de program
daca simbolul este definit
Sintaxa:
ifndef<designation>
Descriere:
Daca desemnarea <designation> nu a fost definita anterior, sau
daca definitia ei a fost stearsa cu directiva directive
#UNDEFINE, instructiunile ce urmeaza sunt executate pana ce nu
se ajunge la directivele ELSE si ENDIF.
Exemplu:
#define test
.
#undefine test
.
ifndef test ;how the test is undefined
.. .; instructions from these lines will execute
endif
Directive similare: #DEFINE, ELSE, ENDIF, IFDEF, #UNDEFINE
Directive de Date
16 CBLOCK Definind un bloc pentru constantele numite
Sintaxa:
Cblock [<term>]
<label>[:<increment>],
<label>[:<increment>]
endc
Descriere:
Directiva este folosita pentru a da valori constantelor numite. Fiecare
termen ce urmeaza primeste o valoare mai mare cu unu decat
precursorul lui. Daca parametrul <increment> este de asemenea dat,
atunci valoarea data in parametrul <increment> este
adaugata constantei urmatoare. Valoarea parametrului
<term> este valoarea de pornire. Daca nu este data, este
considerata a fi zero.
Exemplu:
Cblock 0x02
First, second, third ;first=0x02, second=0x03, third=0x04
endc
cblock 0x02
first : 4, second : 2, third ;first=0x06, second=0x08, third=0x09
endc
Directive similare: ENDC
17 ENDC Sfarsitul definitiei blocului constante
Sintaxa:
endc
Descriere:
Directiva este folosita la sfarsitul definitiei unui bloc de
constante ca translatorul de asamblare sa stie ca nu mai sunt
constante.
Directive similare: CBLOCK
18 DB
Definind date de un byte
Sintaxa:
[<term>]db <term> [, <term>,..,<term>]
Descriere:
Directiva rezerva un byte in memoria de program. Cand sunt mai multi
termeni ce au nevoie sa li se desemneze un byte de fiecare, ei vor
fi desemnati unul dupa altul.
Exemplu:
db 't', 00f, 'e', 's', 012
Instructiuni similare: DE, DT
19 DE Definind Byte-ul de memorie EEPROM
Sintaxa:
[<term>] de <term> [, <term>,.., <term>]
Descriere:
Directiva este folosita pentru definirea byte-ului de memorie EEPROM.
Chiar daca a fost initial intentionata doar pentru memoria
EEPROM, poate fi folosita pentru oricare alta locatie de
memorie.
Exemplu:
org H'2100'
de 'Version 1.0' , 0
Instructiuni similare: DB, DT
20 DT Definin tabelul de date
Sintaxa:
[<term>] dt <term> [, <term>,, <term>]
Descriere:
Directiva genereaza seria RETLW de instructiuni, o instructiune
de fiecare termen.
Exemplu:
dt 'Message', 0
dt first, second, third
Directive similare: DB, DE
Configurand o directiva
21 _CONFIG Setarea the bitilor configurationali
Sintaxa:
-config<term> or__config<address>,<term>
Descriere:
Sunt definite oscilatorul, aplicatia timer watchdog si circuitul
intern de reset. Inainte de folosirea acestei directive, procesorul trebuie
definit folosind directiva PROCESSOR.
Exemplu:
_CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
Directive similare: _IDLOCS, PROCESSOR
22 PROCESSOR Definind modeul microcontrolerului Sintaxa:
Processor <microcontroller_type>
Descriere:
Instructiunea seteaza tipul microcontrolerului unde programarea este
facuta.
Exemplu:
processor 16F84
Fisiere create ca rezultat al translarii programului
Ca un rezultat al procesului translarii unui program scris in limbaj de asamblare obtinem fisiere ca:
Fisier de executare (Program_Name.HEX)
Fisier de erori program (Program_Name.ERR)
Fisier lista (Program_Name.LST)
Primul fisier contine programul
translat ce este citit in microcontroler prin programareare. Continutul
lui nu poate da orice informatie programatorului, asa ca nu ne
vom mai referi la ele in continuare.
Al doilea fisier contine posibile erorile ce au fost facute in
procesul scrierii, si ca au fost observate de translatorul de asamblare in
timpul procesului de translare. Erorile pot fi descoperite de asemenea intr-un
fisier 'lista'. Acest fisier este mai potrivit
desi cand programul este mare si vederea fisierului
'lista' dureaza mai mult.
Al treilea fisier este cel mai folositor programatorului. In el sunt
continute multe informatii, ca informatii despre
instructiunile de pozitionare si variabilele din memorie, sau
semnalizarea erorii.
Exemplu unui fisier 'lista' pentru program urmeaza in acest capitol. In capatul fiecarei pagini se gasesc informatii despre numele fisierului, data cand a fost translat si numarul paginii. Prima coloana contine o adresa din memoria programului unde este plasata o instructiune din acel rand. A doua coloana contine o valoare a oricarei variabile definita de una din directive: SET, EQU, VARIABLE, CONSTANT or CBLOCK. A treia coloana este rezervata pentru forma unei instructiuni translate pe care PIC-ul o executa. A patra coloana contine instructiunile asamblorului si comentariile programatorului. Posibile erori vor apare intre randuri urmand o linie in care s-a produs eroarea.
La sfarsitul fisierului 'lista' este un tabel cu
simboluri folosite in program. Un element folositor al fisierului
'lista' este un grafic de utilizare a memoriei. La sfarsit de tot, este o statistica de erori ca si cantitatea
de program ramasa.
Macro-uri
Macros-urile sunt elemente foarte folositoare in limbajul de asamblare. Ei ar putea fi pe scurt descrisi ca 'grup definit al utilizatorului de instructiuni ce vor intra in programul de asamblare unde a fost apelat macro-ul'. Este posibil de a scrie un program chiar fara folosirea macro-urilor. Dar cu folosirea lor programul scris este mult mai usor de inteles, in special daca mai multi programatori lucreaza la acelasi program. Macro-urile au acelasi scop ca functii ale limbajelor de programare complexe.
Cum sa le scriem:
<label> macro
[<argument1>,<argument2>,<argumentN>]
..
.
endm
Din modul in care sunt scrise, vedem ca macro-urile pot accepta argumente, ceea ce este foarte folositor in programare. Cand apare argumentul in corpul macro-ului, va fi inlocuit cu valoarea <argumentN>.
Exemplu:
Exemplu de mai sus arata un macro a carui scop este de a inlocui la portul B argumentul ARG1 ce a fost definit in timp ce a fost apelat macro-ul. Folosirea lui in program ar fi limitata la scrierea unei linii: ON_PORTB 0xFF , si astfel am plasa valoarea 0xFF la PORTB. Pentru a folosi un macro in program, este necesar de a include fisierul macro in programul principal cu instructiunea include 'macro_name.inc'. Continutul unui program este copiat automat intr-un loc unde instructiunea este scrisa. Aceasta poate fi cel mai bine vazut intr-un fisier lista anteriror unde fisierul cu macro-uri este copiat mai jos de linia #include'bank.inc'.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 492
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved