Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Mar

Macro si PIC?????

Recommended Posts

Am vazut pe internet ca se pot utiliza macrouri pentru PIC . Va rog sa-mi dati si mie citeva sfaturi referitor la acest subiect ca nu stiu de unde sa incep si daca aveti un exemplu mi-ar fi foarte util. Multumesc :prayer: :prayer: :prayer: :prayer: :prayer:

Share this post


Link to post
Share on other sites

Banuiesc ca te referi la utilizarea de macro-uri in Mpasm assembler:Pornesti MPLAB IDE. Apoi Help->Topics->Language Tools->MPASM Assembler->MPASM Assembler->Macro Language

Share this post


Link to post
Share on other sites

Da despre macro linguage vorbeam, poti sa-mi dai si mie un exemplu? Cum pot sa il utilizez in programul meu? Multumesc

Share this post


Link to post
Share on other sites

Macroinstructiunea consta dintr-un numar de instructiuni aflate intre anumite 2 linii: MACRO si ENDM. In linia MACRO se precizeaza numele Macroinstructiunii si eventualii parametri. In locul in care este definita (intre MACRO si ENDM) nu se consuma memorie de program, nici macar o locatie. In timpul compilarii (asamblarii, generarii codului masina) Macroinstructiunea "se depune" cu totul, cu toata lungimea instructiunilor ce o compun in locul invocarii, al oricarei invocari. Acesta (faptul ca se mareste lungimea programului) ar fi dezavantajul fata de o subrutina, caz in care corpul subrutinei zace intr-un singur loc si invocarea se poate face din oricate locuri, cu o singura instructiune (call). Macroinstructiunile au insa avantajul ca tehnologia de apel nu utilizeaza stiva, care este destul de mica la multe controllere (PIC-uri).Exista PIC-uri care au doar 2 nivele pe stiva, altele au 8, altele au ceva mai mult - oricum sunt cazuri cand nu mai poti sa faci nici macar un call, utilizand stiva "hard", pentru motivul ca este plina. In acest caz fie se fac anumite smecherii pt a crea un fel de stiva in memoria ram fie se utilizeaza macroinstructiuni. Mai sunt si situatii (anumite programe de test memorie) in care stiva (deci nu neaparat la controllere) face parte dintr-o memorie ce inca nu a fost testata, deci nu se poate pune - inca - registrul SP (stack pointer) sa pointeze acolo. In asemenea cazuri tot macroul poate fi salvarea.

Share this post


Link to post
Share on other sites

Multumesc pentru raspuns

 

Eu, pentru a pune o valoare 03h in PORTA am scris asa:

movlw 03h

movwf PORTA

Cum scriu eu aceasta valoare utilizind macro?

eu am vazut un program cu macro care este asa:

nume macro pres

...

...

endm

dar acest pres (acest pres e un parametru) nu este definit si asta nu inteleg pentru ca eu in programul meu il definesc asa:

pres equ 0x10

Share this post


Link to post
Share on other sites

Multumesc pentru raspuns

 

Eu, pentru a pune o valoare 03h in PORTA am scris asa:

movlw 03h

movwf PORTA

Cum scriu eu aceasta valoare utilizind macro?

eu am vazut un program cu macro care este asa:

nume macro pres

...

...

endm

dar acest pres (acest pres e un parametru) nu este definit si asta nu inteleg pentru ca eu in programul meu il definesc asa:

pres equ 0x10

MACRO fara parametri

---------------------------------------

In zona de la inceputul programului, pe unde ai EQU-uri, se definesc si macrourile, ca acesta:

 

AAAA    MACRO        movlw  03h        movwf  PORTA        ENDM
In zona de program, dupa start sa spunem sau in interiorul unei subrutine, practic oriunde, va putea sa apara invocarea:

instructiuni         AAAA         instructiuni
Asta va face ca intreg corpul macroului sa se depuna (sa expandeze) in locul liniei in care este apelat (invocat). Deci in realitate va arata asa:

instructiuni         movlw  03h         movwf  PORTA         instructiuni
Oricare alta invocare va face acelasi lucru, macroul expandeaza in locul tuturor invocarilor.

 

 

MACRO cu parametri

---------------------------------------

Acuma, sa spunem ca nu vrei sa trimiti neaparat valoarea 3 la PORTA ci ceva dependent de la un "apel" la altul al macroului.

Macroul va arata asa:

 

BBBB    MACRO  UnNumeDeParametru        movlw  UnNumeDeParametru        movwf  PORTA        ENDM

Daca in program apare o invocare de forma:

instructiuni        BBBB  0x55        instructiuni

 

atunci forma expandata va fi:

instructiuni        movlw  0x55        movwf  PORTA        instructiuni

 

 

Pentru o alta invocare, cu alta valoare a parametrului, de exemplu:

instructiuni        BBBB  0xAA        instructiuni

 

forma expandata va fi:

instructiuni        movlw  0xAA        movwf  PORTA        instructiuni

 

Asa se paseaza parametrul.

Invocare macro si apel macro este totuna.

In definirea macroului trebuie sa apara un nume formal al parametrului (ales de tine, un nume sugestiv in raport cu semnificatia lui, practic orice nume) iar in linia de invocare trebuie sa apara valoarea efectiva a parametrului. Se poate si cu mai multi parametri, pur si simplu se scriu in continuare.

Vezi ca in fisierul LST toate instructiunile care provin din expandari de macrouri au un "+", dupa asta se pot recunoaste.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.