Está en la página 1de 19

; CONFIG1

; __config 0xC9E4
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF &
_PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF
& _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF

; CONFIG2
; __config 0xDCFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF
& _BORV_LO & _LVP_OFF

CBLOCK 0X20
AD_H ; AD H
AD_L ; AD L
VAR_TEMP
COUNT
; VARIABLES FOR MULTIPLICACION
P3B ; PRUDUCT MSB
P2B
P1B
M2B ; MULTIPLICADOR MSB
M1B
M_DR ; MULTIPICADOR
M_COUNTER; CONTADOR

DUTY_H ; PWM DUTY DE 0 A 400


DUTY_L
ENDC

ORG 0
GOTO MAIN ; INCIO DEL PROGRAMA
MAIN
BANKSEL OSCCON
MOVLW 0X70 ;OSC DE 8MHZ
MOVWF OSCCON
BANKSEL PORTA
CLRF PORTA ;LIMPIAMOS LATCH
BANKSEL LATA
CLRF LATA
CLRF ANSELA ;TODO DE DIGITAL
BSF ANSELA,ANSA4 ;RA4 COMO ANALOG
;**********************ENTRAS Y SALIDAS**************
BANKSEL TRISA
MOVLW B'00111010'
MOVWF TRISA
BANKSEL ADCON1
MOVLW B'10010000' ;VREF, JUSTF DERECHA
MOVWF ADCON1
MOVLW B'00001101' ;CHANNEL 3
MOVWF ADCON0

BANKSEL SPBRGH ;
;* 9600 BAUD, SYNC =0 BRGH = 0 BRG16=0 RST*****
MOVLW .12 ; BR = FOSC7[64(N+1)] n = 12
MOVWF SPBRGL
BSF RCSTA,SPEN ;el bit SPEN del registro RCSTA
BSF TXSTA,TXEN ; ENABLE TX pag 295
BSF RCSTA,CREN ; ENABLE RX pag 294

; PWM F = 20kHz DUTY 0 400


BANKSEL PR2
MOVLW .99 ; Fw = 20 KHz
MOVWF PR2

BANKSEL CCP1CON
MOVLW B'00001100' ; INICIA PWM
MOVWF CCP1CON
MOVLW B'00110010' ; INICIA DUTY MOVWF
CCPR1L

BANKSEL T2CON
BSF T2CON,TMR2ON ;INICIA EL TIMER 2
LEER_AD
BANKSEL ADCON0
BSF ADCON0,GO ;INICIA A/D
NOP
NOP
ESPERA BTFSCADCON0,GO ;ESPERA TERMINAR LA CONVERSION
GOTO ESPERA
MOVF ADRESH,W ; REGISTRO H AL ACUMULADOR
BANKSEL PORTA
MOVWF AD_H ;A LA DIRECCION AD_H
BANKSEL ADCON0
MOVF ADRESL,W ; REGISTRO L A W
BANKSEL PORTA
MOVWF AD_L ; GUARDADO EN AD_L
;*****************PARA VALORES HEX******************

MOVF AD_H,W ;MUESTRA DE MSB EN 2 HEX


DIGITOS
CALL DISP_HEX
MOVF AD_L,W ; MUESTRA THE LSB
CALL DISP_HEX
CALL SEND_CRLF ; NEW LINEA

; DUTY = 0.391 X AD = 100*AD/256


MOVF AD_H,W ; AD_VALUE A MULTIPLICAR
MOVWF M2B
MOVF AD_L,W
MOVWF M1B
MOVLW .100
MOVWF M_DR ;100 AL MULT
CALL UMUL_16X8 ; DUTY EN P3B:P2B
MOVF P3B,W
MOVWF DUTY_H
MOVF P2B,W
MOVWF DUTY_L

BANKSEL CCP1CON
MOVLW B'11001111';
ANDWF CCP1CON,F
;
BANKSEL 0
LSRF DUTY_H,F
RRF DUTY_L,F
BTFSS STATUS,C
GOTO D1
BANKSEL CCP1CON
BSF CCP1CON,4
D1
BANKSEL 0
LSRF DUTY_H,F
RRF DUTY_L,F
BTFSS STATUS,C
GOTO D2
BANKSEL CCP1CON
BSF CCP1CON,5
D2
BANKSEL 0
MOVF DUTY_L,W
BANKSEL CCPR1L
MOVWF CCPR1L
BANKSEL 0
RETURN

INT2HEX ; CONVERTIR EN HEX


ADDWF PCL,F
DT "0123456789ABCDEF" ; DIRECTIVA DE RET

DISP_HEX ; DISPLAY A BYTE (W) IN HEX FORMAT


