Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Tutor de MPLAB (8 de 19)  

.: Parte II: Verificando el estado de los interruptores.

Lo que viene ahora es verificar el estado de los interruptores, no te asustes por lo extensa que es esta parte del código, no es nada complicado ya que se repite 16 veces para seleccionar uno de los 16 efectos disponibles según la combinación de las llaves, o interruptores.

switch	MOVF	porta,0	; carga w con el puerto A
	ANDLW	0x0F	; retiene los 4 bits de interes (las llaves)
	MOVWF	llaves	; y los guarda en llaves
	XORLW	0x00	; verifica si es el primer efecto
	BTFSC	estado,2	; si es así
	CALL	efect1	; lo llama y lo ejecuta
	MOVF	llaves,0	; sino, carga llaves en w
	XORLW	0x01	; y verifica si es el segundo efecto
	BTFSC	estado,2	; si es así
	CALL	efect2	; lo llama y lo ejecuta
	MOVF	llaves,0	; y así con los demás
	XORLW	0x02	; ya me aburrí
	BTFSC	estado,2	; como verás el resto es lo mismo
	CALL	efect3
	MOVF	llaves,0
	XORLW	0x03
	BTFSC	estado,2
	CALL	efect4
	MOVF	llaves,0
	XORLW	0x04		
	BTFSC	estado,2
	CALL	efect5
	MOVF	llaves,0
	XORLW	0x05		
	BTFSC	estado,2
	CALL	efect6
	MOVF	llaves,0
	XORLW	0x06		
	BTFSC	estado,2
	CALL	efect7
	MOVF	llaves,0
	XORLW	0x07		
	BTFSC	estado,2
	CALL	efect8
	MOVF	llaves,0
	XORLW	0x08		
	BTFSC	estado,2
	CALL	efect9
	MOVF	llaves,0
	XORLW	0x09		
	BTFSC	estado,2
	CALL	efect10
	MOVF	llaves,0
	XORLW	0x0A		
	BTFSC	estado,2
	CALL	efect11
	MOVF	llaves,0
	XORLW	0x0B		
	BTFSC	estado,2
	CALL	efect12
	MOVF	llaves,0
	XORLW	0x0C		
	BTFSC	estado,2
	CALL	efect13
	MOVF	llaves,0
	XORLW	0x0D		
	BTFSC	estado,2
	CALL	efect14
	MOVF	llaves,0
	XORLW	0x0E		
	BTFSC	estado,2
	CALL	efect15
	MOVF	llaves,0
	XORLW	0x0F		
	BTFSC	estado,2
	CALL	efect16
	GOTO	switch	; Comienza a revisar de nuevo
.: Descripción del código

Jaja...!!!, no voy a describir línea por línea hasta el final, y no me lo pidas por que no me vas a convencer... :o))

Lo que haré será describir esta sección que es la mas crucial, y el resto puedes detenerte a pensarlo, a verlo, y descubrirás que es lo mismo...

Aquí esta parte del código...

switch	MOVF	porta,0	; carga w con el puerto A
	ANDLW	0x0F	; retiene los 4 bits de interes (las llaves)
	MOVWF	llaves	; y los guarda en llaves
	XORLW	0x00	; verifica si es el primer efecto
	BTFSC	estado,2	; si es así
	CALL	efect1	; lo llama y lo ejecuta
	MOVF	llaves,0	; sino, carga llaves en w
	XORLW	0x01	; y verifica si es el segundo efecto
	BTFSC	estado,2	; si es así
	CALL	efect2	; lo llama y lo ejecuta
	MOVF	llaves,0	; y así con los demás
	XORLW	0x02	; ya me aburrí
	BTFSC	estado,2	; como verás el resto es lo mismo

switch es la etiqueta que le corresponde a toda esta sección de código, y le puse ese nombre por que es justamente lo que se hace, revisar todos los switch's.

MOVF    porta,0

Repasemos un poco, MOVF significa mover todo lo que hay en el registro F, el registro F en este caso es porta y para especificar que lo debe guardar en W le ponemos un 0, con esto pasamos el puertoA a W.

ANDLW    0x0F

Esto es, hacer L AND W y guardarlo en W, ahora bien, L es un literal (un valor) en este caso 0x0F y W es el que contiene el valor del puerto A, veamos un ejemplo supongamos que lo que hay en el puerto A es 00010001, eso significa que W=00010001 (gracias a la instrucción anterior) cuando hagas el AND con 0x0F (00001111 en binario) el resultado será el siguiente...

