Sei sulla pagina 1di 8

Diseo con microcontroladores PIC en lenguaje Ensamblador

Docente: Ing. Roger Guachalla Narvez


xoroger@yahoo.es

PRACTICA 02: Programacin en Ensamblador


I.

Objetivo
Realizar programas con retardos, bucles y toma de decisiones en lenguaje ensamblador para el microcontrolador PIC16F877A
usando el simulador Proteus

II.

Fundamento Terico

Tcnicas de programacin en ensamblador

Aritmtica
Dentro de los microcontroladores PIC se cuenta con instrucciones aritmticas:
Para efectuar operaciones de suma:
o ADDWF f,d Suma el valor de w al registro f guardndolo en w o f
o ADDLW k Suma el valor de w al literal k guardndolo en w
Para efectuar operaciones de resta:
o SUBWF f,d Resta al valor del registro f el valor de w (f-w) guardndolo en w o f
o SUBLW k Resta al valor del literal k el valor de w (k-w) guardndolo en w
Para realizar multiplicaciones por 2.
o RLF f,d
Rota a la izquierda el valor del registro f guardndolo en w o f
Para realizar divisiones entre 2.
o RRF f,d
Rota a la derecha el valor del registro f guardndolo en w o f
Hasta este punto podramos ver el conjunto de instrucciones un poco limitado. Sin embargo, utilizando las tcnicas apropiadas de
programacin podemos obtener operaciones ms complejas.
Restar del acumulador
Para restar un valor al acumulador se utiliza ADDLW y se le suma el complemento a 2 del valor a restar.
Ejemplo: Restar w - 1
Para restar 1 al acumulador se utiliza ADDLW 0xFF, en lugar de SUBLW 0x1 porque esta instruccin no resta el literal a w, sino al revs,
al literal le resta w. Por lo tanto para restar un literal de w debemos sumar el complemento a 2 del literal con w, en nuestro caso el
literal es 1 (0000 0001 b) y el complemento a 2 de 1 es FF h:
0000 0001
1111 1110
+1
----------1111 1111 (FF h)

Banderas (Flags)
Las banderas se utilizan para dar informacin adicional cuando se realizan operaciones lgicas y aritmticas dentro del
microcontrolador. As, podremos tomar decisiones segn el valor de cada una de las banderas. Existen diferentes tipos de banderas en
un microcontrolador:

Las banderas en la suma


Los registros bsicos del microcontrolador PIC16F877A tienen una longitud de 8 bits expresados en forma binaria, lo cual quiere decir
que el nmero mximo expresado en forma decimal ser el 255. En la suma existen tres tipos de banderas que pueden
proporcionarnos mayor informacin del resultado. Estas banderas son denominadas CARRY (C), Acarreo de Dgito (DC) y el Estado Cero
(Z). Todas estas banderas son activadas segn sea el caso.
Por ejemplo, en la suma, la bandera CARRY se coloca en "1" cuando el resultado supera el nmero 255 y permanecer en "0" indicando
que no se present ningn overflow; es decir que el resultado de la suma fue menor que el mximo permitido.
Por otro lado, existe otra bandera denominada Acarreo de Dgito DC que expresa lo que sucede con los 4 Bits menos significativos; es
decir, si los cuatro bits menos significativos sobrepasa al nmero 15 (2 elevado a 4, incluyendo el cero) expresado en forma decimal,
entonces la bandera DC = 1, en el caso contrario ser "0". Finalmente la bandera de estado Z se activa cuando la operacin aritmtica
da como resultado un "1"; de lo contrario se coloca en "0".

Las banderas en la resta


En la resta de dos nmeros la bandera CARRY (C) se coloca en "1" cuando el resultado de la operacin sea un nmero positivo, o se
pone en cero para el caso contrario. Esto sencillamente quiere decir por ejemplo que si tenemos A=20 y B=10 donde X=A-B; el
resultado ser X=10 (nmero positivo)y C=1; para el caso contrario si tenemos A=10 y B=20 donde X=A-B entonces X= - 10,
obtenindose un resultado negativo y C=0.
La bandera de acarreo de dgito DC se colocar en "1" cuando los cuatro bits menos significativos del registro w sea menor que los
cuatro bits menos significativos del registro que se desea restar, en caso contrario se colocar un cero. La bandera de estado Z
solamente se activar cuando ambas cantidades sean iguales.

Operaciones de comparacin
Las operaciones de comparacin utilizan la instruccin de resta. La resta no es ms que sumar al minuendo el complemento a 2 del
sustraendo.

Igualdad
Supongamos que estamos intentando determinar si un nmero es igual a 2.
MOVLW .2
SUBWF N, W
; W = N - 2
BTFSS STATUS, Z
GOTO NO_ES_IGUAL
GOTO ES_IGUAL
Al nmero a comprobar (N) se le resta la cantidad de comparacin (2) que se ha guardado en W. El resultado vuelve a guardarse en W
para salvaguardar la variable N. Finalmente se comprueba la bandera Zero del registro Status.

Mayor que y menor que


Supongamos que estamos intentando determinar si un nmero mayor o menor de 2.
MOVLW .2
SUBWF N, W
; W = N - 2
BTFSS STATUS, C
GOTO MENOR
GOTO MAYOR_IGUAL

Aqu se comprueba la bandera C. Si Carry es 1 el resultado es positivo y si es 0 es negativo. As, si N<2 entonces el programa va a
MENOR. Si N es igual o mayor a 2 se salta a MAYOR_IGUAL.
As, el cdigo anterior:
N<2 MENOR
N>=2 MAYOR_IGUAL
Otra posibilidad es la siguiente:
MOVF N, W
SUBLW .2 ; W = 2 - N
BTFSS STATUS, C
GOTO MAYOR
GOTO MENOR_IGUAL

Bifurcaciones
if - else

A=10
If

A>=20 then
. Opcin por verdadero

Else
. Opcin por falso
Endif

do - case
Do case
Case A=1
. Instrucciones
Case A=10
. Instrucciones
CaseElse (Si no es ninguno de los anteriores)
. Instrucciones
Endcase

while
while(b=0)
me quedo ac adentro hasta que B=0
wend

movlw
.10
movwf
A
movlw
.20
subwf
A,W
btfss
STATUS,C
goto
Falso
Verdadero:
;Opcin por verdadero
goto
Listo
Falso:
;Opcin por falso
Listo:

movlw
.1
xorwf
A,W
btfss
STATUS,Z
goto
skip1
;Instrucciones para A=1...
goto
FinalCase
skip1:
movlw
.10
xorwf
A,W
btfss
STATUS,Z
goto
skip10
;Instrucciones para A=10...
goto
FinalCase
skip10:
;Instrucciones para CaseElse
FinalCase:
;...

Bucle:
movf
btfss
goto
SalirBucle:

B,F
STATUS,Z
Bucle
;...

for
For K=1 to 10 step 1
. Instrucciones
Next K

movlw
.1
movwf
K
BucleFor:
;Instrucciones
incf
K, F
movf
K, W
xorlw
.10
btfss
STATUS,Z
goto
BucleFor
;...

