sábado, 18 de octubre de 2008

Mid Range PIC. Ejemplo 8

En este programa se ilustrará como crear y usar una subrutina simple.

En este programa, se centrará en manejar las siguientes instrucciones:


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

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: 16-Octubre-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F627A.INC *
; *
;**********************************************************************
; *
; Notes: Crear y usar una subrutina. *
; *
;**********************************************************************

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

__CONFIG _BOREN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT

; _BOREN_OFF: Reset por Brown-out DESACTIVADO.
; _CP_OFF: Protección de código DESACTIVADO.
; _DATA_CP_OFF: Protección de datos DESACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.

; _WDT_OFF:                 Watchdog DESACTIVADO.
; _LVP_OFF: Programación en bajo voltaje DESACTIVADO.
; _MCLRE_ON: Pin de reset externo ACTIVADO.
; _INTOSC_OSC_NOCLKOUT: Oscilador interno sin salida CLK.

;***** DEFINICIÓN DE VARIABLES
CBLOCK 0x20 ; Inicio dirección memoria de datos del Banco 0
Operador_A
Operador_B
Resultado
ENDC

;**********************************************************************
ORG 0x000 ; Inicio de código
bsf STATUS,RP0 ; Banco 1
bsf PCON,OSCF ; Oscilador interno a 4MHz
bcf STATUS,RP0 ; Banco 0
goto Inicio ; Salta a programa principal

       ORG     0x0004      ; Vector de Interrupción
; El vector de interrupción se encuentra en la dirección 0x0004
; En este ejemplo no se usará interrupciones.
retfie

Inicio
bsf Operador_A,3 ; 0x08 -> Operador_A
bsf Operador_B,2 ; 0x04 -> Operador_B

call Sumar ; Llamada a la subrutina Sumar

sleep ; uC entra en modo Sleep


goto Inicio
; Vuelve a Inicio

;**********************************************************************
; *
; Subrutina: Sumar *
; *
;**********************************************************************
; *
; Date: 16-Octubre-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Suma de dos números y el resultado se almacena una variable *
; *
; Datos de Entrada: *
; · Operando_A *
; · Operando_B *
; · Resultado *
; *
; Datos de Salida: *
; · Resultado *
; *
;**********************************************************************
Sumar
movfw Operador_A ; Operador_A -> (W)

addwf Operador_B,W ; Operador_A + Operador_B -> (W)

movwf Resultado ; (W) -> Resultado

return ; Fin de subrutina Sumar

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

cblock---endc

En este caso, el PIC 16F627A comienza la dirección de memoria de datos en la dirección 0x20 en el banco de memoria 0, se declarará la variable Operador_A, Operador_B y Resultado.

El propósito de este programa es familiarizarse con las instrucciones de programación en lenguaje ensamblador, donde se usará instrucciones que serán comunes en nuestros códigos.

En este programa se muestra como se diseña y se usa una subrutina simple.



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 Operador_A, Operador_B y Resultado, y el la categoría de SFR, el registro WREG.

Simulamos el código paso a paso.

El propósito de este programa es diseñar una subrutina cuya función sea sumar dos registros y el resultado almacenarlo en otro registro, posteriormente el microcontrolador entrará en modo de bajo consumo, denominado Sleep.



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: