Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AeronauticaComunicatiiElectronica electricitateMerceologieTehnica mecanica


Programare in Limbaj de Asamblare

Electronica electricitate



+ Font mai mare | - Font mai mic



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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 492
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved