lunes, 21 de julio de 2008

Baseline. ProgBasico 8.

Este programa está orientado a la elaboración de una subrutina simple en MPASM.


Para la realización de este programa, se ha utilizado el microcontrolador PIC16F505, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC16F505.

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: Ejemplo8.asm *
; Date: 19-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F505.INC *
; *
;**********************************************************************
; *
; Notes: Como hacer una subrutina. *
; *
;**********************************************************************

list p=16F505 ; Directiva para definir el procesador
#include < p16F505.inc > ; Registros especificas del procesador

__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC_RB4EN

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC_RB4EN: Oscilador interno de 4MHz: Pin RB4 E/S.


;***** DEFINICIÓN DE VARIABLES

CBLOCK 0x08
Operador1
Operador2
Resultado
ENDC


;**********************************************************************
ORG 0x03FF ; 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
movwf OSCCAL ; Actualiza el valor del oscilador interno a 4MHz

movlw b'11011111'

OPTION ; Transición del TMR0 interna


clrf PORTB
clrf PORTC

movlw 0xFF ; Puertos B y C...
TRIS PORTC
TRIS PORTB
; ...configurados como entrada.


Inicio
movf PORTC,W
movwf Operador1 ; Operador1 = PORTC
movf PORTB,W
movwf Operador2 ; Operador2 = PORTB

call Suma ; Llama a la subrutina de nombre Suma


goto Inicio


;**********************************************************************
; *
; Subrutina: Suma *
; *
;**********************************************************************
; *
; Date: 19-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Realiza la suma de dos variables definidas, el resultado *
; se almacena en otra variable llamada Resultado. *
; *
; Datos de Entrada: *
; · Operador1 *
; · Operador2 *
; *
; Datos de Salida: *
; · Resultado *
; *
;**********************************************************************
Suma
movf Operador1,W
addwf Operador2,W ; W = Operador1 + Operador2
movwf Resultado ; Resultado = W


retlw 0 ; Fin de la subrutina: W = 0

END ; directiva 'fin de programa'
Para la realización de este programa, se ha empleado variables definidas en memoria RAM. Para ello, se ha usado la instrucción:

cblock---endc

Dichas variables son Operador1 y Operador2 que albergarán la lectura de los puertos C y B respectivamente, y la variable Resultado que almacenará la suma de las dos anteriores variables.

El propósito de este programa es hacer una lectura de los puertos B y C y almacenar el resultado en dos variables definidas en memoria RAM, posteriormente, sumar dichas variables y almacenar el resultado en otra variable.

Lo interesante de este programa es que dicha suma se realice mediante una subrutina que se llamará Suma.


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 Operador1, Operador2 y Resultado, y el la categoría de SFR, los registros WREG, PORTB y PORTC.

Como en este programa se va a leer el contenido de los puertos B y C, es necesario poder simularlos, es decir, darles valores manualmente para poder observar a posteriori como se ejecuta la subrutina Suma.

Para poder ingresar datos a los puertos, estando éstos configurados como entrada, se hace click en el menú de herramientas en Debugger, posteriormente seleccionamos Stimulus y finalmente la opción New Workbook.



Pulsaremos sobre PIN/SFR y seleccionaremos todos los pines del puerto B y del puerto C, la configuración se determina en Action, la cual elegiremos Toggle.



La función Toggle hace que cada vez que pulsemos sobre Fire (el símboolo de la izquierda >), el pin en cuestión cambie de estado.

Por ello, es muy útil ya que podremos simular distintos estados de los pines de los puertos B y C para poder ver la suma de dichos valores que ejecuta en la subrutina.

La forma de funcionamiento es la siguiente: pulsar sobre el símbolo > de la izquierda de la ventana de Stimulus y en la ventana de Watch, podremos ver que el pin que hemos pulsado en Stimulus cambia de estado.



Se puede observar en el siguiente vídeo todo lo explicado anteriormente:





Este proyecto se puede descargar en la siguiente dirección:
Ejemplo 8.
Ejemplo 8.

0 comentarios: