You are on page 1of 15

1

EMP
Electrnica
microprogramable
Practica 02:
Programacin para contar tiempo.
Autor: Jess Sorroche Cuerva
Introduccin: En esta prctica utilizaremos la instruccin DECFSZ y NOP como conta-
dor, y calcular el tiempo que tardara en ejecutar cada instruccin.
.
Anlisis: Se estudiar a partir del simulador Proteus paso a paso como se controla el
tiempo de ejecucin de cada instruccin.
Implementacin: En esta prctica se utiliz el simulador Proteus y osciloscopio para
compara el resultado terico con el prctico.
Pruebas: En esta prctica se utiliz el simulador, despus la aplicamos a la prctica con
pickit2.
Comentario: En esta prctica se ampli el ejemplo para estudiar con ms profundidad
con la instruccin NOP con permiso y supervisin del profesor la cual no inclua en el
enunciado.
2
EMP
Estudio de tiempo de ejecucin de cada instruccin a travs de la instruccin
DECFSZ y NOP
En esta prctica se estudiar el tiempo de ejecucin de cada cdigo a travs del contador
con la instruccin DECFSZ y NOP la cual se expondr el signifcado de cada uno:
3
EMP
Cuando iniciamos el microcontrolador , la pri-
mera instruccin que va a ejecutar ser org
0x00 que es una directiva que indica en que
direccin va a comenzar la instruccin, para
saltar el vector de reset, que no vamos a con-
tar aqu., La instruccin que va a leer es el
bsf STATUS, RB0, que activar el bit 5 del
registro STATUS para indicar que va a acce-
der al banco 1 para confgurar el puerto B.
La siguiente instruccin carga el valor literal .o
que es .0 en decimal al registro W , ante de
transferir al registro TRISB para indicar que
el puerto B se comporte como salida.
Aqu explicaremos paso a paso para el estudio de cada instruccin que hemos expuesto
antes, el comportamiento de un contador.
4
EMP
Ya mencionado anteriormente en este mo-
mento el registro W ya esta cargado con el
valor B00000000, y la siguiente instruccin
prepara para cargar al registro TRISB.
El registro TRISB ya esta confgurado como
salida, y al mismo tiempo pone el bit RP0 del
registro STATUS a 0 para acceder al banco
0 y trabajar con el puerto B.
5
EMP
Aqu vemos con detalles el cambio del valor
hexadecimal del registro STATUS cuando
cambio el BIT 5 del RP0, de 3Ch a 1Ch, a
la siguiente instruccin toca transferir el valor
0x00 al registro W `para que lo puerto de
salida B se ponga todo a nivel bajo.
Como el registro W estaba a 0 anterior-
mente no se ve ningn cambio o sea que se
a sobreescrito otra vez con el valor 0, y la
siguiente instruccin prepara para enviar el
nivel o a todas las salidas del puerto B.
6
EMP
A la siguiente instruccin carga el valor literal
0xFF al registro W, que es el valor 256 en
decimal que ser para cargar el contador que
se decrementar 256 veces hasta llegar a 0.
Aqu vemos el valor 256 que es b0000000
en el registro W que est preparada para
transferir al registro Contador que esta en la
direccin 0x20 de la memoria de propsito
general.
7
EMP
Ya cargado el valor en la direccin 0x20 en
la memoria, proceder a leer la instruccin
DECFSZ Contador que decrementar el va-
lor del registro Contador a una unidad hasta
0, pero hasta que el valor del contador no lle-
gue a cero no saltar la dos siguiente instruc-
cin que ser que ejecute la otra instruccin.
Como el contador no ha llegado a 0, salta a
la siguiente instruccin que es GOTO que
indicar que salte a la etiqueta Repet1 y as
repetir hasta 256 veces. y calculando esto
como cada instruccin tarda en ejecutarse 1
us para el micro 16f628 a 4 Mhz, por el oscila-
dor interno y la de salto suele ejecutar 2 ciclo,
con la formula siguiente:
Total: (1c + 2c)*(256 -1) +)c = 764 us.
8
EMP
Ya llegado el registro Contador a 0, saltar
de la instruccin goto Repet1, y leer la si-
guiente instruccin que cargar el valor 0x01
al registroW para poner el bit a 1 del puerto
RB0 .
Ya cargado el valor literal, proceder a trans-
ferir el valor al puerto de salida a 1.
9
EMP
Aqu acabamos de ejecutar todas las instruc-
ciones para nuestro estudio, la que entrar en
el bucle infnito la cual se detendr el micro-
procesador.
En la imagen de la derecha
vemos la ejecucin de la si-
mulacin, pero como trabaja
a microsegundo, no podemos
ver el cambio de estado, as
que he planteado de hacer
algo para ampliar el estudio
de los tiempo de las instruc-
ciones.
10
EMP
Los calculos para saber el tiempo que tarda en ejecutarse con la instruccin DECFSZ es:
Total: (1c + 2c)*(256 -1) +)c = 764 ciclos para el valor hexadecimal 0xFF del contador.
Total: (1c + 2c)*(170 -1) +)c = 512 ciclos para el valor hexadecimal 0xAA del contador
es el tiempo que tarda la instruccin en decrementar hasta llegar a 0.
Aqu vemos la imagen del montaje con su osciloscopio que cada vez que pulse el reset
genera el tiempo completo hasta que se active el puerto RB0 a 1. Las dos imgenes
del osciloscopio se ve el tiempo en us con los dos valores diferente del contador 0xFF y
0xAA respectivamente.
11
EMP
;)Presentacion-------------------------------------------------------------------------------------------
; FICHERO: P03_Contador.ASM
; DESCRIPCIN: Estudio de contador con instruccin de decremento de registro
; Ejecutar simulacin paso a paso.
; HARDWARE: Slo microcontrolador 16F628A
; SOFTWARE: Carga, movimiento y procesamiento de algunos datos
; VERSIN: 1.0.
; FECHA: 26 de febrero de 2014.
; AUTOR: Jess Sorroche Cuerva.
;(------------------------------------------------------------------------------------------------------
;)---------Directivas de confguracin-------------------------------------------------------------------
list p=16f628A ;Declaramos el procesador
#INCLUDE <p16f628aSorroche.INC> ;Se aade el include a la fuerza para...
; ...confguracin interna del micro como relog..
; ...interno y desactivar watchdog.
__confg _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF
;(------------------------------------------------------------------------------------------------------
;)Programa principal------------------------------------------------------------------------------------
;)---Declaramos variables-------------------------------------------------------------------------------
Contador equ 0x20 ;Denominamos Contador al contenido de la posicin 20h de RAM.
;(------------------------------------------------------------------------------------------------------
;)---Direciones de carga---------------------------------------------------------------------------------
org 0x00 ;Direccin inicial de carga del programa.
;(------------------------------------------------------------------------------------------------------
;)---Confguracion de puerto B---------------------------------------------------------------------------
bsf STATUS, RP0 ;Pasamo a Banco 1 para establecer I/O en trasx. 1c.
movlw .0 ;Preperamos palabra de control I/O -> RB7....RB0 salidas. 1c.
movwf TRISB ;Establecemos pines I/O. 1c.
bcf STATUS,RP0 ;Volvemos a Banco 0 para controlar PORTx. 1c.
;(------------------------------------------------------------------------------------------------------
;)---Acciones Iniciales----------------------------------------------------------------------------------
movlw 0x00 ;Carga del valor literal b00000000 al registro W. 1c.
movwf PORTB ;para poner los registros del puerto B a 0 para que no se active ninguno. 1c.
Inicio:
movlw 0xAA ;Cargamos el valor, entre 1 y 255, que controla duracin. 1c...
movwf Contador ;..a la memoria de propopsito general. 1c.
Repet1 decfsz Contador ;Descontamos, retarda normalmente 1c, pero 2c cuando acaba.
goto Repet1 ;Contador no es 0, por tanto, segimos descontando. Esto aade un...
;...retardo de 2c.
;Total: (1c + 2c)*(Contador -1) +)c = 764 ciclos para 0xFF; Con 0xAA sale 512
;Pero sumando ms las instrucciones anteriores deldespus del reset.
movlw 0x01 ;Carga el valor literal b0000001 al registro W...
movwf PORTB ;...para activar el bit RB0 del puerto B.
;--Acciones repetidas incondicionalmente----------------------------------------------------------------
Repet goto Repet ;Como la frecuencia esta trabaja a 4Mhz, y cada instruccun tiene 4 ciclo de reloj...
;...entonces cada pulso esta a 1 Mhz y a pasar a segundo esta a 1 micresegundo...
;...y calculando el tiempo del contador con la formula se multiplica, los ciclo...
;... de instrucciones, nos dara la duracin del nivel del puerto RB0.
;)--Final del cdigo------------------------------------------------------------------------------------
end ;Indicamos el fnal de las instrucciones.
;(------------------------------------------------------------------------------------------------------
Aqu vemos los cdigo completo de la prctica que hemos expuesto anteriormente.
12
EMP
;)---Acciones Iniciales----------------------------------------------------------------------------------
movlw 0x00 ;Carga del valor literal b00000000 al registro W. 1c.
movwf PORTB ;para poner los registros del puerto B a 0 para que no se active ninguno. 1c.
Inicio:
movlw 0xFF ;Cargamos el valor, entre 1 y 255, que controla duracin. 1c...
movwf Contador ;..a la memoria de propopsito general. 1c.
Repet1 decfsz Contador ;Descontamos, retarda normalmente 1c, pero 2c cuando acaba.
goto Repet1 ;Contador no es 0, por tanto, segimos descontando. Esto aade un...
;...retardo de 2c.
;Pero sumando ms las instrucciones anteriores deldespus del reset.
movlw 0x01 ;Carga el valor literal b0000001 al registro W...
movwf PORTB ;...para activar el bit RB0 del puerto B.
movlw 0xAA ;Cargamos el valor, entre 1 y 255, que controla duracin. 1c...
movwf Contador1 ;..a la memoria de propopsito general. 1c.
Repet2 decfsz Contador1 ;Descontamos, retarda normalmente 1c, pero 2c cuando acaba.
goto Repet2 ;Contador no es 0, por tanto, segimos descontando. Esto aade un...
;...retardo de 2c.
;Total: (1c + 2c)*(Contador -1) +)c = 764 ciclos.con 0xAA sale 512
;
movlw 0x00 ;Carga el valor literal b0000000 al registro W...
movwf PORTB ;...para desactivar el bit RB0 del puerto B.
goto Inicio
En la siguiente prueba hemos hecho un ciclo repetitivo de la misma instruccin pero aadien-
do otro contador, pero para poner a nivel bajo del puerto B lo cual crea una seal cuadrada,
pero para ser ms preciso cargamos el valor 0xFF para el contador con la salida del puerto
B a nivel alto, y 0xAA para la salida del puerto B a nivel bajo, lo que sale el tiempo a 764 us y
512 us respectivamente, como se ve en la imagen de abajo.
En la imagen de arriba vemos la seal generada por la instruccin repetitiva GOTO.
13
EMP
0xAA sale 512
;
movlw 0x00 ;Carga el valor literal b0000000 al registro W...
movwf PORTB ;...para desactivar el bit RB0 del puerto B.
;--Con instrucciones NOP---------------------------------------------------------------
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
movlw 0x01 ;Carga el valor literal b0000001 al registro W...
movwf PORTB ;...para activar el bit RB0 del puerto B.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
movlw 0x00 ;Carga el valor literal b0000000 al registro W...
movwf PORTB ;...para desactivar el bit RB0 del puerto B.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
movlw 0x01 ;Carga el valor literal b0000001 al registro W...
movwf PORTB ;...para activar el bit RB0 del puerto B.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
movlw 0x00 ;Carga el valor literal b0000000 al registro W...
movwf PORTB ;...para desactivar el bit RB0 del puerto B.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;--Acciones repetidas incondicionalmente----------------------------------------------------------------
Repet goto Inicio ;Como la frecuencia esta trabaja a 4Mhz, y cada
En el mismo cdigo de la prctica
del contador aadimos 10 instruc-
ciones NOP que signifca no opera
que es una instruccin que no hace
nada y que no afecta los registro de
estados, que se utiliza para consu-
mir tiempo, como por ejemplo para
sincronizar un dispositivo o una se-
al., pero como tiene que activar
los puertos B hay que aadir dos
instrucciones de salida de datos del
puerto como vemos en la derecha
resaltado en rojo, como cada ins-
truccin tarda 1 microsegundo con
el oscilador interno del PIC 16f628
a 4 Mhz, a la vez que cada instruc-
cin consume 4 ciclo, lo que quiere
decir que cada instruccin ejecuta a
1 Mhz, y su tiempo es 1 us, y en to-
tal de 12 instrucciones de la imagen
de la derecha cada impulso tarda en
total 12 us.
14
EMP
En esta imagen se ven los impulso de nivel alto con el contador con el valor 0xFF de
nivel alto juntos con varios impulso con la instruccin NOP que no se muestra bien en el
osciloscopio con la escala de 200 ms.
Aqu vemos la sea de 765 us que cargamos el valor 0xFF del registro contador de la memo-
ria, juntos las dos impulso de 12 us de la instruccin NOP.
En esta imagen vemos una de las pruebas del impulso de 765 us que nos sale el valor exacto
con los calculo que viene explicado en los comentarios de los cdigo ensamblador.
15
EMP
Aumentando la escala del osciloscopio a 5 us
se puede apreciar los impulso de 12 us que
son justo las 12 instrucciones que compone ,
lo que son 10 instrucciones de NOP ms dos
instruccin de carga del puerto B activando a
nivel alto y bajo como se ve en la imagen.
En esta prctica se trabaj con el Proteus, pickit2 y el protoboard simultneamente, la cual al
principio no saba que funcionaba de esa manera, consiste en cuando se compilaba el Pro-
teus, el cdigo se cargaba automticamente al microcontrolador 16f628 a travs del PICKIT2
dejando el programa abierto del mismo con el fchero . HEX cargado, el nico que haba que
aadir un pequeo circuito con un diodo para evitar que la tensin del programador pase a la
alimentacin del USB.

You might also like