Objetivos: En esta práctica se ilustrará
el uso de las instrucciones movf, movwf y movwl, las cuales
constituyen el pilar fundamental para transferir datos entre registros y
puertos de entradas y salidas de todos los microcontroladores, además se
empezarán cubrir aspectos del funcionamiento interno del PIC 16F62XA.
Todos los microprocesadores y
microcontroladores poseen en su estructura interna partes como la ALU
(Unidad Lógica Aritmética), la
cual se encarga de realizar operaciones lógicas (AND, OR, XOR, NOT) y
operaciones aritméticas básicas entre dos operandos de 8 bits cada uno. La ALU
cuenta con un registro de trabajo llamado w que constituiría uno
de los operandos y el otro lo constituye un código de instrucción (literal) o
una posición de la memoria de datos, ambos provienen de un mutiplexor. Dado que
en las operaciones binarias se pueden producir acarreos (carry), la ALU cuenta
con un indicador de acarreo conformado por un flip-flop que se pone a
uno cuando se produce.
En la figura 1.1 se
ilustra un esquema de la ALU.
Fig. 1.1: Esquema de la ALU del PIC
Ahora revisaremos las
instrucciones que usaremos para nuestro primer programa: mov
Esta instrucción
universal de todos los microprocesadores tiene como objetivo hacer la
transferencia del contenido de un registro fuente f a un registro de
destino d. En los microcontroladores PIC la instrucción mov
tiene tres variantes a saber:
movf f,d: Se encarga de trasladar el contenido de una posición de la memoria de
datos al registro w cuando d=0, o al mismo registro fuente
cuando d=1.
Ejemplo 1:
El registro CONTENIDO
tiene el valor 0x05h y se desea cargarlo al registro w, el cual
inicialmente vale cero.
w
= 0; CONTENIDO = 5
movf CONTENIDO, 0 w
= 5; CONTENIDO = 5
Cuando se realiza la
transferencia del registro fuente a sí mismo, se activa un flip-flop de
señalización a cero FZ, el cual pasa a valer cero. Cuando la transferencia es
de un registro f a w, FZ=1 si f=0.
movwf f: Mueve el contenido del registro w a una
posición de memoria f. el ejemplo 2 nos ilustrará mejor esta instrucción.
Ejemplo 2:
Se desea transferir
el valor del registro CONTENIDO al registro TEMPORAL.
w = 00h; CONTENIDO = 05h; TEMPORAL = 00h
movf CONTENIDO,
0 w = 05h; CONTENIDO = 05h; TEMPORAL = 00h
movwf TEMPORAL w
= 05h; CONTENIDO = 05h; TEMPORAL = 05h
movlw k: Mueve un literal k al registro w
Ejemplo 3:
Se requiere
inicializar el registro CONTADOR en 0xCCh, ya que su valor actual es cero.
movlw 0xCCh w
=CCh; CONTADOR=00h
movwf CONTADOR w
=CCh; CONTADOR= CCh
Ahora que ha quedado
expuesto el funcionamiento de las variantes de mov, vamos pasaremos a revisar
las instrucciones elementales aritméticas con las que cuentan los PIC’s.
addwf f,d: Realiza la suma de los registros w y f siendo
estos los sumandos, pero lo interesante es que el usuario define donde se
almacenará el resultado través de d, es decir si d
=0, entonces el resultado se almacena en w, de lo
contrario si d =1, entonces el resultado se almacenará en f.
addlw k: Realiza la suma entre w y el literal k,
almacenándose el resultado en w.
Cabe mencionar que en
estas operaciones de suma, existen tres bits bandera que trabajan de manera
simultánea, estos son FZ = 1 si el resultado de la suma es igual a cero; FC = 1
si se produce acarreo en la suma de los dos bits de más peso de los operandos y
FDC = 1 si se produce acarreo entre los bits intermedios (bit 3, posición 4) de
los operandos. Esta última bandera se utiliza en las operaciones con números
BCD, pero esto se cubrirá en una práctica posterior.
subwf f,d: Realiza la resta de los registros w
y f; si d =0, entonces el resultado se almacena en w,
de lo contrario si d =1, entonces el resultado se
almacenará en f.
sublw k: Realiza la resta entre w y el literal k,
almacenándose el resultado en w.
En estas operaciones
también se encuentran trabajando los tres bits bandera FZ, FC y FDC, solo que
en el caso de FC = 0 implica que existe borrow o “llevada” en los bits de
mayor peso de los operandos que están llevando a cabo la resta, por lo que FC =
1 indica que no ocurrió llevada en la resta. Lo mismo aplica para los bits intermedios
a través de FDC cuando se desea trabajar con dígitos BCD.
Práctica
Una vez que hemos
cubierto la teoría necesaria para realizar la primera práctica, pasemos al siguiente
enunciado:
Se requiere realizar
una máquina que exhiba el resultado a través de led’s, de una suma y una resta
aritméticas en hexadecimal realizadas por el microcontrolador. La ejecución de
las operaciones deben realizarse cada vez que se oprima un push button de
control y tanto el valor de los operandos como el resultado deben exhibirse en
los LED’s.
Lista de
materiales
1 microcontrolador
PIC 16F628A.
8 Resistencias de 680
Ω.
2 Resistencias de 10
kΩ.
8 LED’s.
1 Push button
normalmente abiertos.
1 Fuente de voltaje
de 5 V.
1 Protoboard.
Varios: Segmentos de
alambre de diferentes longitudes y colores.
Diagrama de flujo
Fig.: 1.2
Programa
;************Práctica 1:
Instrucción mov***********
;********* Autor: ESAU
SANABRIA SANCHEZ************
;* Mediante esta práctica se
ilustrará el uso de la instrucción mov*
;* y sus variantes.*
;
;***************ZONA DE
DATOS**********************
__CONFIG _CP_OFF
& _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF &
_INTRC_OSC_NOCLKOUT & _MCLRE_ON ;DIRECTIVA DE CONFIGURACIÓN.
#include <P16F628.inc> ;Definición de operandos utilizados.
#include <P16F628.inc> ;Definición de operandos utilizados.
LIST
P=16F628A ;Modelo de microcontrolador usado.
RADIX HEX
;Se trabajará con números base hexadecimal.
OPERANDO
EQU 0X20 ;Define el registro "OPERANDO" en la dirección
0x20h
;***************ZONA DE
PROGRAMA******************
ORG 0X00
;Inicio del programa en la dirección cero de la memoria de programa.
goto INICIO
;Salto a la primera instrucción de programa.
ORG 0X05
INICIO clrf PORTA
;Limpia PORTA
movlw 0x07
;Deshabilita los comparadores,
movwf CMCON
;para dejar PORTA como entradas ;digitales
bsf STATUS,RP0
;Accede al banco 1.
movlw b'00000001'
;Carga a W el valor 0x01h
movwf TRISA
;RA0 queda configurado como entrada.
movlw b'00000000'
;Carga a W el valor 0x00h
movwf TRISB
;PORTB queda configurado como salida.
bcf PCON,3
;Configura el reloj interno a 48KHz.
bcf STATUS,RP0
;Sale del banco 1.
clrf PORTA
clrf PORTB
PB_ON1 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON1
;proseguir con el programa.
PB_OFF1 btfss PORTA,0
goto PB_OFF1
movlw 0x33 ;Carga a
W el valor 0x33h.
movwf OPERANDO
;OPERANDO = 0x33h.
movf OPERANDO,0
;Carga a W el valor de OPERANDO.
movwf PORTB
;Se exhibe el valor de OPERANDO en
; los LED´s.
PB_ON2 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON2
;proseguir con el programa.
PB_OFF2 btfss
PORTA,0
goto
PB_OFF2
movlw 0x55 ;Carga a
W el valor 0x55h.
movwf PORTB
;Se exhibe el valor de W en los LED´s.
PB_ON3 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON3
;proseguir con el programa.
PB_OFF3 btfss PORTA,0
goto PB_OFF3
addwf OPERANDO,W
;W<=W+OPERANDO
movwf PORTB
;Se exhibe el resultado de la suma en los LED's.
PB_ON4 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON4
;proseguir con el programa.
PB_OFF4 btfss PORTA,0
goto PB_OFF4
movlw 0xFF ;Carga a W
el valor 0xFFh.
movwf OPERANDO
;OPERANDO = 0xFFh.
movf OPERANDO,0
;Carga a W el valor de OPERANDO.
movwf PORTB
;Se exhibe el valor de OPERANDO en los LED´s.
PB_ON5 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON5
;proseguir con el programa.
PB_OFF5 btfss PORTA,0
goto PB_OFF5
movlw 0x0F
movwf PORTB
PB_ON6 btfsc PORTA,0
;Espera a que se oprima el botón para
goto PB_ON6
;proseguir con el programa.
PB_OFF6 btfss PORTA,0
goto PB_OFF6
subwf OPERANDO,W ;W<=W-OPERANDO.
movwf PORTB
LAZO goto LAZO
END ;Fin de programa.
Observaciones
De la implementación de esta práctica podemos apreciar como
a través de la instrucción mov en su vertiente movlw permite
cargar valores al registro de trabajo w; movwf permite que dichos
valores puedan trasladarse al registro auxiliar OPERANDO y ser exhibidos
en el puerto de salida PORTB. Por otra parte con movf
trasladábamos el valor de OPERANDO a w, para posteriormente
exhibir dicho valor en PORTB. Sin embargo si el lector se percató, el
uso de movf no era necesario y esto se ilustra a continuación:
movlw 0xFF W
<= 0xFFh.
movwf OPERANDO OPERANDO
<= W = 0xFFh
movf OPERANDO,0 W
<= OPERANDO = 0xFFh
movwf PORTB PORTB
<= W = 0xFFh
Este segmento de código se
puede simplificar como sigue:
movlw 0xFF W
<= 0xFFh.
movwf OPERANDO OPERANDO
<= W = 0xFFh
movwf PORTB PORTB
<= W = 0xFFh
Sin embargo el propósito de
la práctica es ilustrar el uso de la instrucción mov en todas sus
vertientes, por eso se implementó de esta forma.
En cuanto al uso de la
directiva de configuración, la configuración de puertos y el uso de las
instrucciones goto, btfsc y btfss, por el momento decir
que no se preste atención en ellas, ya que en prácticas posteriores se irán
cubriendo explicaciones y uso adecuado de los mismos.
Ejercicio de autopráctica
Compile y ejecute la práctica
1 omitiendo del programa las siguientes instrucciones:
PB_OFF”N” btfss PORTA,0
goto PB_OFF”N”
Donde N es el número del 1 al
6 en cada sección del programa donde se repite este bloque de instrucciones.
En este enlace podrás descargar tanto el diagrama esquemático, como el programa en extensión .asm y .hex :https://drive.google.com/folderview?id=0BxhGk5EaSqr-RFEybGxqa1Y3X1E&usp=sharing
En este enlace podrás descargar tanto el diagrama esquemático, como el programa en extensión .asm y .hex :https://drive.google.com/folderview?id=0BxhGk5EaSqr-RFEybGxqa1Y3X1E&usp=sharing




