Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde...

33
Las Subrutinas

Transcript of Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde...

Page 1: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

Las Subrutinas

Page 2: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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).

Page 3: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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).

Page 4: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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:

Page 5: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 6: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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.

Page 7: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 8: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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.

Page 9: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 10: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 10

Edición De La Subrutina (1)

Page 11: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 11

Edición De La Subrutina (2)

Page 12: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

12

Cálculo Del Tiempo de Ejecución de La Subrutina

Analicemos la subrutina:

Page 13: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 14: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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.

Page 15: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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:

Page 16: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 17: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 17

Subrutina de Temporización Mejorada (2)

Page 18: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 18

Subrutina de Temporización Mejorada (3)

Page 19: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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:

Page 20: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 20

Cálculo Del Tiempo de Ejecución de La Subrutina

Analicemos la subrutina:

Page 21: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 22: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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.

Page 23: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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:

Page 24: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 25: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 25

Edición De La Subrutina

Page 26: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 26

Edición De La Subrutina

Page 27: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 27

Cálculo Del Tiempo De Ejecución

:

Page 28: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucció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)

Page 29: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 30: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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

Page 31: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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.

Page 32: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

CCFF DPE MÓDULO DE PROYECTOS 32

Subrutinas Anidadas – Cálculo De Tiempos

Page 33: Las Subrutinas insti/depart/electr/apuntes/files/ME/curso… · El PIC 16f84, dentro de su setde instrucciones, y para llamar a las subrutinas, posee la instrucción CALL. Esta instrucción,

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