martes, 22 de julio de 2008

Baseline. ProgBasico 10.

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: