Está en la página 1de 0

Las Subrutinas

CCFF DPE MDULO DE PROYECTOS 2


La Instruccin CALL
El PIC 16f84, dentro de su set de instrucciones, y
para llamar a las subrutinas, posee la instruccin
CALL.
Esta instruccin, lo que hace es guardar en la
PILA, la direccin de retorno (que es la direccin
siguiente a la que se encuentra la propia
instruccin call) y luego salta a la direccin
indicada en la instruccin CALL.
La ltima instruccin que nos encontraremos en
una subrutina debe ser una instruccin de retorno
(RETURN RETLW).
CCFF DPE MDULO DE PROYECTOS 3
La Instruccin CALL
Las subrutinas, se deben colocar entre las
primeras 256 posiciones de memoria, debido a que
el bit 8 del PC se pone a 0 si se ejecuta un CALL o
cualquier instruccin que modifique el valor del PC.
Las ejecucin de subrutinas, como cualquier
programa, pueden modificar el contenido de los
registros y con toda seguridad modificarn el
contenido del registro de STATUS.
Como ya se ha indicado anteriormente, la pila
es una zona de RAM que escapa al control del
programador, y en la cual no se pueden guardar
contenidos de registros (esto es as para los PIC).
CCFF DPE MDULO DE PROYECTOS 4
La Instruccin CALL
Si tenemos en cuenta lo anterior, enseguida
comprenderemos que al retornar de una subrutina
los valores que nos encontraremos en ciertos
registros estarn corruptos y no se podrn utilizar
dentro del programa principal.
Por lo tanto, lo primero que se debe hacer en el
programa de atencin a una subrutina es salvar los
contenidos de los registros que sern modificados
dentro de ella; para justamente antes de retornar
podamos restaurar dichos registros con sus
contenidos originales (antes de efectuar el call).
Grficamente sera como sigue:
CCFF DPE MDULO DE PROYECTOS 5
Manejo De Una Pila Auxiliar
Inicio
Instruccin
Instruccin
CALL SUB_1
Instruccin
Instruccin
Fin
Secuencia de
Instrucciones para
salvar los datos en la
pila
PUSH
Instrucciones propias
de la subrutina
Secuencia de
Instrucciones para
restaurar el valor a los
registros
POP
RETURN RETLW
S
U
B
R
U
T
I
N
A
1
CCFF DPE MDULO DE PROYECTOS 6
Salvar y Restaurar Registros (1)
A la vista del juego de instrucciones, salvar y
restaurar los registros sin modificar sus
contenidos no es fcil ya que este micro no
posee las instrucciones PUSH y POP.
Adems el registro W debe salvarse el primero
ya que todos los dems registros deben pasar
por W para el almacenamiento temporal de sus
valores.
Microchip recomienda la siguiente secuencia de
cdigo que permite salvar y restaurar los
registros sin modificarlos.
7
Salvar y Restaurar Registros (2)
PUSH:
MOVWF W_TEMP ; Copia W en TEMP register, esta instruccin
; no modifica el R. De STATUS
SWAPF STATUS, W ; Swap R. De status y djalo en W
MOVWF STATUS_TEMP ; Salva status en el registro STATUS_TEMP
ISR :
:
; rutina de servicio a una interrupcin cuerpo de subrutina
:
POP:
SWAPF STATUS_TEMP, W ; intercambia nibbles en el R.
; STATUS_TEMP y djalo en W
MOVWF STATUS ; copia W en el R, STATUS
SWAPF W_TEMP, F ; Swap nibbles en W_TEMP y dja el
;resultado en W_TEMP
SWAPF W_TEMP, W ;Swap nibbles en W_TEMP
;y deja el resultado en W
CCFF DPE MDULO DE PROYECTOS 8
Clculo Del Tiempo de Ejecucin de Una
Subrutina (1)
En numerosas ocasiones, se hace preciso calcular el tiempo que
tarda en ejecutarse un programa, o bien se desea
entretener el sistema un cierto tiempo para sincronizar
algunos eventos.
El tiempo de ejecucin se puede calcular sumando el tiempo
que tarda en ejecutarse el conjunto de instrucciones en
estudio.
En el caso particular de los PIC, cada instruccin excepto las
de salto consumen un ciclo mquina, siendo el periodo de
dicho ciclo mquina de 4 periodos de reloj.
Si el reloj del sistema es de 4 Mhz, cada ciclo mquina ocupa
justamente 1 segundo.
Calculemos el tiempo que tarda en ejecutarse una tpica rutina
de retardo.
CCFF DPE MDULO DE PROYECTOS 9
Diagrama De Flujo De La Subrutina
RETARDO_1
Definir variables
CONTA_1 = 00h
Decrementa CONTA_1
CONTA_1 = 0?
si
RETORNO
DE
SUBRUTINA
NO
CCFF DPE MDULO DE PROYECTOS 10
Edicin De La Subrutina (1)
CCFF DPE MDULO DE PROYECTOS 11
Edicin De La Subrutina (2)
12
Clculo Del Tiempo de Ejecucin de La Subrutina
Analicemos la subrutina:
13
Clculo Del Tiempo de Ejecucin de La Subrutina
Call RETARDO_1
Clrf CONTA_1 ;se ejecuta 1 vez y tarda 1 ciclo
Decfsz CONTA_1,f ;1ciclo 255 veces y 2 ciclos 1 vez
Goto lazo ;255 veces 2 ciclos cada vez
Return ;1 vez 2 ciclos
TOTAL DEL RETARDO : 770 CICLOS
La frmula para el clculo del retardo sera:
T= 255 x 3 ciclos +1 ciclo de clrf + 2 ciclos del ltimo
decfsz + 2 ciclos de return + 2 ciclos de call = 772
ciclos
CCFF DPE MDULO DE PROYECTOS 14
Clculo del Tiempo de Ejecucin
Una manera rpida de verificar el tiempo que tarda en
ejecutarse una subrutina es ejecutndola en el simulador
y utilizando el medidor de tiempos, junto con la opcin
de puntos de ruptura.
CCFF DPE MDULO DE PROYECTOS 15
Subrutina de TemporizacinMejorada (1)
Partiendo de la subrutina tempo_1, vamos a
intentar mejorarla, para ello el valor con que
iniciaremos el contador ser diferente de 0h,
evidentemente a menor valor de este
contador, el retardo ser tambin menor.
Desarrollemos el ordinograma de dicha
subrutina:
CCFF DPE MDULO DE PROYECTOS 16
Subrutina de TemporizacinMejorada (1)
RETARDO_1
Definir variables
CONTA_1 = N h
Decrementa CONTA_1
CONTA_1 = 0?
NO
si
RETORNO
DE
SUBRUTINA
CCFF DPE MDULO DE PROYECTOS 17
Subrutina de TemporizacinMejorada (2)
CCFF DPE MDULO DE PROYECTOS 18
Subrutina de TemporizacinMejorada (3)
CCFF DPE MDULO DE PROYECTOS 19
Subrutina de TemporizacinMejorada (1)
Partiendo de la subrutina tempo_1, vamos a
intentar mejorarla, para ello el valor con que
iniciaremos el contador ser diferente de 0h,
evidentemente a menor valor de este
contador, el retardo ser tambin menor.
Desarrollemos el ordinograma de dicha
subrutina:
CCFF DPE MDULO DE PROYECTOS 20
Clculo Del Tiempo de Ejecucin de La Subrutina
Analicemos la subrutina:
21
Clculo Del Tiempo de Ejecucin de La Subrutina
Call TEMPO_1 ;1 vez 2 ciclos
movlw N ;1 vez 1 ciclo
movfw CONTA_1 ;1 vez 1 ciclo
decsz CONTA_1,f ;N-1 veces 1 ciclo + 1 vez 2 ciclos
Goto LAZO ;N-1 veces 2 ciclos
Return ;1 vez 2 ciclos
La frmula para el clculo del retardo sera:
T= (N-1) x 3 ciclos +1 ciclo de movlw + 1 ciclo de movfw
+ 2 ciclos del ltimo decfsz + 2 ciclos de return + 2
ciclos de call
CCFF DPE MDULO DE PROYECTOS 22
Clculo Del Tiempo de Ejecucin de La Subrutina
Siendo N el valor cargado en el registro que hace
de contador y que se va decrementando.
Hay que tener en cuenta que el valor mnimo de
temporizacin sera cuando N = 1 (8 ciclos),
mientras que el valor mximo se obtiene cuando
N= 0 (773 ciclos) ya que al almacenarse N en un
registro de 8 bits, N-1 = ffh = 255d.
CCFF DPE MDULO DE PROYECTOS 23
Subrutinas Anidadas
En algunas ocasiones, el tiempo de retardo que nos
facilita una subrutina es insuficiente, en el caso
anterior, el retardo mximo que hemos conseguido
es de 773 segundos.
Una manera de aumentar el tiempo de ejecucin es
anidar una subrutina dentro de otra.
Veamos su diagrama de flujo:
24
Subrutinas Anidadas Diagrama de Flujo
RETARDO_1
Definir variables
CONTA_1 = X h
CONTA_2 = Y h
Decrementa CONTA_1
CONTA_1 = 0?
NO
si
CONTA_1 = X h
Decrementa CONTA_2
CONTA_2 = 0?
NO
si
RETORNO
DE
SUBRUTINA
CCFF DPE MDULO DE PROYECTOS 25
Edicin De La Subrutina
CCFF DPE MDULO DE PROYECTOS 26
Edicin De La Subrutina
CCFF DPE MDULO DE PROYECTOS 27
Clculo Del Tiempo De Ejecucin
:
CCFF DPE MDULO DE PROYECTOS 28
Subrutinas Anidadas Clculo del tiempo de ejecucin
En primer lugar calculamos el tiempo de ejecucin del
lazo corto:
decsz CONTA_1,f ;(X-1) veces 1 ciclo + 1 vez 2 ciclos
Goto LAZO ;X-1 veces 2 ciclos
Para un valor de X= 3 obtendramos: T= 8 ciclos
Las siguientes instrucciones:
movlw X ;Y veces 1 ciclo
movwf CONTA_1 ;Y veces 1 ciclo
Tardan en ejecutarse 2 ciclos.
Este bloque se ejecuta tantas veces como indique el lazo
externo (Y veces)
CCFF DPE MDULO DE PROYECTOS 29
Subrutinas Anidadas Clculo del tiempo de ejecucin
Analicemos ahora el bucle externo, que es el que
multiplica al lazo corto :
decsz CONTA_2,f ;(Y-1) veces 1 ciclo + 1 vez 2 ciclos
Goto LAZO ;(Y-1) veces 2 ciclos
Return ;1 vez 2 ciclos
Adems deberemos sumar los tiempos consumidos en:
Call RETARDO-2 ;1 vez 2 ciclos
movlw X ;1 vez 1 ciclo
movwf CONTA_1 ;1 vez 1 ciclo
movlw Y ;1 vez 1 ciclo
movwf CONTA_2 ;1 vez 1 ciclo
CCFF DPE MDULO DE PROYECTOS 30
Subrutinas Anidadas Clculo De Tiempos
Call RETARDO_2 ;1 vez 2 ciclos
movlw X ;1 vez 1 ciclo
movwf CONTA_1 ;1 vez 1 ciclo
movlw Y ;1 vez 1 ciclo
movwf CONTA_2 ;1 vez 1 ciclo
decsz CONTA_1,f ;Y(X-1 veces 1 ciclo + 1 vez 2 ciclos)
Goto LAZO ;Y(X-1 veces 2 ciclos)
movlw X ;Y veces 1 ciclo
movwf CONTA_1 ;Y veces 1 ciclo
decsz CONTA_2,f ;(Y-1) veces 1 ciclo + 1 vez 2 ciclos
Goto LAZO ;(Y-1) veces 2 ciclos
Return ;1 vez 2 ciclos
CCFF DPE MDULO DE PROYECTOS 31
Subrutinas Anidadas Clculo De Tiempos
Si expresamos lo anterior como frmula obtendramos
la siguiente expresin:
T= Y[3(X-1)+4]+3(Y-1)+10

T = Y [3(X-1)+7]+7
Por ejemplo: X = Y = 250
El resultado debe ser 188507 ciclos mquina que con
un reloj de 4Mhz dara 0.1885 segundos
Lo anterior se puede calcular mediante el simulador.
CCFF DPE MDULO DE PROYECTOS 32
Subrutinas Anidadas Clculo De Tiempos
CCFF DPE MDULO DE PROYECTOS 33
Subrutinas Anidadas Clculo De Tiempos
Repita el programa y realice la simulacin
para los siguientes valores:
X = 31d, Y= 103d

También podría gustarte