lunes, 2 de febrero de 2009

SC. Condicional 3

Seguimos mostrando como usar las Sentencias de Control. En este caso, se realizará un ejemplo donde se comprobará si un dato es mayor que otro.


Como estudio previo, es indispensable ver: SC. Dato1 >= Dato2, donde se explica la sentencia de control que se usará en este ejemplo de aplicación en detalle.

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

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 mismo. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ej3.asm *
; Date: 2-Febrero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P10F200.INC *
; *
;**********************************************************************
; *
; Notes: En este programa, se muestra la utilización de las *
; sentencias de control, en este caso, la condicional *
; de si un dato es mayor o igual que otro. *
;**********************************************************************

list p=10F200 ; Directiva para definir el procesador
#include < p10F200.inc > ; Registros especificas del procesador

__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.


;***** DEFINICIÓN DE VARIABLES

cblock 10h ; Dirección de inicio de memoria RAM
Dato1
Dato2
endc


;**********************************************************************
ORG 0xFF ; 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 0x000 ; Inicio de código
movwf OSCCAL ; Actualiza el valor del oscilador interno a 4MHz
clrw
movwf GPIO ; 0 -> GPIO
TRIS GPIO ; GPIO salida

Inicio1
movlw d'25' ; 25 -> (W)
movwf Dato2 ; (W) -> Dato1
goto Principal

Inicio2
movlw d'15' ; 15 -> (W)
movwf Dato2 ; (W) -> Dato1

Principal
movlw d'20' ; 20 -> (W)
movwf Dato1 ; (W) -> Dato2
subwf Dato2,W ; Dato2 - (W) -> (W)
btfss STATUS,C ; ¿Dato2 >= Dato1?
goto NoIgual ; NO -> Salta a NoIgual

movlw d'1' ; SI -> Aquí código correspondiente
movwf GPIO ; Pin GP0 ON; GP1 OFF
goto Salir ; Ve a Salir

NoIgual
movlw d'2' ; NO -> Aquí código correspondiente
movwf GPIO ; Pin GP0 OFF; GP1 ON

Salir
goto Inicio2


END ; directiva 'fin de programa'

Para la realización de este programa, se ha empleado dos variables definidas en memoria RAM mediante la instrucción.

cblock---endc

Dichas variables se han llamado Dato1 y Dato2, en la cual se cargará el valor 0x10.

El programa es simple y similar al SC2. Condicional 2, analizará dos datos, Dato1 y Dato2, y dependiendo si Dato2 es mayor o igual que Dato1 se pondrá a '1' GP0, en caso contrario, se pondrá a '1' el pin GP1.

Antes de empezar a evaluar ambos datos, se deberá configurar los periféricos internos del microcontrolador para un funcionamiento correcto.

Es por ello, que se deberá configurar el puerto GPIO de manera entrada o salidas digitales. Primero hacemos un reset del puerto, para que después de haber sido configurado, su estado inicial sea cero (es decir, una vez establecido que los pines del GPIO sean de salida digitales, éstos deben de valer cero)

clrw
movwf GPIO

Para posteriormente ser declarado como salida.
clrw
TRIS GPIO
Para ello, usamos la instrucción siguiente:
TRIS

Que se encarga de configurar si los pines son de entrada o salida. Para ser de entrada, debe escribirse un '1' y para ser de salida un '0' en el bit correspondiente al pin a configurar.

Una vez configurado todo, estaremos en disposición de realizar nuestro propósito inicial, verificar si un dato es mayor que otro.



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 las variables definidas como Dato1 y Dato2, y el la categoría de SFR, los registros WREG, STATUS y GPIO.



El propósito de este programa es, comprobar si un dato es mayor o igual que otro.

Para ello, se evaluarán el contenido de las variables definidas en memoria RAM Dato1 y Dato2. En caso de ser Dato2 mayor o igual que Dato1, se pondrá a '1' el pin GP0, en caso contrario, se pondrá a '1' el pin GP1.

Para no hacer un programa complicado, el valor de las variables vendrán definidas en el propio programa, es por ello que, se ha declarado dos vueltas.

Una primera vuelta o análisis consistirá en que Dato2 es mayor que Dato1 y está declarada en el código anterior como Inicio1 (PRIMERA PRUEBA), una vez se complete de analizar el código, el pin GP0, valdrá '1' mientras que GP1 será '0', y se pasará a analizar el caso contrario, que Dato2 no sea mayor o igual que Dato1 (Inicio2 - SEGUNDA PRUEBA -), donde se obtendrá una vez ejecutado todo el código, GP0 valdrá '0' y GP1 será '1'.

Y en este punto terminará el programa ya que siempre estaría en el caso Dato2 no es mayor o igual que Dato1. Faltaría un caso más por probar, y es que pasaría si Dato1 es igual a Dato2, en este caso, debería quedar GP0 como '1' y GP1 como '0' (la comprobación de tal resultado se deja para vosotros).

Si dicha opción, que no está contemplada en el código anterior, la realizáis, comprobaréis que es correcto.



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



Este vídeo se puede ver en alta calidad: SC3

Una alternativa para la simulación, es usar programas como Proteus, donde se puede simular nuestro código con elementos electrónicos, tales como leds, motor, integrados, etc.

En nuestro caso, si ponemos un led bicolor al pin GP0 y GP1, se podrá ver mejor el funcionamiento del código.



Este vídeo se puede ver en alta calidad: SC3_Proteus



Este ejemplo se puede descargar en la siguiente dirección: Ejemplo SC. Condicional 3.

0 comentarios: