Sari la conținut
ELFORUM - Forumul electronistilor

Macro si PIC?????


Mar

Postări Recomandate

  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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.

Link spre comentariu

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

Link spre comentariu

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.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări