Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2.1 Subrutinas
Un requisito para la consulta de TABLAS es conocer las SUBRUTINAS con sus instrucciones
de manejo call y return.
Las subrutinas son llamadas que se hacen dentro del programa principal para realizar algún
procesamiento de datos, verificar una condición o activar alguna acción de control. Para
invocarla, basta con utilizar la instrucción call, seguido de su nombre. Ésta debe de contener
un fragmento de código de programa entre una etiqueta, que da nombre a la subrutina y la
instrucción return que marca el fin. La subrutina generalmente se coloca al final del código,
antes de la instrucción END de finalización de programa.
; ++++++++++++++++++++++++++++++++
; Programa principal
; ++++++++++++++++++++++++++++++++
INICIO
……
.…..
…..
call Nombre de Subrutina ; llamado de Subrutina
…..
…..
goto INICIO ; lazo principal
; +++++++++++++++++++++++++++++++++
; Código de subrutina
; +++++++++++++++++++++++++++++++++
Nombre de Subrutina
……
Código ensamblador
……
return ; fin de Subrutina
Dentro de los registros internos de función específica del microcontrolador, existe el Registro
Contador de Programa “PCL”. Dicho registro apunta (contiene la dirección) siempre hacia la
siguiente instrucción de programa que debe ejecutarse.
Cuando ocurre una llamada de subrutina call, el PCL apunta hacia la posición en donde se
encuentra el código de dicha subrutina para que se ejecute. Sin embargo, al encontrar la
instrucción de return, el PCL apuntará hacia la instrucción siguiente de la que hizo el llamado
de subrutina, continuando así con la ejecución del programa principal.
Esta capacidad de “brincar” hacia una posición en específico y poder regresar para continuar
con la ejecución del programa, se debe a la pila o STACK.
La familia de los PIC16F87X tienen una pila con capacidad de 8 niveles, es decir, en un
programa principal, se podrá llamar a una subrutina1, dentro de esta subrutina 1, puede haber
una llamada a una subrutina 2, y dentro de esta subrutina 2, puede haber una llamada a una
subrutina 3, y así sucesivamente hasta completar 8 llamadas anidadas. Si ocurrieran más de 8,
entonces se dice que la pila se “desborda” y se pierde el control de programa.
2.2 Tablas
Es muy similar a las subrutinas, pero su uso se basa en asignar un valor de entrada al registro
w y posteriormente hacer una llamada con la instrucción call; con la diferencia de que en ésta,
se modifica el valor del registro PCL para apuntar a una sola de las “n” líneas de código que
pueda contener la tabla.
Para poder regresar a la siguiente instrucción del programa que la llamó, sin excepción,
posteriormente a la modificación del PCL, todas las líneas de código de la tabla deberán
contener una instrucción de retorno (retlw) la cual asigna un valor a w que cumple con la
relación que se plantea en la tabla.
; ++++++++++++++++++++++++++++++++
; Programa principal
; ++++++++++++++++++++++++++++++++
INICIO
……
…..
movlw 0x01 ; se le asigna el valor de 1 a w
call Nombre de la tabla ; llamado de tabla
movwf PORTB ; exhibe el valor en el Puerto B
; que corresponde a un dato de
; entrada de w=1. En este caso
; 0xA7
…..
goto INICIO ; lazo principal
; +++++++++++++++++++++++++++++++++
; Código de la tabla
; +++++++++++++++++++++++++++++++++
Nombre de la tabla
addwf PCL,1 ; suma el valor de w (valor a decodificar)
; al PCL, para ir a la línea adecuada
retlw 0x0F ; primer línea de retorno, para w= 0
retlw 0xA7 ; segunda línea de retorno, para w=1
. .
. .
. .
Para este ejemplo tomaremos la consideración de que las instrucciones call y nop duran 2
ciclos de instrucción (la mayoría de las instrucciones duran 1 ciclo instrucción). Cada ciclo de
instrucción consiste en 4 periodos de oscilación.
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Nombre: Prog4.asm
; Programa en Ensamblador
; Autor: Manuel Meléndez Romero
; Fecha: 04/07/2008
; PIC: 16F872
; Velocidad de reloj: 4 Mhz
; Descripción: Programa que en el bit 0 del Puerto A, genera una
; señal cuadrada con 50% de tiempo en alto y 50% de tiempo en bajo,
; que tenga un periodo de 10 microsegundos.
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Declaración de Vectores de Reset e Interrupciones
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
org 0
goto INICIO ; Reset
org 4
retfie ; Interrupciones
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programa principal
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
INICIO
bcf STATUS,5
bcf STATUS,6 ; pasar al banco 0
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Consideraciones:
; - Se usa un reloj de 4Mhz, por lo tanto 1 ciclo de instrucción dura
; 1 microsegundo.
; - La señal de 1 y 0 en A0 debe durar 5microsegundos cada una
; para tener un periodo de 10 microsegundos.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LAZO
;+++++++++++++++++++++++++++++++++++
; Subrutina de Retardo de 7 Ms
;+++++++++++++++++++++++++++++++++++
RETARDO
nop ; 2Ms
nop ; 2Ms
nop ; 2Ms
return ; 1Ms
Ejemplo 5. Realizar un programa en lenguaje ensamblador que tome valores de la parte baja
Puerto B a través de la conexión directa del dip-shitch de entrada, y exhiba su correspondiente
código gray en el Puerto C a través de los leds de salida.
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Nombre: Prog5.asm
; Programa en Ensamblador
; Autor: Manuel Meléndez Romero
; Fecha: 04/07/2008
; PIC: 16F872
; Velocidad de reloj: 4 Mhz
; Descripción: Programa que toma valores de la parte
; baja del Puerto B y los despliega en el Puerto C
; su correspondiente código gray
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
__config
_CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC&_PWRTE_ON&_BODEN_
OFF&_WRT_ENABLE_OFF
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Declaración de Vectores de Reset e Interrupciones
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
org 0
goto INICIO ; Reset
org 4
retfie ; Interrupciones
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programa principal
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
INICIO
bcf STATUS,5
bcf STATUS,6 ; pasar al banco 0
; ++++++++++++++++++++++++++++++++++++++++
; CÓDIGO GRAY
;
; DEC BIN GRAY DEC BIN GRAY
; 0 0000 0000 8 1000 1100
; 1 0001 0001 9 1001 1101
; 2 0010 0011 10 1010 1111
; 3 0011 0010 11 1011 1110
; 4 0100 0110 12 1100 1010
; 5 0101 0111 13 1101 1011
; 6 0110 0101 14 1110 1001
; 7 0111 0100 15 1111 1000
; ++++++++++++++++++++++++++++++++++++++++++++++++
LAZO
; +++++++++++++++++++++++++++++++++++++++++++++++
; TABLA DE RELACIÓN BINARIO-CÓDIGO GREY
; +++++++++++++++++++++++++++++++++++++++++++++++
Tablita
addwf PCL,1
Ejercicio 4.- Diseñar un programa en ensamblador que realice la misma función que el
Ejercicio 1, con la diferencia de que se utilice una subrutina para hacer el intercambio en los
Nibbles (grupos de 4 bits) altos y bajos.
Ejercicio 5.- Realizar un programa en ensamblador que lea valores del Puerto B, sólo tome los
3 bits menos significativos y exhiba en el Puerto C su correspondiente código en exceso 3.
Si el valor de entrada es 1101110, se convertirá en 00000110 y exhibirá en el Puerto C
00001001