Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde...
Transcript of Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde...
Las Subrutinas
CCFF DPE MÓDULO DE PROYECTOS 2
La Instrucción CALL
El PIC 16f84, dentro de su set de instrucciones, y para llamar a las subrutinas, posee la instrucción CALL.Esta instrucción, lo que hace es guardar en la PILA, la dirección de retorno (que es la dirección siguiente a la que se encuentra la propia instrucción call) y luego salta a la dirección indicada en la instrucción CALL.La última instrucción que nos encontraremos en una subrutina debe ser una instrucción de retorno (RETURN ó RETLW).
CCFF DPE MÓDULO DE PROYECTOS 3
La Instrucción CALLLas 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 instrucción que modifique el valor del PC.
Las ejecución de subrutinas, como cualquier programa, pueden modificar el contenido de los registros y con toda seguridad modificarán 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 MÓDULO DE PROYECTOS 4
La Instrucción CALLSi tenemos en cuenta lo anterior, enseguida
comprenderemos que al retornar de una subrutina los valores que nos encontraremos en ciertos registros estarán corruptos y no se podrán utilizar dentro del programa principal.Por lo tanto, lo primero que se debe hacer en el programa de atención a una subrutina es salvar los contenidos de los registros que serán modificados dentro de ella; para justamente antes de retornar podamos restaurar dichos registros con sus contenidos originales (antes de efectuar el call).Gráficamente sería como sigue:
CCFF DPE MÓDULO DE PROYECTOS 5
Manejo De Una Pila AuxiliarInicio
Instrucción
Instrucción
CALL SUB_1
Instrucción
Instrucción
Fin
Secuencia deInstrucciones para
salvar los datos en lapila
PUSH
Instrucciones propiasde la subrutina
Secuencia deInstrucciones para
restaurar el valor a losregistros
POP
RETURN ó RETLW
SUBRUTINA
1
CCFF DPE MÓDULO 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 fácil ya que este micro no posee las instrucciones PUSH y POP.Además el registro W debe salvarse el primero ya que todos los demás registros deben pasar por W para el almacenamiento temporal de sus valores.Microchip recomienda la siguiente secuencia de código 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 instrucción; no modifica el R. De STATUS
SWAPF STATUS, W ; Swap R. De status y déjalo en WMOVWF STATUS_TEMP ; Salva status en el registro STATUS_TEMP
ISR ::; rutina de servicio a una interrupción ó cuerpo de subrutina:
POP:SWAPF STATUS_TEMP, W ; intercambia nibbles en el R.
; STATUS_TEMP y déjalo en WMOVWF STATUS ; copia W en el R, STATUS
SWAPF W_TEMP, F ; Swap nibbles en W_TEMP y déja el ;resultado en W_TEMP
SWAPF W_TEMP, W ;Swap nibbles en W_TEMP ;y deja el resultado en W
CCFF DPE MÓDULO DE PROYECTOS 8
Cálculo Del Tiempo de Ejecución 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 ejecución se puede calcular sumando el tiempo que tarda en ejecutarse el conjunto de instrucciones en estudio.
En el caso particular de los PIC, cada instrucción excepto las de salto consumen un ciclo máquina, siendo el periodo de dicho ciclo máquina de 4 periodos de reloj.
Si el reloj del sistema es de 4 Mhz, cada ciclo máquina ocupa justamente 1 µsegundo.
Calculemos el tiempo que tarda en ejecutarse una típica rutina de retardo.
CCFF DPE MÓDULO DE PROYECTOS 9
Diagrama De Flujo De La Subrutina
RETARDO_1
Definir variablesCONTA_1 = 00h
Decrementa CONTA_1
CONTA_1 = 0?
si
RETORNODE
SUBRUTINA
NO
CCFF DPE MÓDULO DE PROYECTOS 10
Edición De La Subrutina (1)
CCFF DPE MÓDULO DE PROYECTOS 11
Edición De La Subrutina (2)
12
Cálculo Del Tiempo de Ejecución de La Subrutina
Analicemos la subrutina:
13
Cálculo Del Tiempo de Ejecución de La SubrutinaCall RETARDO_1Clrf CONTA_1 ;se ejecuta 1 vez y tarda 1 cicloDecfsz CONTA_1,f ;1ciclo 255 veces y 2 ciclos 1 vezGoto lazo ;255 veces 2 ciclos cada vezReturn ;1 vez 2 ciclos
TOTAL DEL RETARDO : 770 CICLOSLa fórmula para el cálculo del retardo sería:
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 MÓDULO DE PROYECTOS 14
Cálculo del Tiempo de EjecuciónUna manera rápida de verificar el tiempo que tarda en ejecutarse una subrutina es ejecutándola en el simulador y utilizando el medidor de tiempos, junto con la opción de puntos de ruptura.
CCFF DPE MÓDULO DE PROYECTOS 15
Subrutina de Temporización Mejorada (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á también menor.
Desarrollemos el ordinograma de dicha subrutina:
CCFF DPE MÓDULO DE PROYECTOS 16
Subrutina de Temporización Mejorada (1)RETARDO_1
Definir variablesCONTA_1 = N h
Decrementa CONTA_1
CONTA_1 = 0?
NO
si
RETORNODE
SUBRUTINA
CCFF DPE MÓDULO DE PROYECTOS 17
Subrutina de Temporización Mejorada (2)
CCFF DPE MÓDULO DE PROYECTOS 18
Subrutina de Temporización Mejorada (3)
CCFF DPE MÓDULO DE PROYECTOS 19
Subrutina de Temporización Mejorada (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á también menor.
Desarrollemos el ordinograma de dicha subrutina:
CCFF DPE MÓDULO DE PROYECTOS 20
Cálculo Del Tiempo de Ejecución de La Subrutina
Analicemos la subrutina:
21
Cálculo Del Tiempo de Ejecución de La SubrutinaCall TEMPO_1 ;1 vez 2 ciclosmovlw N ;1 vez 1 ciclomovfw CONTA_1 ;1 vez 1 ciclodecsz CONTA_1,f ;N-1 veces 1 ciclo + 1 vez 2 ciclosGoto LAZO ;N-1 veces 2 ciclosReturn ;1 vez 2 ciclos
La fórmula para el cálculo del retardo sería:
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 MÓDULO DE PROYECTOS 22
Cálculo Del Tiempo de Ejecución 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 mínimo de temporización sería cuando N = 1 (8 ciclos), mientras que el valor máximo se obtiene cuando N= 0 (773 ciclos) ya que al almacenarse N en un registro de 8 bits, N-1 = ffh = 255d.
CCFF DPE MÓDULO 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 máximo que hemos conseguido es de 773 µsegundos. Una manera de aumentar el tiempo de ejecución es anidar una subrutina dentro de otra.Veamos su diagrama de flujo:
24
Subrutinas Anidadas – Diagrama de FlujoRETARDO_1
Definir variablesCONTA_1 = X hCONTA_2 = Y h
Decrementa CONTA_1
CONTA_1 = 0?
NO
si
CONTA_1 = X hDecrementa CONTA_2
CONTA_2 = 0?
NO
si
RETORNODE
SUBRUTINA
CCFF DPE MÓDULO DE PROYECTOS 25
Edición De La Subrutina
CCFF DPE MÓDULO DE PROYECTOS 26
Edición De La Subrutina
CCFF DPE MÓDULO DE PROYECTOS 27
Cálculo Del Tiempo De Ejecución
:
CCFF DPE MÓDULO DE PROYECTOS 28
Subrutinas Anidadas – Cálculo del tiempo de ejecución
En primer lugar calculamos el tiempo de ejecución del lazo corto:
decsz CONTA_1,f ;(X-1) veces 1 ciclo + 1 vez 2 ciclosGoto LAZO ;X-1 veces 2 ciclosPara un valor de X= 3 obtendríamos: T= 8 ciclosLas siguientes instrucciones:movlw X ;Y veces 1 ciclomovwf CONTA_1 ;Y veces 1 cicloTardan en ejecutarse 2 ciclos.Este bloque se ejecuta tantas veces como indique el lazo
externo (Y veces)
CCFF DPE MÓDULO DE PROYECTOS 29
Subrutinas Anidadas – Cálculo del tiempo de ejecución
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 ciclosGoto LAZO ;(Y-1) veces 2 ciclosReturn ;1 vez 2 ciclosAdemás deberemos sumar los tiempos consumidos en:Call RETARDO-2 ;1 vez 2 ciclosmovlw X ;1 vez 1 ciclomovwf CONTA_1 ;1 vez 1 ciclomovlw Y ;1 vez 1 ciclomovwf CONTA_2 ;1 vez 1 ciclo
CCFF DPE MÓDULO DE PROYECTOS 30
Subrutinas Anidadas – Cálculo De Tiempos
Call RETARDO_2 ;1 vez 2 ciclosmovlw X ;1 vez 1 ciclomovwf CONTA_1 ;1 vez 1 ciclomovlw Y ;1 vez 1 ciclomovwf CONTA_2 ;1 vez 1 ciclodecsz 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 ciclomovwf CONTA_1 ;Y veces 1 ciclodecsz CONTA_2,f ;(Y-1) veces 1 ciclo + 1 vez 2 ciclosGoto LAZO ;(Y-1) veces 2 ciclosReturn ;1 vez 2 ciclos
CCFF DPE MÓDULO DE PROYECTOS 31
Subrutinas Anidadas – Cálculo De TiemposSi expresamos lo anterior como fórmula obtendríamos
la siguiente expresión:
T= Y[3(X-1)+4]+3(Y-1)+10Ó
T = Y [3(X-1)+7]+7
Por ejemplo: X = Y = 250El resultado debe ser 188507 ciclos máquina que con
un reloj de 4Mhz daría 0.1885 segundosLo anterior se puede calcular mediante el simulador.
CCFF DPE MÓDULO DE PROYECTOS 32
Subrutinas Anidadas – Cálculo De Tiempos
CCFF DPE MÓDULO DE PROYECTOS 33
Subrutinas Anidadas – Cálculo De Tiempos
Repita el programa y realice la simulación para los siguientes valores:
X = 31d, Y= 103d