sábado, 25 de enero de 2014

Práctica 1: Trabajando con las instrucciones


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



 


Esquemático


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.
                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


No hay comentarios:

Publicar un comentario

Todos tus comentarios y aportaciones son bienvenidas en este sitio.