Escrito originalmente por hernando2999
BUENA NOCHE O DIA
Codigo:
PAG_00 MACRO
CLRF PCLATH
ENDM
PAG_500 MACRO
CLRF PCLATH
BSF PCLATH,0
BSF PCLATH,3
ENDM
LLAMAR MACRO PAG_TOY,LLAMADA1,PAG_VOY
CALL PAG_VOY
CALL LLAMADA1
CALL PAG_TOY
ENDM
******************************
EJEM:
LLAMAR PAG_00,DELAY_1S,PAG_500
AQUI LE ESTOY QUERIENDO DECIR QUE ESTOY EN LA PAG 0 Y VA A IR A LA PAG S00 EN DONDE SE ENCUENTRA UNA RUTINA PARA UNA TEMPORIZACION DE 1SEGUNDO
A ver amigo , te has hecho menudo lío
Tus macros se llaman PAG_VOY y PAG_TOY que son ni mas ni menos que un par de instrucciones. Un macro "reemplaza" el texto del macro, por el código contenido en el macro. Un macro no es una subrutina. A un macro no se lo llama con un "call" , salvo que el macro sea una subrutina! Encima si tu macro es una subrutina que se llama con CALL, cada vez que pongas el código en el programa estarás "pegando" el mismo texto siempre! entonces te dará error, para subsanar esto (si es necesario que un macro se use muchas veces) lo que se hace es pasarle parámetros de concatenacion de texto #v al macro para que la subrutina no se llamen igual todas las veces.
Entonces, cuando tu haces
Codigo:
LLAMAR PAG_00,DELAY_1S,PAG_500
El compilador de assembly hará el siguiente reemplazo.
Codigo:
CALL clrf PCLATH ;Reemplazo de CALL PAG_500
BSF PCLATH,0
BSF PCLATH,3
CALL DELAY_1S ;2do parámetro del macro LLAMAR
CALL clrf PCLATH ;que es CALL PAG_00
Lo cual por supuesto es un error, como te habras dado cuenta, porque estas haciendo un call de una instruccion! lo cual es un completo desastre. jeje.
Lo que tu quieres hacer se hace así
Codigo:
LLAMAR macro LLAMADA1
PAG_VOY
CALL LLAMADA1
PAG_TOY
endm
Cuando lo llames hazlo de esta forma
Codigo:
LLAMAR DELAY_1S
El compilador reemplazará el código quedando de esta forma.
Codigo:
CLRF PCLATH ;PAG_VOY
BSF PCLATH,0
BSF PCLATH,3
CALL DELAY_1S
CLRF PCLATH ;PAG_TOY
Con respecto a otra pregunta... sobre los macros. MPASM si permite los macros anidados, se puede llamar un macro desde otro macro.
Saludos