Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivo
Realizar programas con retardos, bucles y toma de decisiones en lenguaje ensamblador para el microcontrolador PIC16F877A
usando el simulador Proteus
II.
Fundamento Terico
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:
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.
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:
CICLOS
la carga de k en W
1c
la carga de W en el contador
1c
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
;
;
;
;
;
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
;
;
;
CNTMSEC, f
;
cuando llega a cero
MSLOOP
; vuelve a realizar el bucle
Ejemplo
a. Diagrama Esquemtico
Componentes PROTEUS
IV.
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.
ii.
Para los programas resueltos de la 1ra y 2da firma, imprimir la siguiente informacin:
iii.
Enunciado
Diagrama de Flujo
iv.
Conclusiones