domingo, 4 de enero de 2009

SC. Condicional 1

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.

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: 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..............
.............................
Posteriormente, habrá que "apagar" el periférico del comparador, para ello, realizamos la siguiente instrucción:

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
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, 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:
  • GP0 -> 0
  • GP1 -> 1
  • GP2 -> 2
  • GP3 -> 3
  • GP4 -> 4
  • GP5 -> 5
Siendo los bits 6 y 7, del propio registro, nulos a tener en cuenta, es por ello, que tenemos 6 bits para poder manejar y por lo tanto usar.

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.

Es por ello que el programa lo que hace es leer los estados de los pines y "volcar" el resultado en Dato1 y Dato2, por lo tanto, en este momento, cada variable dato contiene el estado de todas las entradas del microcontrolador, algo que se deberá tratar de tal manera, para obtener al final, Dato1 y Dato2 perfectamente separados.

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
Esto provocará que el valor correspondiente a la variable Dato2 esté, ahora, en el nibble alto, parte alta, de la variable Dato2. El siguiente paso es simplemente intercambiar la parte alta con la parte baja para tener el valor de Dato2 en la parte baja de dicha variable.
swapf   Dato2,f
Ahora si tenemos cada valor dispuestos en sus respectivas variables, simplemente tenemos que "limpiar" los bits que no son necesarios y que pueden tener valores incorrectos por el tratamiento a los cuales han sido sometidos.

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
Y en este punto, se han obtenido los valores correspondientes a Dato1 y Dato2 en sus respectivas variables. En la simulación, para poder modificar los valores usaremos la aplicación que nos pone a neustra disposición Microchip, Stimulus, donde configuraremos los pines GP0-GP5 como Toggle.



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: