1
Tema 9. Subrutinas
PROCESO X
PROCESO X
PROCESO X
PROGRAMA PRINCIPAL (SIN SUBRUTINAS)
Algunas veces el mismo grupo de instrucciones es ejecutado en diferentes partes de un programa.
2
Tema 9. Subrutinas
call ProcesoX
call ProcesoX
call ProcesoX
ProcesoX
return
SUBRUTINA
PROGRAMA PRINCIPAL (CON SUBRUTINAS)
Una subrutina es un conjunto de instrucciones al que se tiene acceso desde cualquier punto del programa principal.
Es decir, una subrutina es un subprograma que se ejecuta cada vez que el programa principal lo necesita.
3
Tema 9. Subrutinas
La instrucción CALL (llamada a la subrutina) consigue que la ejecución del programa continúe en la dirección donde se encuentra la subrutina a la que hace referencia. Es similar a GOTO pero coloca en la pila la dirección de la siguiente instrucción que se debe ejecutar después de CALL.
La subrutina finaliza con la instrucción RETURN (Retorno de la subrutina), que retoma la dirección guardada en la pila y la coloca en el contador del programa (PC) continuando el flujo de control con la instrucción que sigue a CALL.
Las instrucciones CALL y RETURN
4
Tema 9. Subrutinas
call Proceso1
X1
PROGRAMA PRINCIPAL
SUBRUTINAS ANIDADAS
Proceso1
call Proceso2
X2
return
SUBRUTINA 1
Proceso2
call Proceso3
X3
return
SUBRUTINA 2
Proceso3
return
SUBRUTINA 3
X1
PILA
X1
PILA
X2
X1
PILA
X3
X2
X1
PILA
5
Tema 9. Subrutinas
En la familia PIC de gama media la pila tiene 8 niveles de memoria tipo LIFO (Last Input, First Output; último en entrar, primero en salir).
Si se produce la llamada a una subrutina durante la ejecución de otra subrutina; la dirección de retorno de esta segunda es colocada encima de la pila sobre la dirección anterior. Esta segunda dirección es la primera en salir de la pila mediante la instrucción RETURN.
Con una pila de 8 niveles, una subrutina puede llamar a otra y ésta, a su vez, llamar a otra hasta un máximo de ocho.
Las subrutinas deben colocarse al comienzo de las páginas debido a que el bit 8 del PC es puesto a 0 por la instrucción CALL. Las subrutinas deben colocarse en la primera mitad de las páginas (las primeras 256 palabras).
LA PILA
6
Tema 9. Subrutinas
LA PILA
7
Tema 9. Subrutinas
... …….
0A6 call Proceso
0A7 …….
... …….
... …….1B5 Proceso
... …….
... …….1C3 return
... …….
MEMORIA DE PROGRAMA
SUBRUTINAS ANIDADAS
PILA
PC0A6
Antes del
“call Proceso”
0A7
PILA
PC1B5
Al ejecutar
“call Proceso”
0A7
PILA
PCXXX
Durante la subrutina
“call Proceso”
0A7
PILA
PC1C3
Antes del
“return”
0A7
PILA
PC0A7
Al ejecutar
“return”
8
Tema 9. Subrutinas
La mayoría de los microcontroladores incluyen en su repertorio de instrucciones algunas que permiten saltar a una subrutina y, cuando se completa su ejecución, retornar al Programa Principal.
El uso de las subrutinas aporta muchas ventajas:
• Se pueden escribir como subrutinas secciones de código y ser empleadas en muchos programas (por ejemplo, la rutina de exploración de un teclado).
• Dan a los programas un carácter modular, es decir, se pueden codificar diferentes módulos para usarlos en cualquier programa.
• Se reduce notablemente el tiempo de programación y la detección de errores usando repetidamente una subrutina.
• El código es más fácil de interpretar dado que las instrucciones de las subrutinas no aparecen en el programa principal. Sólo figuran las llamadas CALL.
IMPORTANCIA DE LAS SUBRUTINAS
9
Tema 9. Subrutinas
A continuación se ofrece un ejemplo de aplicación. En muchas ocasiones hay que introducir pausas o retardos de tiempo en ciertos puntos del programa. Al repetirse estos retardos, conviene colocar su sección de código como una subrutina a la que se llama cuando se precisa un retardo.
El programa CAMINA.ASM enciende sucesivamente los LEDS conectados al puerto B. El LED que se enciende en cada momento se desplaza de derecha a izquierda y de izquierda a derecha.
EJEMPLO 1
10
Tema 9. Subrutinas
List p=16F84 ;Tipo de procesadorinclude "P16F84.INC";Definiciones de registros internos
Contador1 equ 0ChContador2 equ 0Dh
org 00hgoto Inicio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;org 05h
Inicio bsf STATUS,RP0 ;selecciona banco 1clrf TRISB ;programa la puerta B todo salidabcf STATUS,RP0 ;vuelve al banco 0clrf PORTB ;apaga los leds del puerto Bclrf Contador1 ;borra Contador1clrf Contador2 ;borra Contador2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rotacion bsf PORTB,0 ;enciende RB0
bcf STATUS,C ;bit acarreo a 0Izqda call Pausa ;llamada a subrutina Pausa
rlf PORTB,f ;rotación hacia la izquierda activa ledbtfss PORTB,7 ;si RB7=1, salegoto Izqda ;si RB7=0, continua la rotación a izquierdasbcf STATUS,C ;bit acarreo a 0
Dra call Pausa ;llamada a subrutina Pausarrf PORTB,f ;rotación hacia la derecha activa ledbtfss PORTB,0 ;si RB0=1, salegoto Dra ;si RB0=0, continua la rotación a izquierdasgoto Rotacion ;repite desde el principio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pausa clrf Contador1
clrf Contador2Bucle decfsz Contador1,f
goto Bucledecfsz Contador2,fgoto Buclereturnend
EJEMPLO 1
SUBRUTINA
11
Tema 9. Subrutinas
;*********************************** Subrutinas_02.asm;; Repetir el programa anterior de conversión de un número binario a decimal pero; utilizando la libreria BIN_BCD.INC.;
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE
Numero EQU .124 ; Por ejemplo.
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.clrf TRISB ; Líneas del Puerto B configuradas como salida.bcf STATUS,RP0 ; Acceso al Banco 0.
Principalmovlw Numerocall BIN_a_BCDmovwf PORTB ; El resultado se visualiza por la salida.goto $ ; Se queda permanentemente en este bucle.
INCLUDE ; La subrutina se añadirá al final del programa ; principal
END ; Fin del programa.
EJEMPLO 2
12
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO
Pausa clrf Contador1clrf Contador2
Bucle decfsz Contador1,fgoto Bucledecfsz Contador2,fgoto Buclereturnend
Por ejemplo:
Para un oscilador de 4 Mhz, la subrutina de retardo anterior tarda unos 0.2ms aproximadamente.
13
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO
CICLO MÁQUINA: unidad básica de tiempo que utiliza el microcontrolador. Para el PIC16F84A el ciclo máquina equivale a 4 ciclos de reloj, por lo tanto, el tiempo que tarda en producirse un ciclo máquina es igual a 4 veces el período del oscilador.
Las instrucciones en el PIC16F84A necesitan 1 ciclo máquina para ejecutarse, excepto las de salto (goto, call, btfss, btfsc, return, …) que necesitan de 2 ciclos máquina.
14
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO
El tiempo que tarda el microcontrolador en ejecutar una tarea viene fijado por la fórmula siguiente:
Tiempo=( 4 · cm) / f
Siendo:
•f, la frecuencia del oscilador
•cm, el número de ciclos máquina que tarda en ejecutar la tarea
15
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO
Instrucción NOP: no realiza operación alguna.
Consume 1 cm sin hacer nada. Se utiliza para hacer gastar tiempo al microcontrolador sin alterar el estado de los registros ni los flags.
16
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO MEDIANTE LAZO SIMPLE
Retardo_1ms ; la llamada call aporta 2 ciclos máquinamovlw d'249' ; Aporta 1 ciclos máquina. Este es el valor de "K".movwf R_ContA ; Aporta 1 ciclos máquina.
R1ms_BucleInternonop ; Aporta Kx1 ciclos máquina.decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).goto R1ms_BucleInterno; Aporta (K-1)x2 ciclos máquina.return ; El salto de retorno aporta 2 ciclos máquina.
;En total esta subrutina tarda:; 2+1+1+Kx1+(K-1)x1+2+(K-1)x2+2=5+4K=1001 cm (para K=249); 1001 cm supone 1 ms para un cristal de 4MHz
………call Retardo_1ms
………
………
Tiempo=5+4K
EJEMPLO DE SUBRUTINA DE RETARDO MEDIANTE LAZO SIMPLE
17
Tema 9. Subrutinas
SUBRUTINAS DE RETARDO MEDIANTE LAZOS ANIDADOS
EJEMPLO DE SUBRUTINAS DE RETARDO MEDIANTE LAZOS ANIDADOS (i)
; El LED conectado a la línea 0 del puerto de salida se enciende durante 400 ms y se; apaga durante 300 ms. ;; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE
CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.ENDC
#DEFINE LED PORTB,0
; ZONA DE CÓDIGOS *******************************************************************
ORG 0Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.bcf LED ; Línea del LED configurada como salida.bcf STATUS,RP0 ; Acceso al Banco 0.
Principalbsf LED ; Enciende el LEDcall Retardo_200ms ; durante la suma de este tiempo.call Retardo_200msbcf LED ; Lo apaga durante la suma de los siguientescall Retardo_200ms ; retardos.call Retardo_100msgoto Principal
18
Tema 9. SubrutinasEJEMPLO DE SUBRUTINAS DE RETARDO MEDIANTE LAZOS ANIDADOS (ii)
; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------;
CBLOCKR_ContA ; Contadores para los retardos.R_ContBENDC
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
;; El próximo bloque "Retardos_ms" tarda:; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina; que a 4 MHz son 1002 µs = 1 ms.;Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInternonop ; Aporta KxMx1 ciclos máquina.decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.return ; El salto de retorno aporta 2 ciclos máquina.
;;En total estas subrutinas tardan:; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
END
19
Tema 9. Subrutinas
LIBRERíA CON SUBRUTINAS DE RETARDO
RETARDOS.INC
20
Tema 9. Subrutinas
LIBRERíA CON SUBRUTINAS DE RETARDO
RETARDOS.INC
21
BIBLIOGRAFÍA
"Microcontrolador PIC16F84, Desarrollo de proyectos" E. Palacios, F. Remiro, L.J. López. Ra-Ma, 2004
Podéis encontrar más información sobre las subrutinas en los
CAPÍTULOS 10 (Subrutinas)
y 12 (Subrutinas de retardo)
Top Related