Este programa muestra como es posible realizar más de una subrutina en MPLAB, en este caso se van a crear dos subrutinas.
Para la realización de este programa, se ha utilizado el microcontrolador PIC16F526, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC16F526.
El programa es el siguiente:
;**********************************************************************
; AqueronteBlog@gmail.com *
; *
; Este archivo es propiedad intelectual del blog Aqueronte, *
; cuya dirección web, es la siguiente: *
; *
; http://unbarquero.blogspot.com/ *
; *
; Se permite cualquier modificación del archivo siempre y cuando *
; se mantenga la autoría del autor. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ejemplo10.asm *
; Date: 22-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F526.INC *
; *
;**********************************************************************
; *
; Notes: Como hacer una subrutina. *
; *
;**********************************************************************
list p=16F526 ; Directiva para definir el procesador
#include < p16F526.inc > ; Registros especificas del procesador
__CONFIG _MCLRE_ON & _CP_OFF & _CPDF_OFF & _WDTE_OFF & _IOSCFS_4MHz & _IntRC_OSC_RB4
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _CPDF_OFF: Protección del código Memoria Flash de Datos DESACTIVADO.
; _WDTE_OFF: Watchdog DESACTIVADO.
; _IOSCFS_4MHz: Oscilador interno de 4MHz.
; _IntRC_OSC_RB4: Oscilador interno de: Pin RB4 E/S.
;***** DEFINICIÓN DE VARIABLES
CBLOCK 0x10
Numero
ENDC
;**********************************************************************
ORG 0x07FF ; Valor del oscilador interno
; El valor del oscilador interno se localiza en la dirección 0xFF
; como una instrucción movlw k, donde k es el valor de configuración del oscilador.
ORG 0x0000 ; Inicio de código
banksel OSCCAL ; Selecciona el banco correcto para el registro OSCCAL
movwf OSCCAL ; Actualiza el valor del oscilador interno a 4MHz
movlw b'11011111'
OPTION ; Transición del TMR0 interna
bcf CM1CON0,C1ON ; Comparador OFF
bcf CM2CON0,C2ON ; Comparador OFF
movlw b'00111110'
andwf ADCON0,F ; ADC OFF
clrf PORTB
clrf PORTC
movlw b'00000001'
TRIS PORTB ; Pin RB0 entrada, el resto salida.
movwf Numero ; Inicializa Numero = 1
clrw
TRIS PORTC ; Puerto C salida
bcf STATUS,C ; Flag C = 0
Inicio
movf Numero,W ; W = Numero
movwf PORTC ; PORTC = W
call Multiplica ; Subrutina Multiplica
btfss PORTB,0 ; ¿RB0 = 1?
goto Inicio ; NO -> Vuelve a Inicio
call Limpia_Variable ; LLama a la subrutina de nombre Limpia_Variable
goto Inicio
;**********************************************************************
; *
; Subrutina: Multiplica *
; *
;**********************************************************************
; *
; Date: 22-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Multiplica por dos el contenido de la variable Numero. *
; *
; Datos de Entrada: *
; · Numero *
; *
; Datos de Salida: *
; · Numero *
; *
;**********************************************************************
Multiplica
rlf Numero,F
retlw 0 ; Fin de la subrutina: W = 0
;**********************************************************************
; *
; Subrutina: Limpia_Variable *
; *
;**********************************************************************
; *
; Date: 22-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Inicializa el contenido de la variable Numero = 1. *
; *
; Datos de Entrada: *
; · Numero *
; *
; Datos de Salida: *
; · Numero *
; *
;**********************************************************************
Limpia_Variable
movlw b'00000001'
movwf Numero ; Inicializa Numero = 1
retlw 0 ; Fin de la subrutina: W = 0
END ; directiva 'fin de programa'
Para la realización de este programa, se ha empleado una variable definida en memoria RAM. Para ello, se ha empleado la instrucción:cblock---endc
Dicha variable es Numero y albergará el resultado de multiplicar su contenido por dos .
El propósito de este programa es poder mostrar lo sencillo que es realizar más de una subrutina en MPASM.
El programa consiste en sacar por el puerto C el valor del contenido de la variable Numero, una subrutina llamada Multiplicar se encargará de ir multiplicando el contenido de Numero por dos hasta que se el pin RB0 del puerto B esté a '1'.
En dicho caso, se pasará a otra subrutina llamada Limpia_Variable que se encarga de inicializar la variable Numero a 1.
Para ver el resultado, compilamos el código y seleccionamos el MPLAB SIM para poder simularlo.
Abrimos la ventana de Watch y seleccionamos en la categoría de Symbol la variable definida como Numero, y el la categoría de SFR, los registros WREG, PORTB y PORTC.
Simulamos el código paso a paso.
Se puede apreciar, que mientras el pin RB0 esté a '0', el programa salta a la subrutina llamada Multiplica para multiplicar el contenido de la variable Numero por dos y posteriormente sacar dicho resultado por el puerto C.
Una vez esté a '1' el pin del puerto B, RB0, el programa irá a la subrutina denominada Limpia_Variable para inicializar la variable Numero a 1, y vuelta a empezar.
Se puede observar en el siguiente vídeo todo lo explicado anteriormente:
Este proyecto se puede descargar en la siguiente dirección:
Ejemplo 10. | ||
Ejemplo 10. |
0 comentarios:
Publicar un comentario