MOVWF VAR_TEMP
SWAPF VAR_TEMP,W ;OBTIENE EL NIBBLE
ANDLW 0x0F ;OPERACION AND CON 0XOF
CALL INT2HEX ;CONVIERTE A HEX
CALL TX ; ENVIA EN HHEX
MOVF VAR_TEMP,W ; OBTIENE EL NIBLE BAJO Y ENVIA
ANDLW 0x0F ; OPERACION AND CON 0XOF
CALL INT2HEX ;LLAMA A INT HEX
CALL TX_ ;ENVIA EL DATO
RETURN
SEND_CRLF
movlw 0x0D ; CR ;ENVIA 0X0D PARA ENTER
CALL TX ;ENVIA EL DATO
MOVLW 0X0A ; LF ; COMANDO PARA LIMPIAR
CALL TX ;ENVIA DATO
RETURN
TX ; TX EN PIN 7
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;SI NO HAY REGRESA Y SI HAY ENVIA
GOTO $-1
MOVWF TXREG
BANKSEL PORTA
RETURN
UMUL_16X8 ; MULTIPLICACION DE 2 BYTES X 1 BYTE MM MM . NN =
PP PP PP

BANKSEL 0
CLRF P3B ; CLEAR PRODUCT
CLRF P2B
CLRF P1B
MOVLW .8
MOVWF M_COUNTER
LUM_01 ASRF M_DR ; b0 AL ACARRERO
BTFSS STATUS,C
GOTO SHIF_PRODUCT ; CARRY = 0
MOVF M1B,W ; P1B = P1B + M1_B
ADDWF P2B,F
MOVF M2B,W
ADDWFC P3B,F
SHIF_PRODUCT ; DESPLAZA PARA ESCRIBIR
LSRF P3B,F ; 0 > P3B > C
RRF P2B,F
RRF P1B,F
DECFSZ M_COUNTER,F ; TODO BIEN
GOTO LUM_01
RETURN
END
#include "p12f1822.inc"

; CONFIG1

; __config 0xFE4

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF
& _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF

; CONFIG2

; __config 0x3EFF

__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LVP_ON

#define Led PORTA, 1

cblock 20h ;Iniciamos el bloque de data

CONTA_1 ;CONTA_1 en 0X20

CONTA_2 ;CONTA_2 en 0X21

endc ;Variables ya declaradas

ORG 0 ;Iniciar el programa en el registro 0x00

GOTO INICIO ;Va al Inicio

;**************SUBRUTINA DE INTERRUPCIÓN***********************************

ORG 0004 ;Iniciamos el bloque de interrupciones

BTFSS INTCON,INTF ;Consultamos si hay flanco de subida

RETFIE ;Si no haya Sale de INT

GOTO VERIFICA ;Si hay se va a verificar el dato

VERIFICA

BANKSEL PORTA ;Inicia Banco PORTA

CALL DELAY ;subrutina de 10ms de tiempo

BTFSC PORTA,1 ;Testea si el led esta apagado

GOTO LED_OFF ;Si lo esta va a la rutina de apagar led

GOTO LED_ON ;Si no va la rutina para encender el led

LED_ON

CALL DELAY ;subrutina de 10ms de tiempo

BANKSEL PORTA ;Inicia Banco PORTA


BSF PORTA,1 ;Setea el puerto A1 a ON

BCF INTCON,INTF ;Limpia la Bandera

RETFIE ;Sale de la INT

LED_OFF

BANKSEL PORTA ;Inicia Banco PORTA

BTFSS PORTA,1 ;Veridica si el led esta enecndido

RETFIE ;Si no lo esta sale de INT

CALL DELAY ;Si esta ON va Subrutina de 10ms de tiempo

BCF PORTA,1 ;Y apaga el led

BCF INTCON,INTF ;Limpia la Bandera

RETFIE ;Sale de INT

;*************RUTINA DE INICIO*********************************************

INICIO

BANKSEL PORTA ;Iniciamos el banco Puerto A

CLRF PORTA ;Seteamos el Puerto A

BANKSEL LATA ;Inciamos el Banco LATA

CLRF LATA ;Seteamos los Latches

BANKSEL ANSELA ;Iniciamos el banco ANSELA

CLRF ANSELA ;Todas las Salidas Digitales

BANKSEL TRISA ;Iniciamos el Banco TRISA

MOVLW b'00000100' ;Set RA<5:0> como Salida y RA2 como entrada

MOVWF TRISA ;Configuramos EL banco TRISA

BANKSEL OPTION_REG ;Iniciamos el Banco TRISA

MOVLW b'11000000' ;Set como flanco de subida en INT

MOVWF OPTION_REG ;Configuramos EL banco OPTION_REG

BANKSEL INTCON ;Iniciamos el Banco INTCON

MOVLW b'10010000' ;Activa la INT externa

MOVWF INTCON ;Configuramos EL banco INTCON

LOOP
NOP ;No opera

GOTO LOOP ;Va al Loop

;***************SUBRUTINA DELAY DE RETARDO ********************************

DELAY

MOVLW d'10' ; W -> m

MOVWF CONTA_2 ; CONTA_2 -> W

MOVLW d'250' ; W -> n

MOVWF CONTA_1 ;CONTA_1-> W

NOP ;no opera

DECFSZ CONTA_1,F ;CONTA_1CONTA_1-1 y salta si llego a 0

GOTO $-.2 ;NO es 0, entonces salta al nop

DECFSZ CONTA_2,F ;SI es 0, entonces CONTA_2CONTA_2 -1 y salta si llega a 0

GOTO $-.6 ;No es 0, entonces regresa a cargar conta_1

RETURN

END
list p= 12f1822
#include "p12f1822.inc"
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON &
_CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF

CBLOCK 0X20
M1A
M1B
M2A
M2B
M3A
M3B
S3
DUTY_1
DUTY_2
HEX1
HEX2
HEX3
AUX_S3 ;VARIABLE TEMPORAL DE S3 PARA TX
ENDC
;inicializamos el registro de origen
ORG 0

; SELECIONADO LA FOSC A 8 MHZ


BANKSEL OSCCON
MOVLW 0X70
MOVWF OSCCON

; CLEAR PORTA & LATCHA


BANKSEL PORTA
CLRF PORTA
BANKSEL LATA
CLRF LATA

; AN4, PIN-3 IS ANALOG INPUTS, ALL OTHER PINS ARE DIGITAL I/O
BANKSEL ANSELA
CLRF ANSELA ; ANSELA = 00
BSF ANSELA,ANSA4 ; PIN_3 AN3 IS ANALOG INPUT V_POT

BANKSEL TRISA
MOVLW B'00111010'
MOVWF TRISA
;ENABLE INTERNAL PUL_UP FOR RA5 PIN_5 TO READ SWITH
BANKSEL WPUA
CLRF WPUA ; NO PULL UPP
BSF WPUA,WPUA5 ; SET PULL_UP FOR RA4-PIN2
BANKSEL OPTION_REG ; ENBLE PULL-UPS
BCF OPTION_REG,NOT_WPUEN

; INIT A/D TO WORK WITH INTERNAL CLOCK


BANKSEL ADCON1
MOVLW B'10010000' ; AD RIGHT JUSTIFIED, VREF = VDD COV_CLK 1uS.
MOVWF ADCON1
MOVLW B'00001101' ; AD ON AND SELECT CHANEEL AN3
MOVWF ADCON0

; PWM INIT Fw = 20kHz DUTY {0 400}


BANKSEL PR2
MOVLW .99 ; Fw = 20 KHz
MOVWF PR2

BANKSEL CCP1CON
MOVLW B'00001100' ; SET PWM WHIT P1 OUT
MOVWF CCP1CON
MOVLW B'00000010' ; SET DUTY TO .200 1100 1000 C8h > 50%
MOVWF CCPR1L

;INIT UART A 9600 8BIT 1 STOP


BANKSEL SPBRGH ; SELECT BANK3 FOR THE UART REG.
CLRF SPBRGH ; 9600 BAUD, SYNC =0 BRGH = 0 BRG16=0 RST VALUES
MOVLW .12 ; BR = FOSC7[64(N+1)] n = 12 DECIMAL
MOVWF SPBRGL
BSF RCSTA,SPEN ; ENABLE SERIAL PORT
BSF TXSTA,TXEN ; ENABLE TX PART
BSF RCSTA,CREN ; ENABLE RX PART

BANKSEL T2CON
BSF T2CON,TMR2ON ; HABILITAMOS timer 2

BANKSEL 0
CLRF M1A
CLRF M1B
CLRF M2A
CLRF M2B
CLRF M3A
CLRF M3B
CLRF S3
BCF STATUS,C
;-----------------------------------------------------------------------
REPETIR
CALL ADC_LECTURA
CALL ADC_MULT
CALL PWM_OUT

MOVLW 'N'
CALL TX_ENVIAR
MOVLW '='
CALL TX_ENVIAR
CALL TX_ADC_OUT ;ENVIO HEX ADC
MOVLW ''
CALL TX_ENVIAR
MOVLW 'D'
CALL TX_ENVIAR
MOVLW '='
CALL TX_ENVIAR
CALL TX_DUTY_OUT ;ENVIO HEX DUTY
CALL TX_SALTO_LINEA

