st1\:*{behavior:url(#ieooui) }
<!– /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:»»; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:»Times New Roman»; mso-fareast-font-family:»Times New Roman»;} h1 {mso-style-next:Normal; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; page-break-after:avoid; mso-outline-level:1; font-size:12.0pt; mso-bidi-font-size:10.0pt; font-family:»Times New Roman»; mso-font-kerning:0pt; font-weight:normal;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:2124303081; mso-list-type:hybrid; mso-list-template-ids:27397126 201981953 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:36.0pt; mso-level-number-position:left; text-indent:-18.0pt; font-family:Symbol;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} –>


/* Style Definitions */
table.MsoNormalTable
{mso-style-name:»Tabla normal»;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:»»;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:»Times New Roman»;
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}

INSTRUCCIÓN:

ADDLW k (hex = 3E kk)

Descripción:

Sumar al acumulador el valor k.

Operación:

W = W + k

Esta instrucción suma un valor de un literal al contenido del registro “W” y lo guarda en “W”.

Ejemplo:

MOVLW 3 ; carga el acumulador W con el valor 3.

ADDLW 1 ; suma 1 al acumulador.

Al final el acumulador tendrá el valor 4.

Registro STATUS:

Modifica los bits Z, DC y C.

  • Z vale 1 si el resultado de la operación es 0.
  • DC vale 1 si el resultado de la operación es un número superior a 15.
  • C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

INSTRUCCIÓN:

ANDLW k (hex = 39 kk)

Descripción:

Operación lógica AND entre el acumulador W y el literal k

Operación:

W = W AND k

Esta instrucción realiza una operación lógica AND entre el contenido de “W” y k. El resultado se guarda siempre en el acumulador “W

Ejemplo:

Si cargamos el acumulador con el binario 10101010B y hacemos un AND con el binario 11110000B, nos quedará el resultado de la operación en el acumulador “W”.

MOVLW 10101010B

ANDLW 11110000B

El resultado de la operación queda en “W” = 10100000B.

Explicación de la operación AND:

Tenemos 4 posibles combinaciones entre dos bits

0 AND 0 = 0

0 AND 1 = 0

1 AND 0 = 0

1 AND 1 = 1

Vemos que solamente en el caso de que ambos bits sean 1, el resultado será 1. Esta instrucción compara dos bytes, bit a bit.

Registro STATUS:

Modifica el bit Z.

  • Z vale 1 si el resultado de la operación es 0.

INSTRUCCIÓN:

CALL k (hex = 2k kk)

Descripción:

Llama a una subrutina en la dirección k.

Operación:

CALL à k…RETURN à PC+1.

Esta instrucción llama a un grupo de instrucciones (subrutina) que comienzan en la dirección k, donde k puede ser un valor numérico o una etiqueta. Siempre termina con la instrucción de retorno (RETURN o RETLW).

Definición de subrutina: son un grupo de instrucciones que forman un programa dentro del programa principal y que se ejecutan cuando las llama el programa principal.

Utilidad: sirven para utilizarlas varias veces en cualquier parte del programa, sin necesidad de tener que copiar las mismas instrucciones, con el consiguiente ahorro de memoria.

Funcionamiento: cuando un programa ejecuta una instrucción CALL, guarda en el stack el valor del registro PC+1 (PC = Program Counter) de manera que al regresar de la subrutina continúa con la instrucción siguiente recuperándola del stack, ejecutando la instrucción de retorno RETURN o RETLW.

Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack, por lo que el número máximo de CALL reentrantes (instrucciones CALL que contengan otra instrucción CALL) queda limitado a 8.

Ejemplo:

PRINCIPAL: etiqueta que identifica una dirección de memoria.

RETARDO: etiqueta que identifica el comienzo de una subrutina.

BUCLE: etiqueta que identifica una dirección de memoria.

PRINCIPAL CALL RETARDO

BTFSC PORTB, RB0

GOTO PRINCIPAL

*

*

*

RETARDO CLRF CONTADOR

BUCLE DECFSZ CONTADOR, 1

GOTO BUCLE

RETURN

En este listado vemos que la subrutina RETARDO salta a un grupo de instrucciones que forman un bucle y cuando éste termina regresa para seguir con la instrucción siguiente al salto (BTFSC…).

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

CLRWDT (hex = 00 64)

Descripción:

Pone el temporizador WDT a cero.

Operación:

WDT = 0

Esta instrucción se utiliza cuando programamos el PIC con la opción Watch Dog habilitada. Para evitar el reset del PIC, el programa debe contener cíclicamente la instrucción CLRWDT para ponerlo a cero. Si no se pone a cero a tiempo, el WDT interpretará que se ha bloqueado el programa y ejecutará un reset para desbloquearlo.

Ejemplo:

Bucle CLRWDT

*

*

*

GOTO Bucle

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

GOTO k (hex = 28 kk)

Descripción:

Salto incondicional a k.

Operación:

Salto à k

Esta instrucción ejecuta un salto del programa a la dirección k. El parámetro “k” puede ser un valor numérico o una etiqueta.

Ejemplo:

INSTRUCCIÓN 1

GOTO ABAJO

INSTRUCCIÓN 3

INSTRUCCIÓN 4

INSTRUCCIÓN 5

ABAJO INSTRUCCIÓN 6

Primero se ejecuta la instrucción 1, después GOTO y continúa con la instrucción 6 saltándose las instrucciones 3, 4 y 5.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

IORLW k (hex = 38 kk)

Descripción:

Operación lógica OR entre el acumulador W y el literal k

Operación:

W = W OR k

Esta instrucción realiza un OR inclusivo entre el contenido del acumulador “W” y el literal k. El resultado se guarda siempre en el acumulador (“k” es un valor, no un registro).

Ejemplo:

Si cargamos el acumulador con el binario 11110000B y k= 00001111B, nos quedará el resultado de la operación en el acumulador “W”.

MOVLW 11110000B

IORLW 00001111B

El resultado de la operación queda en “W” = 11111111B.

Explicación de la operación OR:

Tenemos 4 posibles combinaciones entre dos bits

0 OR 0 = 0

0 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1

Vemos que solamente en el caso de que ambos bits sean 0, el resultado será 0. Esta instrucción compara dos bytes, bit a bit.

Registro STATUS:

Modifica el bit Z.

  • Z vale 1 si el resultado de la operación es 0.

INSTRUCCIÓN:

MOVLW k (hex = 30 kk)

Descripción:

Mover el literal k al acumulador.

Operación:

W = k

Esta instrucción asigna al acumulador “W” el valor del literal k (entre 0 y 255).

Ejemplo:

Si tenemos el acumulador a cero o con cualquier valor, y queremos que contenga el que le asignemos nosotros directamente entonces usaremos esta instrucción:

W = 0.

Valor a asignar = 100.

Instrucción: MOVLW 100

El acumulador valdrá 100 (W = 100).

Con distinto valor de partida del acumulador:

W = 225.

MOVLW 100

El acumulador valdrá 100 (W = 100).

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

OPTION (hex = 00 62)

Descripción:

Guarda el valor del acumulador en el registro OPTION.

Operación:

OPTION = W.

Esta instrucción guarda en el registro especial OPTION el valor contenido en el acumulador “W”.

Ejemplo:

MOVLW 10H ; carga el acumulador con el valor 10H.

OPTION ; carga el registro OPTION con el acumulador.

Esta instrucción existe para mantener la compatibilidad con los PIC producidos con anterioridad, y como en el futuro podría dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma:

BSF STATUS, RP0 ; activa el banco 1.

MOVLW 10H ; carga el acumulador con 10H.

MOVWF OPTION_REG ; carga OPTION con el acumulador.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

RETFIE (hex = 00 09)

Descripción:

Retorna de una interrupción.

Operación:

FIN INTERRUPCION.

Esta instrucción devuelve el control al programa principal después de ejecutarse una subrutina de gestión de interrupción.

Ejemplo:

ORG 00H

BUCLE GOTO BUCLE ; bucle infinito.

ORG 04H; vector de interrupción.

RETFIE ; retorna de la interrupción

Este código de programa ejecuta un bucle infinito. Si habilitamos una de las interrupciones del 16F84, en cuanto ésta se produzca pasará el control al programa situado en la dirección 04H y la instrucción RETFIE regresa de la interrupción.

Al ejecutarse una interrupción, el bit GIE del registro INTCON se pone a 0 y así evita que otra interrupción se produzca mientras ya está con una en marcha.

Con la instrucción RETFIE ponemos de nuevo el bit GIE a 1 para así atender de nuevo a futuras interrupciones.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

RETLW (hex = 34 kk)

Descripción:

Retorno de subrutina y carga literal k en el acumulador.

Operación:

RETORNO con W = k.

Esta instrucción retorna de una subrutina al programa principal, cargando el acumulador “W” con el literal “k”.

Es la última instrucción que forma una subrutina (al igual que RETURN).

¿Y para qué me sirve regresar de una subrutina con un determinado literal en el acumulador? Nos será muy útil al programar con TABLAS.

Ejemplo:

CALL SUBRUT1 ; llama a Subrut1.

MOVWF DATO 1 ; carga W en Dato1.

CALL SUBRUT2 ; llama a Subrut2.

MOVWF DATO2 ; carga W en Dato2.

*

*

SUBRUT1 RETLW 0A ; carga W = 0A y retorna.

SUBRUT2 RETLW 0B ; carga W = 0B y retorna.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

RETURN (hex = 00 08)

Descripción:

Retorno de subrutina.

Operación:

RETORNO.

Esta instrucción retorna de una subrutina al programa principal en la instrucción siguiente a la llamada de la subrutina, tomando el valor almacenado en el stack para continuar.

Es la última instrucción que forma una subrutina (al igual que RETLW).

Ejemplo:

CALL COMPARA ; llama a Compara.

INSTRUCCION1

INSTRUCCION2

*

*

COMPARA INSTRUCCIÓN R1

INSTRUCCIÓN R2

RETURN

Aquí llamamos a la subrutina COMPARA, se ejecutan las instrucciones R1 y R2 y con el RETURN regresa a la instrucción siguiente al CALL y ejecuta las instrucciones 1, 2 y sigue con el programa.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

SLEEP (hex = 00 63)

Descripción:

En modo reposo..

Operación:

EN ESPERA.

Esta instrucción detiene la ejecución del programa y deja el PIC en modo suspendido.

No ejecuta ninguna instrucción hasta que sea nuevamente reinicializado (reset).

Durante este modo, el contador del Watch Dog (WDT) sigue trabajando, y si lo tenemos activado el PIC se reseteará por este medio.

El consumo de energía es mínimo.

Ejemplo:

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

SUBLW k (hex = 3C kk)

Descripción:

Resta al literal k el valor del acumulador.

Operación:

W = k – W

Esta instrucción resta al literal k el valor almacenado en el acumuladorW” y el resultado se guarda en el acumulador.

Ejemplo:

MOVLW 10 ; carga el acumulador W con el valor 10.

SUBLW 15 ; resta a 15 el valor del acumulador.

Al final el acumulador tendrá el valor W = 5.

Registro STATUS:

Modifica los bits Z, DC y C.

  • Z vale 1 si el resultado de la operación es 0.
  • DC vale 1 si el resultado de la operación es un número superior a 15.
  • C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

INSTRUCCIÓN:

TRIS f (hex = 00 6F)

Descripción:

Guarda el acumulador en uno de los registros de TRIS.

Operación:

TRIS de f = W.

Esta instrucción guarda el valor del acumulador “W” en uno de los registros especiales de TRIS que indicamos en el parámetro “f”.

Los registros TRIS determinan el funcionamiento como entrada y salida de las líneas I/O del PIC.

Ejemplo:

MOVLW 16H ; carga el acumulador W con el valor 16H.

TRIS PORTA ; carga el registro PORTA con el acumulador.

Esta instrucción existe para mantener la compatibilidad con los PIC producidos anteriormente,y como en el futuro podría dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma (aunque ocupa más memoria…):

BSF STATUS, RP0 ; activa el banco 1.

MOVLW 16H ; carga el acumulador con el valor 16H

MOVWF TRISA ; carga el registro PORTA con W.

Registro STATUS:

No modifica ningún bit de estado.

INSTRUCCIÓN:

XORLW k (hex = 3A kk)

Descripción:

Operación lógica OR exclusivo entre el acumulador y el literal k

Operación:

W = W XOR k

Esta instrucción realiza un OR exclusivo entre el contenido del acumuladorW” y el valor del literal k. El resultado se guarda siempre en el acumulador (k es un literal, no un registro).

Ejemplo:

Si cargamos el acumulador con el binario 11110000B y hacemos un XOR con el binario 10101010B, nos quedará el resultado de la operación en el acumulador “W”.

MOVLW 11110000B

XORLW 10101010B

El resultado de la operación queda en “W” = 01011010B.

Explicación de la operación XOR:

Tenemos 4 posibles combinaciones entre dos bits

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

Vemos que si ambos bits son iguales el resultado será 0. Y si ambos son diferentes, el resultado será 1. Esta instrucción compara dos bytes, bit a bit.

Registro STATUS:

Modifica el bit Z.

  • Z vale 1 si el resultado de la operación es 0.

Deja un comentario