Temporizacin
Hay veces en las que se necesita introducir ciertos retardos de tiempo. Los retardos de tiempo se pueden obtener mediante hardware o
por medio de ciclos repetitivos basados en software.
Los retardos de tiempo basados en software se realizan mediante un bucle e incrementando o disminuyendo un contador que cuando
pase por cero har que salgamos de la condicin.
Como ya sabemos, un ciclo mquina es el tiempo utilizado por el microcontrolador para realizar sus operaciones internas y equivale a 4
ciclos de reloj u oscilador.
Por tanto:
Tciclo mq. = 4 * Tosc
Tciclo mq. = 4 / fosc
Como cada instruccin necesita 4 ciclos de reloj para que se ejecute, si usamos un cristal de 4 MHz cada instruccin ocupar 1
microsegundo, a no ser que el contador del programa se modifique.
El nmero de ciclos mquina utilizados por una instruccin para ser ejecutada depende de la misma. Las instrucciones que modifican el
contador de programa necesitan dos ciclos mquina, mientras que todas las dems necesitan tan solo uno. De esta manera las
instrucciones de salto necesitan 2 ciclos mquina para ejecutarse.
La precisin de los retardos generados por software depende en esencia del tipo de oscilador que se utilice como base de tiempo en el
microcontrolador (la mayor precisin se obtiene de los cristales de cuarzo). La velocidad a la que se ejecuta el cdigo (instrucciones)
depende de la velocidad del oscilador y del nmero de ciclos-mquina ejecutados.
Las instrucciones necesitan 1 2 ciclos de mquina para ser ejecutadas. El hecho de generar ciclos repetitivos por medio del programa
y calcular el tiempo total de ejecucin nos ayuda a generar tiempos precisos
La siguiente figura muestra un ejemplo de ciclo repetitivo:

Este algoritmo consume ciclos de la siguiente manera:


OPERACIN

CICLOS

la carga de k en W

1c

la carga de W en el contador

1c

el decremento del contador mientras no llegue a cero k - 1


el decremento del contador cuando llegue a cero

2c

el salto a Loop

2 * (k - 1)

Total:

(3 * k) + 1

Por cada instruccin agregada debe incluirse en la cuenta total el nmero de ciclos correspondiente a dicha instruccin.
Trabajando a 4 MHz y asumiendo que k se remplaza por el valor 15 en decimal en el ejemplo tendramos un tiempo igual a:
Nmero de ciclos = (3*15) +1 = 46 ciclos mquina
Tciclo mq. = 4 / 4 Mhz = 1 s, el tiempo total entonces ser de 46 s.
Veamos como ejemplo las rutinas MSEC1 y MIC4. Con un cristal de 4 MHz, MIC4 tarda en ejecutarse 4 microsegundos y haciendo uso
de esto, MSEC1 proporciona un retardo de 1 milisegundo al ejecutar 249 veces MIC4:
MSEC1:
MIC4:

MOVLW
NOP
ADDLW
BTFSS
GOTO

0xF9
0xFF
STATUS, Z
MIC4

;
;
;
;
;

carga F9 en el acumulador 249 en decimal


por la llamada a la subrutina CALL MSEC1
substrae 1 de W
salta cuando llega a cero
si no llega a cero vuelve a restar

RETURN
Un milisegundo son 1000 microsegundos, de manera que necesitamos ocupar 1000 ciclos de reloj en la subrutina, que hemos llamado
MSEC1.
El bucle MIC4 - GOTO MIC4 necesita 4 microsegundos para ejecutarse:
ADDLW toma 1 microsegundo
BTFSS toma otro microsegundo
GOTO necesita 2 microsegundos
Para restar 1 al acumulador se utiliza ADDLW 0xFF, en lugar de SUBLW 0x1 porque esta instruccin no resta el literal a w, sino al
revs, al literal le resta w. Por lo tanto para restar un literal de w debemos sumar el complemento a 2 del literal con w, en nuestro caso
el literal es 1 (0000 0001 b) y el complemento a 2 de 1 es FF h:
0000 0001
1111 1110
+1
----------1111 1111 (FF h.)
Despus de restar, la subrutina MIC4, comprueba la bandera Z en el registro STATUS, que ser puesto a uno cuando la resta sea 0. La
comprobacin del bit tarda un microsegundo a menos que se realice el salto, en cuyo caso se efecta en 2 microsegundos.
Ciclos de instruccin (c) de la subrutina:

ETIQUETA INSTRUCCIN

CICLOS

MSEC1

MOVLW 0xF9

1c

NOP

1c

ADDLW 0xFF

1c

MIC4

BTFSS STATUS,Z 1c, 2c al saltar TOTAL MIC4 => (249 * 4c) + 1c = 996 c
GOTO MIC4

2c

RETURN

2c
Total, 1000 c

Como puede observarse despus de ejecutar CALL MSEC1 transcurrirn 1000 ciclos de reloj, esto es 1 milisegundo antes de pasar a la
siguiente instruccin. La subrutina no utiliza ningn registro aparte de w. Para periodos de tiempo ms largos debern utilizarse
registros.
La siguiente rutina es llamada con el nmero de milisegundos que debern transcurrir dentro del acumulador segn el valor de la
variable CNTMSEC. Hace uso de la rutina MIC4. Se pueden realizar retardos de hasta un cuarto de segundo (1 - 255 msec):
NMSEC:
MSLOOP:
CALL
NOP
NOP
DECFSZ
; salta
GOTO
RETURN

III.

MOVWF
MOVLW
MIC4

CNTMSEC
0xF8

; mueve W al registro msec


; cuenta 8 microsegundos por encima
248 * 4 + 2 = 994
realiza el resto del bucle
aade 6 microsegundos
decrementa el contador

;
;
;
CNTMSEC, f
;
cuando llega a cero
MSLOOP
; vuelve a realizar el bucle

Ejemplo
a. Diagrama Esquemtico

Componentes PROTEUS

b. Archivo fuente Ensamblador .asm

IV.

Procedimiento Experimental en Laboratorio


Modificando, si es necesario, el circuito esquemtico realizar los siguientes programas en lenguaje ensamblador:

Primera Firma
Modificar el programa del Ejemplo para realizar un efecto de luces donde un 2 leds encendidos en los extremos (b0 y
b7) se desplazan hacia el centro hasta encontrarse (b3 y b4) para luego alejarse hasta llegar al extremo nuevamente.
El proceso se repite constantemente. La velocidad del efecto de luz est controlada por un micro switch en RC.0. Si
est en 1 la velocidad es Alta y en 0 la velocidad es Baja.

Segunda Firma:
El DOCENTE o AUXILIAR DE DOCENCIA asignar el INCISO a realizar

Listado de incisos:

a)

Realizar un programa que sea alarma de automvil, un led en RD.0 indica que est en funcionamiento, hay dos sensores
(switches) en RC.0 y en RC.1, si alguno de los dos se pone a 1, entonces se dispara la alarma , la alarma es un intermitente
en 8 leds (cada 200 milisegundos) en el puerto RB, la alarma se apaga poniendo RC.2=1

b)

Realizar un juego de atrapar la luz. El puerto RC ser entrada (8 micro switch), y el puerto RB ser salida (8 leds), que
realizar la siguiente secuencia cada 100 milisegundos: 00000001 00000010 00000100.... 100000000 00000001 y si el
interruptor del bit que acciones en RC es igual a la posicin bit del led que se visualiza por RB, entonces se iluminan todas
las luces del puerto RD

c)

Realizar un programa que indique la comparacin entre dos nmeros que ingresan por el puerto RC. El primer nmero se
encuentra en el nibble bajo (b0b3) y el segundo en el nibble alto (b4b7). Si el primer nmero es mayor al segundo se
enciende un led en RD.0, si el primer nmero es menor al segundo se enciende un led en RD.1, si ambos nmeros son
iguales entonces un led es intermitente (cada 250 milisegundos) en RD.2

V.

Informe de laboratorio
i.

Firmas en la Cartula (0, 1 o 2) que avalen los incisos realizados en Laboratorio

ii.

Para los programas resueltos de la 1ra y 2da firma, imprimir la siguiente informacin:

iii.

Enunciado

Descripcin del funcionamiento del Programa

Diagrama de Flujo

Cdigo Fuente Ensamblador TOTALMENTE comentado

TRABAJO DE INVESTIGACIN: Microcontrolador de gama mejorada PIC18F4550


Caractersticas generales
Perifricos incorporados
Comparacin con la gama media PIC16F877A
Conjunto de instrucciones
Caractersticas tcnicas PIC18F4550
Aplicaciones
El trabajo de investigacin debe incluir:
Resumen escrito a mano (de un mnimo de 6 pginas)
Fuentes de Informacin Impresas (direcciones web, bibliografa)

iv.

Conclusiones

Potrebbero piacerti anche