Sei sulla pagina 1di 11

Curso de Electrnica y Microcontroladores PIC

Csar Antonio Saldas Caro.


www.ingenieropic.wordpress.com
Parte 9 Operaciones aritmticas.
Antes de adentrarnos en el tema de las operaciones aritmticas, es importante
explicar algunos conceptos y trminos.
El registro de trabajo W
El registro de trabajo W (Work) es el registro principal del microcontrolador,
este participa en la mayora de las instrucciones.
El microcontrolador posee una ALU (Arithmetic Logia Unit) la cual es de 8 bits.
Esta ALU realiza las operaciones aritmticas que requiere la ejecucin del
programa con dos operandos, uno de ellos proviene del registro W y el otro se
encuentra en cualquier otro registro o en el mismo cdigo fuente de
instrucciones.
La descripcin que acabo de darles acerca del registro W es muy pequea, sin
embargo iremos analizando y utilizando este registro mas adelante.
El registro STATUS
Este registro es uno de los ms importantes y utilizados dentro de la memoria
del microcontrolador. Los bits de este registro indican el estado de la ltima
operacin aritmtica o lgica que se ha realizado, la causa de reset y los bits
que nos permiten seleccionar el banco en el que queremos situarnos. A los bits
del registro STATUS se les suele denominar flags o banderas.
A continuacin explicar los bits ms importantes, los cuales emplearemos en
esta parte del curso.
Los bits RP0 y RP1 fueron explicados en la parte 2 de este curso, en donde
vimos claramente que estos bits eran utilizados para posicionarnos en un
determinado banco. Por este motivo, no los explicar nuevamente.
C (bit 0): Carry.
Este bit es el flag de acarreo en el 8vo bit. Este bit se activa en instrucciones de
suma aritmtica cuando se presenta acarreo desde el bit ms significativo del
resultado, lo que indica que el resultado de la operacin ha superado el valor
11111111 en base binaria, lo que equivale a 255 en base decimal, que es el
valor mximo que se puede representar con 8 bits.
- En la suma, si el resultado de la operacin realizada es mayor a 255, el bit C
se activa a 1, en el caso contrario el bit C permanece en 0.
- En la resta, si el resultado es negativo el bit C se activa a 0, y si es positivo se
activa a 1.
DC (bit 1): Digit Carry.
Es el flag de acarreo en el cuarto bit de menos peso. Se activa en operaciones
aritmticas cuando hay un acarreo entre el bit 3 y el cuatro, vale decir, cuando
hay acarreo entre el nibble menos significativo al ms significativo.
- Si la suma de ambos nibbles resulta mayor que 15, el bit DC se activa a 1, en
caso contrario se pone a 0.
La siguiente imagen es para despejar posibles dudas, (Aunque esto deberas
saberlo):
Z (bit 2): Zero.
Este bit es el flag de cero. Se activa cuando el resultado de una operacin
aritmtica o lgica es 0.
- Si el resultado de la operacin es cero, el bit Z se activa a 1.
- Si el resultado de la operacin es distinto de 0, el bit Z se activa a 0.
Ejemplo 1:
En Decimal= 200 +10 =210
En Hexadecimal= C8 +A =D2
En Binario= 11001000 +00001010 =11010010
Por lo tanto, al obtener el resultado 210 en una operacin aritmtica con el PIC,
el estado de los tres bits menos significativos del STATUS sera el siguiente:
C=0
DC=1
Z=0
Ejemplo 2:
En Decimal= 209 +56 =265
En Hexadecimal= D1 +38 =09
En Binario= 11010001 +00111000 =00001001
Por lo tanto, al obtener el resultado 340 en una operacin aritmtica con el PIC,
el estado de los tres bits menos significativos del STATUS sera el siguiente:
C=1
DC=0
Z=0
En este segundo ejemplo, el resultado es mayor a 255, por lo tanto el bit de
acarreo se activa a 1. En este caso, el resultado obtenido 00001001 equivale
a 9 en decimal, lo cual no corresponde a 265 que es el resultado obtenido. Sin
embargo, si le agregamos el carry nos quedara un nmero de 9 bits
100001001 que si equivale al resultado 265.
Trminos importantes
En necesario definir algunos trminos que necesitas entender antes de
continuar leyendo.
f: Cualquier registro
W: Registro de trabajo.
b: Posicin de un bit en el registro f.
d: Destino, puede ser f (d=1) o W (d=0).
k: Valor literal, ya sea decimal, hexadecimal o binario.
Instrucciones de suma
El repertorio de instrucciones del PIC 16F628A posee dos instrucciones de
suma:
addlw: AddLiteral to W.
Su forma de uso es addlw k
Esta instruccin suma el contenido del registro Wcon la literal k definida por
el usuario. El resultado es almacenado en W. Si se produce acarreo se activa
el bit C.
Ejemplo:
Veamos En la primera lnea estamos cargando el nmero 200 al registro W.
este se hace con la instruccin movlw que significa mueve la literal k a w en
donde k es el valor decimal 200. De esta manera tenemos el nmero 200
almacenado en el registro W.
Luego, utilizando la instruccin de suma addlw estamos sumando la literal k
(en este caso 10) con el nmero almacenado en W. El resultado es 210 y es
almacenado en W.
En seguida, utilizando la instruccin btfss estamos preguntando si el bit C del
registro STATUS est o no en 1. Si no est en 1 entonces salta a la etiqueta
cero, y si est en 1 salta a la etiqueta uno.
Como el resultado 210 es menor a 255, el flag C permanece en 0, por lo tanto
salta a la etiqueta cero y se enciende un LED conectado en RB0. Luego vuelve
a inicio.
A modo de prueba podemos remplazar el nmero decimal 10 por 100 por
ejemplo. Entonces el resultado sera 300. Por lo tanto el bit C se pondra a 1 y
en lugar de encenderse RB0 se activara RB7.
Ahora veamos la otra instruccin de suma del repertorio del PIC:
addwf: Add W and F.
Su forma de uso es addwf f,d
Esta instruccin suma el contenido del registro W al del registro F. Almacena el
resultado en W si d=0 y en el registro F si d=1. Si se produce acarreo el bit
C se pone a 1.
Ejemplo:
En la primera y segunda lnea estamos cargando el valor 200 a la variable
contador (La variable contador fue previamente declarada debajo del cblock).
Luego, en la tercera lnea, estamos cargando el valor 100 al registro W.
En seguida, con la instruccin addwf estamos sumando el contenido de W con
el contenido del contador (200 +10), y luego dice ,W puesto que queremos
que el resultado se almacene en W y no en la variable contador. Sera lo
mismo escribir un 0 o una W despus de la coma.
El resto es lo mismo, preguntamos si hubo carry con la instruccin btfss y el
programa enciende el LED en RB0 o RB7 segn el resultado de la operacin.
Tambin puedes modificar el valor del contador o el valor de W para producir
un acarreo y visualizar el resultado encendindose el LED correspondiente.
Instrucciones de resta
El repertorio de instrucciones del PIC posee dos instrucciones para restar. La
resta se realiza sumando en binario y sin signo.
Al restar en 8 bits el resultado no puede exceder de +127 ni de -128. El flag C
indica si el resultado es positivo (C=1) o si es negativo (C=0). Por lo tanto
pueden ocurrir tres casos:
- Resultado positivo distinto de cero. Entonces C=1 y Z=0.
- Resultado es cero. Entonces C=1 y Z=1.
- Resultado negativo. Entonces C=0 y Z=0.
Veamos la primera instruccin de resta:
sublw: Subtract W from f.
Su forma de uso es sublw k
Esta instruccin resta el valor de la literal k menos el contenido del registro W y
almacena el resultado en W.
Ejemplo:
En este ejemplo, estamos moviendo el valor 90 al registro W, y con la
instruccin sublw estamos determinando que al valor 100 le restaremos el
valor de W. En otras palabras 100 menos 90.
El resultado es 10 (Positivo distinto de cero). Por lo tanto el bit Z est en 0 y el
bit C est en 1.
Entonces con btfss preguntamos si C est o no en 1. Si no est en uno salta a
la etiqueta cero y enciende un LED en RB0, y si efectivamente est en 1,
entonces salta a la etiqueta uno y enciende un LED en RB7.
En este caso como el bit C estara en 1, el LED que se encendera es el de
RB7.
Ejemplo 2:
En este segundo ejemplo estamos restando 90 menos 90. Por lo tanto el
resultado es 0. De esta manera el bit C est en 1 y el bit Z est en 1.
Luego preguntamos si el bit Z est en uno, y como efectivamente lo est, el
LED que se enciende ser el de RB7.
Ejemplo 3:
En este caso estamos restando 90 menos 100 obteniendo -10 como
resultado (negativo). Por lo tanto el bit C est en 0 y el bit Z est en 0.
Luego preguntamos si el bit C est o no en 1 con la instruccin btfss, y como el
bit C no est en 1 sino que en 0, el LED que se enciende es el de RB0.
Ahora veamos la otra instruccin de resta.
subwf: Subtract W from f.
Su forma de uso es sublw f,d
Esta instruccin resta el contenido del registro f menos el contenido del
registro W. Almacena el resultado en W si d es cero, y en f si d es uno.
Ejemplo:
Aqu estamos cargando el valor 100 en el registro o variable contador, el cual
fue declarado previamente como variable despus de la lnea cblock.
Luego cargamos el valor 90 al registro W. La instruccin subwf resta f menos
W. Por lo tanto le estamos diciendo que reste contador menos W, dicho de
otra forma 100 menos 90. El resultado se almacena en W ya que puse una W
despus de la coma.
Como el resultado es positivo distinto de 0, el bit C est en 1. Luego
preguntamos si C est o no en 1, y como efectivamente lo est, se encender
el LED conectado en RB7.
Avanza a la siguiente pgina para ver la segunda seccin de esta parte del
curso.
Instrucciones para incrementar y decrementar
El repertorio de instrucciones del PIC tiene otras dos instrucciones aritmticas.
Una de ellas es para decrementar el valor de un registro y la otra es para
incrementarlo.
decf: Decrement f.
Su forma de uso es decf f,d
Esta instruccin se utiliza para derementar un registro en una unidad.
Almacena el resultado en W si d es cero, y en f si d es uno. El flag Z se
activa si el resultado es cero.
Ejemplo:
La variable contador ha sido declarada previamente y le estamos cargando el
valor decimal 5.
Luego con la instruccin decf estamos decrementando el contador. Despus
de contador hay una coma y dice f, por lo tanto el resultado del decremento
se almacena en el mismo registro contador y no en W, ya que la idea es que
se decremente el valor que hemos cargado en el contador.
Despus llamamos a una rutina de tiempo la cual en este caso es de 1
segundo.
Luego preguntamos si el bit Z est en 1 (osea si el resultado es cero). Si el
resultado NO es cero salta a dec y vuelve a decrementar el contador y luego
vuelve a preguntar por el estado de Z.
Como el valor del contador es 5 y la rutina de tiempo es de 1 segundo, el
contador tardar 5 segundos en decrementar su valor hasta llegar a cero,
entonces Z ser igual a 1 y se encender el LED conectado a RB0. Despus el
programa queda dando vueltas en un bucle.
Ahora avanza a la siguiente pgina para que veamos la instruccin para
incrementar.
incf: Increment f.
Su forma de uso es incf f,d
Esta instruccin incrementa un registro es una unidad. Almacena el resultado
en W si d es cero, y en f si d es uno.
Es importante mencionar que nicamente se puede incrementar hasta 255,
puesto que es el mximo valor que se alcanza con 8 bits, y si hacemos otro
incremento, el valor almacenado en el registro se desbordara volviendo a 0 y
activndose el flag Z.
Ejemplo:
El ejemplo es muy parecido al de la instruccin anterior. En este caso hemos
cargado el valor 250 al contador y luego lo incrementamos con la instruccin
incf.
Despus llamamos a la rutina de tiempo de 1 segundo y preguntamos por el
estado del bit Z.
Cuando el contador se incremente 6 veces se pasar de 255 y se desbordar,
activndose el bit Z. Como la rutina es de 1 segundo, el LED conectado en RB0
se encender luego de transcurrir 6 segundos.
Gracias por descargar este curso Csar Saldas.