00001111     L
 00010001    W
----------------------
         00000001    ANDLW

Ahora es W=00000001, entiendes por que hice uso de la instrucción AND, bueno así es que nos quedamos con los bit's de interés (los bits de interés son los interruptores), ok, sigamos

MOVWF    llaves

Es como decir MOV todo lo que hay en W al registro F, F en este caso es llaves, y llaves es el nombre que le asignamos al registro 0x0C (en el encabezado... recuerdas...???), muy bien, ahora llaves contiene el estado de los interruptores (en limpio, es decir sin el timer). Si seguimos con el ejemplo anterior luego de la instrucción, nos quedará llaves=00000001, o sea que el primer interruptor está activado...

XORLW    0x00

hacer W XOR L, recuerda que W=00000001 y en este caso L=00000000 (0x00 en hexa) recuerda también que la operación XOR entre dos bits dará como resultado 0 si ambos bits contienen el mismo valor, ahora, el resultado de esta operación será..

  00000001    W
 00000000     L
----------------------
         00000001    XORLW

Es cuestión de segundos para que te des cuenta que lo que estamos haciendo es una comparación, si los valores son los mismos el resultado dará cero.

BTFSC    estado,2

Esto es como decirle... mira ve y prueba el Bit B del registro F y saltéate una línea si es que es 0.

Ok, aclaremos un poco esto, B es el bit2 del registro STATUS y F ahora es el registro STATUS, te preguntarás que tiene que ver el registro STATUS con todo lo que estamos haciendo, te lo explicaré, el bit2 del registro STATUS es el tercer bit "Z" (conocido como bandera de CERO) y esa bandera se pone a uno siempre que una operación aritmética o lógica como la anterior (XORLW) de como resultado 0 (CERO), en cualquier otro caso se pondrá en cero.

Ahora vamos a repetirlo para que quede mas claro, Piensa que las dos instrucciones que acabamos de ver van de la mano

XORLW  0x00         ;XOR entre W y 00000000 (todas las llaves en cero)
BTFSC    estado,2    ;prueba si Z=0 si es así se saltea una línea.

del ejemplo anterior la operación dio como resultado 00000001 por lo tanto la bandera no cambio sigue siendo Z=0 entonces me salteo una línea y voy a esa instrucción

MOVF   llaves,0

Vuelvo a cargar W con el contenido del registro llaves, recuerda que llaves contiene el estado de los interruptores en limpio

Lo que haré ahora será comparar el estado de los interruptores con el segundo efecto ya que el anterior no era, así que haré un nuevo XOR, así...

XORLW  0x01         ;XOR entre W y 00000001 (sólo el primer interruptor en 1)

El tema es que ahora el resultado de esta operación será 00000000 ya que W tiene el mismo valor que el literal 0x01, por lo tanto la bandera Z se hace Z=1 y cuando pase a...

BTFSC    estado,2    ;saltea una línea si Z=0

Pues no saltare nada ya que Z es 1 y pasaré a un...

CALL   efect2

CALL es una llamada, y CALL efect2 es llamar a la etiqueta efect2, esa etiqueta contiene el segundo efecto de luces, ya que el primero no lo pude ejecutar por que no correspondía.

Una vez terminado de ejecutar efect2 volveré a verificar el estado de las llaves, es decir, volveré a...

MOVF   llaves,0

Pero llaves sigue siendo 00000001, por lo tanto todas las otras operaciones me darán cualquier cosa y no 00000000, esto ocurrirá hasta que llegue a la instrucción...

GOTO   switch

Un espectacular salto (GOTO) a la etiqueta switch (el inicio de toda esta sección de código), donde me encuentro con...

MOVF   porta,0

y cargo W con todo lo que hay en el puerto A (que vendría a ser el nuevo estado de los interruptores). Luego haré

ANDLW    0x0F

Para sacarme de encima al timer, y luego un...

MOVF   llaves,0

para cargar el registro llaves con el nuevo estado de los interruptores conectados al puerto A, y estoy listo para verificar de que efecto se trata, y cuando lo descubra haré una llamada al efectX que le corresponde y lo ejecutaré, y así sucesivamente.

Espero que hayas logrado comprender esta sección y sino analiza el código nuevamente hasta que lo entiendas, te confieso que no es tan complicado como parece.

Si está todo claro puedes pasar a la siguiente página...

Ahí te espero...



R-Luis...


<--Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19
Tabla de Referencias


    
--| |--