las subrutinas insti/depart/electr/apuntes/files/me/curso… · el pic 16f84, dentro de su setde...
TRANSCRIPT
![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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/1.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/2.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/3.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/4.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/5.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/6.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/7.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/8.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/9.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/10.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/11.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/12.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/13.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/14.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/15.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/16.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/17.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/18.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/19.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/20.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/21.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/22.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/23.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/24.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/25.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/26.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/27.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/28.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/29.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/30.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/31.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/32.jpg)
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,](https://reader031.vdocuments.mx/reader031/viewer/2022012011/613cd41e4c23507cb635a185/html5/thumbnails/33.jpg)
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