sábado, 31 de enero de 2009

SC. Condicional 2

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.

El PIC a usar podría ser cualquiera, así que en este ejemplo, se ha usado el PIC16F610, donde el espacio web que dispone Microchip sobre este microcontrolador, es el siguiente: PIC16F610.

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 de su autor. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ej2.asm *
; Date: 30-Enero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F610.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 que otro. *
;**********************************************************************

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

__CONFIG _INTRC_OSC_NOCLKOUT & _IOSCFS_8MHZ & _MCLRE_ON & _CP_OFF & _WDT_OFF & _BOR_OFF


; _INTRC_OSC_NOCLKOUT: Pin R4 y R5 como I/O.
; _IOSCFS_8MHZ: Frecuencia reloj interno de 8MHz.
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _BOR_OFF: Brown-Out reset DESACTIVADO.


;***** DEFINICIÓN DE VARIABLES
cblock 0x40 ; Inicio RAM
Dato1
Dato2
endc

;**********************************************************************
ORG 0x000 ; Inicio de código

ERRORLEVEL -302 ; Desactivar el aviso al banco 0
BANKSEL OSCTUNE ; Selecciona banco 1 con macro mpsam
movlw 0x00 ; Actualiza el oscilador
movwf OSCTUNE
BANKSEL STATUS ; Selecciona banco 0 con macro mpsam
ERRORLEVEL +302 ; Activar el aviso al banco 0

clrf PORTC ; 0 -> PORTC

bsf STATUS,RP0 ; Banco 1
clrf ANSEL ; PORTC como I/O digitales
clrw ; PORTC configurado como ...
movwf TRISC ; ...salida.
bcf STATUS,RP0 ; Banco 0

Inicio1
movlw d'2' ; PRIMERA PRUEBA
movwf Dato2 ; 2 -> Dato2

goto Principal

Inicio2
movlw d'5' ; SEGUNDA PRUEBA
movwf Dato2 ; 5 -> Dato2

Principal
movlw d'4'
movwf Dato1 ; 4 -> Dato1

subwf Dato2,W ; Dato2 - (W) -> (W)
btfss STATUS,Z ; ¿Dato1 == Dato2 o Dato1 > Dato2?
goto NoIgual ; SI -> Salta a NoIgual
goto NoMayor ; NO -> Salta a NoMayor

NoIgual
btfsc STATUS,C ; ¿Dato1 > Dato2?
goto NoMayor ; NO -> Salta a NoMayor

bcf PORTC,RC1 ; SI -> RC1 OFF
bsf PORTC,RC0 ; RC0 ON
goto Salir ; Salta a Salir

NoMayor
bcf PORTC,RC0 ; RC0 OFF
bsf PORTC,RC1 ; RC1 ON

Salir
goto Inicio2 ; SEGUNDA PRUEBA


END ; directiva 'fin de programa'

Ya que la sentencia de control condicional debe trabajar con registros, se han definido dos variables en la memoria RAM, para ello, se usa la siguiente instrucción:

cblock------endc

En este caso, el inicio para el PIC16F610 es la dirección 0x40 cuyo nombre de las variables serán Dato1 y Dato2.

El programa es bastante simple, analizará dos datos, Dato1 y Dato2, y dependiendo si Dato1 es mayor que Dato2 se pondrá a '1' RC0 del puerto C, en caso contrario, se pondrá a '1' el pin RC1 del puerto C.

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 C de manera entrada o salidas digitales (¡Ojo!, hay que prestar mucha atención a la localización de los registros en los bancos de memoria del microcontrolador - Mirar el código -).

clrf   ANSEL

Para posteriormente ser declarado como salida.
clrw
movwf TRISC
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.

Buscamos en la ventana Watch, en la parte Symbol las variables definidas, en este caso los llamados Dato1 y Dato2 y la agregamos a la ventana de inspección, y en la parte de SFR, agregamos los registros STATUS, PORTC, WREG.



El interés de este programa, como ya se ha comentado, es comprobar si un dato es mayor que otro.

Para ello, se evaluarán el contenido de las variables definidas en memoria RAM Dato1 y Dato2. En caso de ser Dato1 mayor que Dato2, se pondrá a '1' el pin RC0 del puerto C, en caso contrario, se pondrá a '1' el pin RC1 del mismo puerto.

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 Dato1 es mayor que Dato2 y está declarada en el código anterior como Inicio1 (PRIMERA PRUEBA), una vez se complete de analizar el código, el pin del puerto C, RC0, valdrá '1' mientras que RC1 será '0', y se pasará a analizar el caso contrario, que Dato1 no sea mayor que Dato2 (Inicio2 - SEGUNDA PRUEBA -), donde se obtendrá una vez ejecutado todo el código, RC0 valdrá '0' y RC1 será '1'.

Y en este punto terminará el programa ya que siempre estaría en el caso Dato1 no es mayor que Dato2. 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 RC0 como '0' y RC1 como '1', ya que el propósito del análisis es sólo si un dato es mayor que otro.

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



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



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 verde al pin RC0 y un led rojo al pin RC1, se podrá ver mejor el funcionamiento del código.




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

0 comentarios: