Tema 9.Subrutinas - UMHcoolab.umh.es/sea/microcontroladores/tema9_subrutinas.pdf · Con una pila de...

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

Transcript of Tema 9.Subrutinas - UMHcoolab.umh.es/sea/microcontroladores/tema9_subrutinas.pdf · Con una pila de...

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