GOTO REPETIR

ADC_LECTURA ; BUCLE PRINCIPAL DE LA LECTURA DEL ADC


READ_AD
BANKSEL ADCON0
BSF ADCON0,GO ;INICIAMOS ADC
NOP
NOP
AD_WAIT BTFSC ADCON0,GO ;TIEMPO DE ESPERA PARA LA CONVERSION
GOTO AD_WAIT

RETURN

ADC_MULT ; ACONDICIONA Y MULTIPLICA ADC OUT(0 - 400)


;DEL REGISTRO DEL ADC MOVEMOS A LA MEMORIA A GUARDAR
BANKSEL ADRESL
MOVF ADRESL,0
;MOVLW B'00011111'
BANKSEL 0
MOVWF M3A ;CARGAMOS EL REGISTRO COMPLETO
BANKSEL ADRESH
MOVF ADRESH,0
;MOVLW B'00000011'
BANKSEL 0
MOVWF M3B
MOVLW B'00000011' ;PARA PASAR SOLO LOS DOS PRIMEROS BITS AND
ANDWFM3B,1 ; ASTA AQUI GRABAMOS EL VALOR DEL ADC EN CADA BYTE
;HACEMOS SHIF (2) A LA IZQUIERDA LOS 2 BYTES M3 EN ORDEN
BCF STATUS,C
RLF M3A,1 ;SHIF IZQUIERDA Y GUARDAMOS EN M3A
RLF M3B,1 ;SHIF OTRO BYTE Y LO COMPLEMENTAMOS CON EL
BCF STATUS,C
RLF M3A,1
RLF M3B,1
;COPIAMOS M3 A LOS DEMAS REGISTROS
MOVF M3A,0
MOVWF M2A
MOVWF M1A
MOVF M3B,0 ;CARGAMOS AL OTRO DIGITO
MOVWF M2B
MOVWF M1B
;HACEMOS M1 SHIF (4) A LA IZQUIERDA
BCF STATUS,C
RLF M1A,1 ;SHIF IZQUIERDA Y GUARDAMOS EN M1A
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
BCF STATUS,C
RLF M1A,1
RLF M1B,1
;HACEMOS M2 SHIF (3) A LA IZQUIERDA
BCF STATUS,C
RLF M2A,1
RLF M2B,1
BCF STATUS,C
RLF M2A,1
RLF M2B,1
BCF STATUS,C
RLF M2A,1
RLF M2B,1
;TERMINAMOS EL SHIF AHORA SOLO TENEMOS QUE SUMAR M1 + M2 + M3
MOVF M2A,0
ADDWF M3A,1 ;SUMAMOS LOS 2 PRIMEROS Y LO GUARDAMOS EN M3A

MOVF M2B,0
ADDWFC M3B,1 ;RESULTADO EN M3B

MOVLW .0
ADDWFC S3,1 ;AQUI SUMAMOS EL ULTIMO DIGITO CON EL CARRIE
;AHORA SUMAMOS EL RESULTADO CON EL M1
BCF STATUS,C
MOVF M1A,0
ADDWF M3A,1 ;RESULTADO FINAL DEL PRIMER BYTE (SE DESCARTA)

MOVF M1B,0
ADDWFC M3B,1 ;RESULTADO FINAL SEGUNDO BYTE EN M3B

MOVLW .0
ADDWFC S3,1 ;RESULTADO FINAL TERCER BYTE S3
;RESULTADO ES( S3(2BITS) M3B(8BITS)) = (MSB LSB)
MOVF S3,0
MOVWF AUX_S3 ;GUARDAMOS VARIABLE TEMPORAL PARA TX

RETURN

PWM_OUT
BANKSEL 0
MOVF M3B,0 ;LLEVO EL PRIMER BYTE AL ACUMULADOR
MOVWF DUTY_2 ; asignamos el ancho depulso

BCF STATUS,C ;AQUI CORREMOS(2) DERECHA Y S3 PASA A CCPR1L POR EL CARRIE


RRF S3,1
RRF DUTY_2,1

