viernes, 4 de octubre de 2013

INSTRUCCIONES LÓGICAS

En la siguiente figura puede observar una explicación gráfica de las Instrucciones Lógicas de los PIC de gama media:


Veamos el siguiente ejemplo:

Se requiere sumar los dos nibles de PORTB y almacenar el resultado en PORTA. Escriba el fragmento de programa que permita a un microcontrolador PIC de la gama media realizar esta operación.

Solución:
Recordemos que todos los registros del PIC tienen 8 bits (2 nibles), los 4 bits mas significativos constituyen un nible y los cuatro bits menos significativos otro nible. Es decir:


Se requiere realizar la siguiente operación:


Es decir, sumar (aritméticamente) dos números de cuatro bits.

Para sumar estos números es necesario “separarlos” primero. Para esto podemos recurrir a “enmascarar” el registro PORTB convenientemente y de esta forma obtener cada nible.

Para obtener el nible menos significativo, podemos usar la máscara 00001111:


En ensamblador esta operación se puede realizar mediante las siguientes instrucciones (hacemos uso de un registro auxiliar llamado NIBLEMS, para almacenar el resultado):

MOVF   PORTB,W
ANDLW  b'00001111'
MOVWF   NIBLEMS

Para obtener el nible mas significativo, podemos usar la máscara 11110000:


En ensamblador esta operación se puede realizar mediante las siguientes instrucciones (hacemos uso de un registro auxiliar llamado NIBLELS, para almacenar el resultado):

MOVF   PORTB,W
ANDLW  b'11110000'
MOVWF   NIBLELS

Sin embargo, apenas hemos separado los nibles, el menos significativo tiene 4 bits, pero el mas significativo continúa teniendo 8 bits (los ceros a la izquierda no tienen valor, pero los ceros a la derecha si). Debemos entonces hacer que los ceros a la derecha del Nible MS pasen a la izquierda y en su lugar se ubiquen los bits del Nible MS (un intercambio de nibles: swapf), es decir:


Para hacer esto, agregamos una instrucción:

SWAPF   NIBLELS,W

Luego sumamos NIBLELS y NIBLEMS (Considerando que en W está almacenado el valor del nible menos significativo) y  almacenamos el resultado en PORTA:

ADDWF   NIBLEMS,W
MOVWF   PORTA

Finalmente, el fragmento de programa que permite sumar los dos nibles de PORTB y almacenar el resultado en PORTA es el siguiente:

MOVF   PORTB,W
ANDLW  b'00001111'
MOVWF  NIBLEMS
MOVF   PORTB,W
ANDLW  b'11110000'
MOVWF  NIBLELS
SWAPF  NIBLELS,W
ADDWF  NIBLEMS,W
MOVWF  PORTA














viernes, 6 de septiembre de 2013

Instrucciones de resta


La resta se realiza sumando, en binario puro sin signo.
Al realizar la resta de 8 bits con signo el resultado no puede exceder de +127 ni de (-128).

El flag carry indica si es positivo (C se pone a "1") o negativo (C se pone a "0").

Pueden ocurrir tres casos:


  • Si el el resultado es positivo distinto de cero, C = 1 y Z = 0.
  • Si el resultado es cero, C = 1 y Z = 1.
  • Si el resultado es negativo, C = 0 y Z = 0.
Para las instrucciones de resta podemos emplear:

sublw k
subwf f,d


            ;***************INSTRUCCIONES DE RESTA**************

;ZONA DE DATOS*********************************************************************
    __CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC ;CONFIGURACION PALABRA DE CONTROL

            LIST P=16F84A   ;MICROCONTROLADOR UTILIZADO
            INCLUDE <P16F84A.INC>   ;ETIQUETAS DEL MICROCONTROLADOR ESPECIFICADO

RESTA EQU H'0C'

;ZONA DE CODIGOS*********************************************************************

            ORG 0           ;INCIO DE PROGRAMA EN LA DIRECCION 0 DE MEMORIA DE PROGRAMA

INICIO
            BSF STATUS,RP0  ;FIJA A 1 EL BIT 5 DEL REGISTRO STATUS PARA ACCESAR AL BANCO 1
            CLRF TRISB      ;LIMPIA LAS LINES DEL PTO B PARA CONFIGURARLO COMO SALIDA
            MOVLW B'00000000'
            MOVWF TRISA     ;CARGAMOS EL CONTENIDO DEL REGISTRO DE TRABAJO W A TRIS A PARA CONFIGURARLO COMO ENTRADA
            BCF STATUS,RP0  ;FIJA A 0 EL BIT 5 DEL REGISTRO STATUS PARA REGRESAR AL BANCO 0
PRINCIPAL
            MOVLW H'04'     ;CARGAMOS AL REGISTRO W CON EL DATO A3
            MOVWF RESTA
            MOVLW H'01'
            SUBWF RESTA,W   ;RESTAMOS AL RESGISTRO RESTA LO QUE CONTIENE EL REGISTRO W 
            MOVWF PORTB     ;EL VALOR DEL REGISTRO W SE MUEVE AL PUERTO B Y ARROJA EL RESULTADO EN ESTE CASO EL DATO F2
            SLEEP           ;EL PROGRAMA ENTRA EN MODO BAJO CONSUMO DEL CUAL NO PODRA SALIR

            END





Uso de registros de propósito general (Variables) en Mplab X

  A continuación se da un ejemplo para el uso de variables empleando los registros de propósito general, con los cuales se podrán efectuar diversos tipos de operaciones teniendo mas orden en nuestra programación.

Se podrá simular en Mplab X para ver los cambios que se presentan en las variables empleadas.



         ;***************Variable**************

;ZONA DE DATOS*********************************************************************

    __CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC ;CONFIGURACION PALABRA DE CONTROL

            LIST P=16F84A   ;MICROCONTROLADOR UTILIZADO
            INCLUDE <P16F84A.INC>   ;ETIQUETAS DEL MICROCONTROLADOR ESPECIFICADO


MIAUTO EQU H'0C'
RANGER EQU H'0D'
TORTUGA EQU H'0E'

;ZONA DE CODIGOS*********************************************************************

            ORG 0           ;INCIO DE PROGRAMA EN LA DIRECCION 0 DE MEMORIA DE PROGRAMA

INICIO

PRINCIPAL
            MOVLW H'11'     ;CARGAMOS A W CON EL DATO AA EN HEXADECIMAL
            MOVWF MIAUTO    ;CARGAMOS AL REGISTRO MIAUTO CON LO QUE CONTIENE W
            MOVLW H'15'
            MOVWF RANGER
            MOVLW H'34'
            MOVWF TORTUGA

            SLEEP           ;EL PROGRAMA ENTRA EN MODO BAJO CONSUMO DEL CUAL NO PODRA SALIR

            END





sábado, 10 de agosto de 2013

Instrucciones de suma y flags del registro STATUS

La suma se realiza en aritmética binaria y afecta a los flags(banderas) del registro STATUS de la siguiente forma:

Flag de Zero

Flag Z (zero): 



  • El bit Z se fija a "1" si el resultado de la operación es "0"
  • El bit Z se fija a "0" si el resultado de la operación es diferente de "0" 


Flag de acarreo en el octavo bit

Flag C (carry):



  • Se fija a "1" si el bit 7 tiene un acarreo ejemplo: Si el resultado fuera mayor que B'11111111' (255 Decimal o FF Hexadecimal).
  • En caso contrario se fija a "0".


Flag de acarreo en el 4to bit de menos peso

Flag DC (Digit Carry)


  • Se fija a "1" si en nibble menos significativo (bits del 0 a 3) resulta mayor que 15
  • Se fija a "0" si sucede lo contrario

     

Ejercicio 04 Suma y revisión de Flags del Registro STATUS

En el siguiente programa se sugiere cambiar los datos para corroborar los estados es los flags en sus diferentes casos.

;***************INSTRUCCIONES DE SUMA**************

;ZONA DE DATOS*********************************************************************
    __CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC ;CONFIGURACION PALABRA DE CONTROL

            LIST P=16F84A   ;MICROCONTROLADOR UTILIZADO
            INCLUDE <P16F84A.INC>   ;ETIQUETAS DEL MICROCONTROLADOR ESPECIFICADO



;ZONA DE CODIGOS*********************************************************************

            ORG 0           ;INCIO DE PROGRAMA EN LA DIRECCION 0 DE MEMORIA DE PROGRAMA

INICIO
            BSF STATUS,RP0  ;FIJA A 1 EL BIT 5 DEL REGISTRO STATUS PARA ACCESAR AL BANCO 1
            CLRF TRISB      ;LIMPIA LAS LINES DEL PTO B PARA CONFIGURARLO COMO SALIDA
            MOVLW B'00011111'
            MOVWF TRISA     ;CARGAMOS EL CONTENIDO DEL REGISTRO DE TRABAJO W A TRIS A PARA CONFIGURARLO COMO ENTRADA
            BCF STATUS,RP0  ;FIJA A 0 EL BIT 5 DEL REGISTRO STATUS PARA REGRESAR AL BANCO 0
PRINCIPAL
            MOVLW H'A3'     ;CARGAMOS AL REGISTRO W CON EL DATO A3
            ADDLW H'4F'     ;SUMAMOS EL CONTENIDO DEL REGISTRO W CON EL DATO 4F
            MOVWF PORTB     ;EL VALOR DEL REGISTRO W SE MUEVE AL PUERTO B Y ARROJA EL RESULTADO EN ESTE CASO EL DATO F2
            SLEEP           ;EL PROGRAMA ENTRA EN MODO BAJO CONSUMO DEL CUAL NO PODRA SALIR

            END

domingo, 28 de julio de 2013

Resumen de Set de Instrucciones



w: Es el registro de trabajo y almacena datos de forma momentánea
f: Es la dirección de un registro, si es llamada apunta al contenido de ese registro
d: Es el destino donde se guarda el resultado de una operación, si es 1 se guarda en el registro f, y si es 0 en w.
b: Alguno de los 8 bits del registro f
k: Constante de 8 bit, puede tomar valores entre 0 y 255

OPERACIONES ORIENTADAS A REGISTROS
Nemotécnicos
Operación
Estados afectados
ADDWF
f,d
ANDWF
f,d
CLRF
f
CLRW
COMF
f,d
DECF
f,d
DECFSZ
f,d
INCF
f,d
INCFSZ
f,d
IORWF
f,d
MOVF
f,d
MOVWF
f
NOP
RLF
f,d
RRF
f,d
SUBWF
f,d
SWAPF
f,d
XORWF
f,d
Sumar W y f
AND entre W y f
Limpiar f
Limpiar W
Complementar f
Decrementar f
Decrementar f, saltar si cero
Incrementar f
Incrementar f, saltar si cero
OR entre W y f
Mover f
Mover W a F
No Operación
Rotar a la izquierda
a través del carry
Rotar a la derecha
a través del carry
Restar W de f
Intercambiar nibbles de f
OR exclusiva entre W y f
C,DC,Z
Z
Z
Z
Z
Z

Z

Z
Z


C
C
C,DC,Z

Z


OPERACIONES ORIENTADAS A BITS
Nemotécnicos
Operación
Estados afectados
BCF
f,b
BSF
f,b
BTFSC
f,b
BTFSS
f,b
Limpiar bit b de f
Activar bit b de f
Probar bit b de f,
saltar si cero
Probar bit b de f,
saltar si uno



OPERACIONES ORIENTADAS A LITERALES Y DE CONTROL
Nemotécnicos
Operación
Estados afectados
ADDLW
k
ANDLW
k
CALL
k
CLRWDT
GOTO
K
IORLW
K
MOVLW
K
RETFIE
RETLW
K
RETURN
SLEEP
SUBLW
K
XORLW
K
Sumar literal k a W
AND entre k y W
Llamar subrutina
Limpiar WDT
Salta a dirección k
OR entre k y W
Cargar W con literal k
Retornar de interrupción
Retornar y cargar W con k
Retornar de subrutina
Ir al modo de bajo consumo
Restarle k a W
OR exclusiva entre k y W
C,DC,Z
Z

-TO,-TD

Z




-TO,-TD
C,DC,Z
Z