bueno gracias por la ayuda..resulta q me puse a cambiar una rutina para aplicar lo de los macro, funcionó bien con el cambio de los banco pero no con una rutina que llame BIN_A_BCD, la compilacion resulta bien, la simulacion no, y cuando lo debuggeo en el mplab al llegar a BIN_A_BCD, y me da mensaje de stack under flow, entonces no se si es un codigo muy extendido para usar macro, tambien quite la palabra macro y el endm y desde la rutina principal lo llame con un call..tampoco corre bien...hice bien?? a continuacion pongo la rutina asm y el .inc
programa principal
; programa q convierte lo q hay en portc a BCD, usando libreria.inc
LIST P=16F877A
#INCLUDE "P16F877A.INC"
#INCLUDE "libreria.inc"
CBLOCK 0X20
BCD_CENTENAS
BCD_DECENAS
BCD_UNIDADES
PDel0
PDel1
PDel2
ENDC
GOTO INICIO
INICIO BANCO1
MOVLW 0XFF
MOVWF PORTC
CLRF PORTB
CLRF PORTD
BANCO0
CLRF PORTB
CLRF PORTC
CLRF PORTD
BSF PORTD,0
BSF PORTD,1
BSF PORTD,2
CALL DEMORA
LEE ;MOVF PORTC,W
MOVLW B'11111111'
BIN_A_BCD
CLRW
MOVF BCD_CENTENAS,W
MOVWF PORTB
BCF PORTD,0 ;PRENDO DISPLAY
CALL DEMORA
BSF PORTD,0 ;APAGO DISPLAY
CLRF PORTB
CLRW
MOVF BCD_DECENAS,W
MOVWF PORTB
BCF PORTD,1
CALL DEMORA
BSF PORTD,1
CLRF PORTB
CLRW
MOVF BCD_UNIDADES,W
MOVWF PORTB
BCF PORTD,2
CALL DEMORA
BSF PORTD,2
CLRF PORTB
GOTO LEE
DEMORA movlw .21 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
lo que tengo exactamente en el archivo libreria.inc
ORG 0X00
;############ BANCOS 877 ##########
BANCO1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO0 MACRO
BCF STATUS,RP0
ENDM
;###################################
;############ BIN_A_BCD #############################################################################
; CARGAR EN W EL BINARIO A CONVERTIR, EL RESULTADO
;QUEDA EL LOS REGISTROS BCD_DECENAS, BCD_CENTENAS, BCD_UNIDADES
BIN_A_BCD MACRO
CLRF BCD_CENTENAS ; CARGA LOS REGISTROS CON EL RESULTADO INICIAL.
CLRF BCD_DECENAS ; EN PRINCIPIO LAS CENTENAS Y DECENAS A CERO.
MOVWF BCD_UNIDADES ; SE CARGA EL NÚMERO BINARIO A CONVERTIR.
BCD_RESTA10 MOVLW .10 ; A LAS UNIDADES SE LES VA RESTANDO 10 EN CADA
SUBWF BCD_UNIDADES,W ; PASADA. (W)=(BCD_UNIDADES) -10.
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_UNIDADES)>=10?
GOTO BIN_BCD_FIN ; NO, ES MENOR DE 10. SE ACABÓ.
BCD_INCREMENTADECENAS
MOVWF BCD_UNIDADES ; RECUPERA LO QUE QUEDA POR RESTAR.
INCF BCD_DECENAS,F ; INCREMENTA LAS DECENAS Y COMPRUEBA SI HA LLEGADO
MOVLW .10 ; A 10. LO HACE MEDIANTE UNA RESTA.
SUBWF BCD_DECENAS,W ; (W)=(BCD_DECENAS)-10).
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_DECENAS)>=10?
GOTO BCD_RESTA10 ; NO. VUELVE A DAR OTRA PASADA, RESTÁNDOLE 10 A
BCD_INCREMENTACENTENAS ; LAS UNIDADES.
CLRF BCD_DECENAS ; PONE A CERO LAS DECENAS
INCF BCD_CENTENAS,F ; E INCREMENTA LAS CENTENAS.
GOTO BCD_RESTA10 ; OTRA PASADA: RESTA 10 AL NÚMERO A CONVERTIR.
BIN_BCD_FIN
SWAPF BCD_DECENAS,W ; EN EL NIBBLE ALTO DE (W) TAMBIÉN LAS DECENAS.
ADDWF BCD_UNIDADES,W ; EN EL NIBBLE BAJO DE (W) LAS UNIDADES.
RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
ENDM
;######################################################################################################
otra duda q tengo es: en el hilo "rutinas para compartir" utilizan esto de los macros, y noté que dentro de ellos se pueden definir definir variables con la intruccion cblock, pero tengo entendido que cblock 0x20 guarda las variables a partir de la direccion 0x20, si tambien previamente tengo en el programa .asm la instruccion cblock 0x20 con otras variables, no hay problemas de sobreescritura?