BCF STATUS,C
RRF S3,1
RRF DUTY_2,1
BCF STATUS,C
;PASAMOS LOS LSB DE M3B A EL REG CCP1CON
BANKSEL 0
BTFSS M3B,0
GOTO NEX1
BANKSEL CCP1CON
BSF CCP1CON,4
GOTO NEX2
NEX1
BANKSEL CCP1CON
BCF CCP1CON,4
NEX2 ;PASAMOS EL OTRO BIT AL REGISTRO MENOS SIGNIFICATIVO
BANKSEL 0
BTFSS M3B,1
GOTO NEX11
BANKSEL CCP1CON
BSF CCP1CON,5
GOTO NEX22
NEX11
BANKSEL CCP1CON
BCF CCP1CON,5
NEX22
;TERMINAMOS DE COLOCAR TODO EL REGISTRO DUTY
;HABILITAMOS LA BANDERA DE ENVIO
BANKSEL 0
MOVF DUTY_2,0
BANKSEL CCPR1L
MOVWF CCPR1L ;CARGO DUTY MAS SIGNIFICATIVO
RETURN

TX_ENVIAR ;SUBRUTINA ENVIAR BYTE


BANKSEL TXSTA
BTFSS TXSTA,TRMT ;bit test high
GOTO $-1
MOVWF TXREG
BANKSEL PORTA
RETURN ;RETORNA DE LA SUBRRUTINA
TX_SALTO_LINEA
BANKSEL 0
MOVLW .13
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;bit test high
GOTO $-1
MOVWF TXREG
BANKSEL PORTA
RETURN

TX_ADC_OUT
CALL TX_SEPARADOR_ADC
CALL TX_CONVERSOR_HEX

RETURN
TX_DUTY_OUT
CALL TX_SEPARADOR_DUTY
CALL TX_CONVERSOR_HEX

RETURN

TX_SEPARADOR_ADC
BANKSEL ADRESH
MOVF ADRESH,0
BANKSEL 0
MOVWF HEX3

BANKSEL ADRESL
MOVF ADRESL,0
BANKSEL 0
MOVWF HEX1
MOVLW B'00001111'
ANDWFHEX1,1

BANKSEL ADRESL
MOVF ADRESL,0
BANKSEL 0
MOVWF HEX2

BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
;TERMINAMOS DE UBICAR EN ORDEN LOS REGISTROS EN BCD PARA LA CONVERSION
; HEX3 HEX2 HEX1 AHORA CONVERTIR CADA UNO
RETURN

TX_SEPARADOR_DUTY
BANKSEL 0
MOVF AUX_S3,0
MOVWF HEX3

MOVF M3B,0
MOVWF HEX1
MOVLW B'00001111'
ANDWFHEX1,1

MOVF M3B,0
MOVWF HEX2
BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
BCF STATUS,C
RRF HEX2,1
; HEX3 HEX2 HEX1 AHORA CONVERTIR CADA UNO
RETURN

TX_CONVERSOR_HEX
;MOVLW .5 ;PRUEBA DE ENVIO BORRAR
;MOVWF HEX3
BANKSEL 0
BCF STATUS,C
MOVLW .246
ADDWF HEX3,0 ;SUMAMOS Y AHORA COMPROBAMOS EL DESBORDEDEL CARRIE
BTFSS STATUS,C
GOTO SUMA48
GOTO SUMA55
SUMA48
MOVLW .48
ADDWF HEX3,0 ;SUMAMOS 48 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
GOTO SALIR1
SUMA55
MOVLW .55
ADDWF HEX3,0 ;SUMAMOS 48 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
SALIR1
;SACAMOS EL SEGUNDO DIGITO
BANKSEL 0
BCF STATUS,C
MOVLW .246
ADDWF HEX2,0 ;SUMAMOS Y AHORA COMPROBAMOS EL DESBORDEDEL CARRIE
BTFSS STATUS,C
GOTO SUMA48A
GOTO SUMA55A
SUMA48A
MOVLW .48
ADDWF HEX2,0 ;SUMAMOS 48 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
GOTO SALIR2
SUMA55A
MOVLW .55
ADDWF HEX2,0 ;SUMAMOS 55 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
SALIR2
;SACAMOS EL TERCER DIGITO
BANKSEL 0
BCF STATUS,C
MOVLW .246
ADDWF HEX1,0 ;SUMAMOS Y AHORA COMPROBAMOS EL DESBORDEDEL CARRIE
BTFSS STATUS,C
GOTO SUMA48B
GOTO SUMA55B
SUMA48B
MOVLW .48
ADDWF HEX1,0 ;SUMAMOS 48 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
GOTO SALIR3
SUMA55B
MOVLW .55
ADDWF HEX1,0 ;SUMAMOS 55 + HEX3 Y LO LO GUARDAMOS EN ACUMULADOR
CALL TX_ENVIAR ;ENVIA EL ACUMULADOR CARGADO ANTERIORMENTE
SALIR3
RETURN
END

También podría gustarte