En esta entrada pretende mostrar como usar las Sentencias de Control comentadas en este blog. En este caso, se realizará un ejemplo donde se comprobará si dos datos son iguales o no.
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 PIC12F510, donde el espacio web que dispone Microchip sobre este microcontrolador, es el siguiente: PIC12F510.
;**********************************************************************
; 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: Ej1.asm *
; Date: 4-Enero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P12F510.INC *
; *
;**********************************************************************
; *
; Notes: En este programa se muestra la utilización de las *
; sentencias de control, en este caso, la condicional *
; de si dos datos son iguales o no. *
;**********************************************************************
list p=12F510 ; Directiva para definir el procesador
#include < p12F510.inc > ; Registros especificas del procesador
__CONFIG _IOSCFS_ON & _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSCZ
; _IOSCFS_ON: Frecuencia de reloj interno a 8MHz.
; _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 0Ah ; Inicio RAM
Dato1
Dato2
endc
;**********************************************************************
ORG 0x03FF ; Dirección del 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
movlw b'11011111'
OPTION ; Transición Timer interna
bcf CM1CON0,C1ON ; Comparador OFF
andlw b'00111111'
andwf ADCON0 ; ADC OFF
clrf GPIO
movlw 0xFF
TRIS GPIO ; GP0-GP2 Entradas digitales
Inicio
movf GPIO,w ; Lectura de pines -> (W)
movwf Dato1 ; (W) -> Dato1
movwf Dato2 ; (W) -> Dato2
rlf Dato2,f ; Dato2 <<>
swapf Dato2,f ; Intercambio parte alta con parte baja de Dato2
movlw 0x07 ; Solo nos interesan tres bits
andwf Dato2,f
andwf Dato1,f
movf Dato1,w ; Dato1 -> (W)
subwf Dato2,W ; Dato2 - (W) -> (W)
btfss STATUS,Z ; ¿Dato1 == Dato2?
goto NoIgual ; NO -> Salta a NoIgual
nop ; SI -> Aquí código correspondiente
goto Salir ; Ve a Salir
NoIgual
nop ; Aquí código correspondiente si no es igual
Salir
goto Inicio
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 PIC12F510 es la dirección 0x0A en el primer banco de memoria, cuyo nombre, de las variables, serán Dato1 y Dato2.
También se va a usar los pines del puerto GPIO del microcontrolador, de ellos dependerán los valores de las variables definidas en memoria RAM, Dato1 y Dato2.
Antes de empezar a evaluar ambos datos, se deberá configurar los perifércos internos del microcontrolador para un funcionamiento correcto.
Para ello, se deben configurar adecuadamente. Lo primero que haremos, es que la transición del Timer sea interna, así se podrá configurar el pin GP2 como salida. Se debe poner a '0' el bit T0CS del registro OPTION.
movlw b'11011111'
OPTION..............
.............................bcf CM1CON0,C1ON
Y por último, se debe "apagar" también el periférico del convertidor A/D.
.......
andlw b'00111111'
andwf ADCON0
Para ello, los bits ANS1 y ANS0 deben ser puestos a '0' en el registro ADCON0 como se muestra en las instrucciones anteriores.
Una vez configurados todos los periféricos de tal manera que se puedan usar los pines como entrada o salida digitales, se realiza el último paso de configuración, los pines cómo entrada digitales.
movlw 0xFF
TRIS GPIO
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, comparar dos datos y verificar si son iguales o no.
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, GPIO, WREG y GPIO.
El interés de este programa, como ya se ha comentado, es comprobar si dos datos son iguales o no.
Para ello, nos basaremos en el estado de los pines del PIC, los cuales están controlados por el registro GPIO.
Para entender bien el cometido de este programa, es indispensable hacer una reseña breve, pero suficiente, sobre el registro GPIO.
Dicho registro, tiene un tamaño de 8-bits y en él, se contienen los estados de los pines GP0-GP5.
Las relaciones del estado de los pines del PIC con el registro GPIO son las siguientes:
Para hacer el trabajo más sencillo, Dato1 y Dato2 estarán comprendidos por 3 bits del registro GPIO, tal y como se puede observar en la figura anterior, Dato1 estará compuesto por los pines GP0-GP2 y Dato2 por GP3-GP5, es decir, cada variable estará comprendida de tres bits, por lo que podrán albergar números del 0 al 7.
Para entender bien el cometido de este programa, es indispensable hacer una reseña breve, pero suficiente, sobre el registro GPIO.
Dicho registro, tiene un tamaño de 8-bits y en él, se contienen los estados de los pines GP0-GP5.
Las relaciones del estado de los pines del PIC con el registro GPIO son las siguientes:
- GP0 -> 0
- GP1 -> 1
- GP2 -> 2
- GP3 -> 3
- GP4 -> 4
- GP5 -> 5
Para hacer el trabajo más sencillo, Dato1 y Dato2 estarán comprendidos por 3 bits del registro GPIO, tal y como se puede observar en la figura anterior, Dato1 estará compuesto por los pines GP0-GP2 y Dato2 por GP3-GP5, es decir, cada variable estará comprendida de tres bits, por lo que podrán albergar números del 0 al 7.
Y aquí se nos presenta un inconveniente, y proviene de la propia filosofía que se ha planteado el desarrollo del ejemplo, de que cada dato conste de tres bits. La forma óptima de proceder es que el valor de Dato1 y de Dato2 estén separados en la propia variable, uno en cada nibble (uno en la parte alta y otro en la parte baja de la variable).
La variable Dato1 no nos preocupará de momento, ya que en la propia parte baja de la variable se almacena el valor para esta variable, el problema viene que también tiene contenida el valor de Dato2, pero su modificación es inmediata y se hará posteriormente.
El que realmente nos incomoda, es el valor de la variable Dato2, la forma de actuar es pasar a la parte alta de la variable el valor correspondiente a esta variable, para ello, desplazamos hacia la izquierda un bit el contenido de la variable Dato2.
rlf Dato2,f
swapf Dato2,f
Teniendo en cuenta que simplemente nos interesa los tres primeros bits de cada variable, ponemos a cero los restantes.
movlw 0x07
andwf Dato2,f
andwf Dato1,f
Así que para poder cambiar el estado de cualquier pin del PIC, deberemos pulsar sobre Fire (símbolo > de cada pin definido).
Se puede observar en el siguiente vídeo todo lo explicado anteriormente:
Este ejemplo se puede descargar en la siguiente dirección: Ejemplo SC. Condicional 1.
0 comentarios:
Publicar un comentario