Está en la página 1de 9

MicroPIC2MR Manejo de Tablas

3.- TEMPORIZACIONES POR CICLOS.

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.

Una subrutina deberá tener la siguiente forma:

; ++++++++++++++++++++++++++++++++
; 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

END ; fin de programa

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

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

En algunas ocasiones es necesario relacionar valores ya sea a través de una función


matemática, lógica o de conveniencia. Sin embargo, el manejo de tablas son una manera
práctica, sencilla y eficiente, para relacionar datos, siempre y cuando los valores de entrada
sean relativamente pocos, o cuando la función relacional sea demasiado compleja para poder
programarla.

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.

Una tabla tendrá la forma:

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

; ++++++++++++++++++++++++++++++++
; 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
. .
. .
. .

END ; fin de programa

2.3 Programas de Subrutinas y Manejo de Tablas

Ejemplo 4. Realizar un programa en lenguaje ensamblador que en el bit 0 del Puerto A,


genere una señal cuadrada con 50% de tiempo en alto y 50% de tiempo en bajo, que tenga un
periodo de 10 microsegundos.

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.

A continuación se muestra el código del programa en ensamblador.

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
: 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.
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++

LIST P=PIC16F872 ; Definición del Procesador

include"P16F872.INC" ; Definiciones de registros del sistema

; Definición de las opciones de programación para el PIC


__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

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

clrf PORTA ; Se limpia el Puerto A por algún


; valor que pueda tener almacenado

bsf STATUS,5 ; pasar al banco 1

movlw 0x07 ; carga en w el valor de 00000111


movwf ADCON1 ; carga el valor de w en ADCON1 para
; configurar el Puerto A como Digital

movlw 0x00 ; carga en w el valor de 00000000


movwf TRISA ; carga en TRISA el valor de w para
; configurar el Puerto A como Salida

bcf STATUS,5 ; 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

bsf PORTA,0 ; enciende el bit A0 1Ms

call RETARDO ; llama a la subrutina de retardo 2Ms

bcf PORTA,1 ; apaga el bit A0 1Ms

call RETARDO ; llama a la subrutina de retardo 2Ms

goto LAZO ; línea para actualizar constantemente los valores

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

;+++++++++++++++++++++++++++++++++++
; Subrutina de Retardo de 7 Ms
;+++++++++++++++++++++++++++++++++++

RETARDO
nop ; 2Ms
nop ; 2Ms
nop ; 2Ms

return ; 1Ms

END ; fin de programa

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.

A continuación se muestra el código del programa en ensamblador.

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++
: 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
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++

LIST P=PIC16F872 ; Definición del Procesador

include"P16F872.INC" ; Definiciones de registros del sistema

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

; Definición de las opciones de programación para el PIC

__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

clrf PORTB ; Se limpian los Puertos B y C por algún


clrf PORTC ; valor que pueda tener almacenado

bsf STATUS,5 ; pasar al banco 1

movlw 0xFF ; carga en w el valor de 11111111


movwf TRISB ; carga en TRISB el valor de w para
; configurar el Puerto B como Entrada

clrf TRISC ; configura el Puerto C como Salida

bcf STATUS,5 ; pasar al banco 0

; ++++++++++++++++++++++++++++++++++++++++
; CÓDIGO GRAY

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

;
; 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

movlw 0x0F ; carga en w 0F


andwf PORTB,0 ; realiza una operación and bit a bit
; para eliminar la parte alta y solo conservar
; la parte baja del PORTB. El resultado se
; almacena en w.

call Tablita ; llama a la tabla para relacionar los valores de


; entrada con el correspondiente valor GREY

movwf PORTC ; carga el valor de w (código GREY)al Puerto C.

goto LAZO ; línea para REPERTIR infinitamente las


; instrucciones anteriores.

; +++++++++++++++++++++++++++++++++++++++++++++++
; TABLA DE RELACIÓN BINARIO-CÓDIGO GREY
; +++++++++++++++++++++++++++++++++++++++++++++++

Tablita
addwf PCL,1

retwl b'00000000' ; valor Grey para 0


retwl b'00000001' ; valor Grey para 1
retwl b'00000011' ; valor Grey para 2
retwl b'00000010' ; valor Grey para 3
retwl b'00000110' ; valor Grey para 4
retwl b'00000111' ; valor Grey para 5
retwl b'00000101' ; valor Grey para 6
retwl b'00000100' ; valor Grey para 7
retwl b'00001100' ; valor Grey para 8

Manuel Meléndez Romero


MicroPIC2MR Manejo de Tablas

retwl b'00001101' ; valor Grey para 9


retwl b'00001111' ; valor Grey para 10
retwl b'00001110' ; valor Grey para 11
retwl b'00001010' ; valor Grey para 12
retwl b'00001011' ; valor Grey para 13
retwl b'00001001' ; valor Grey para 14
retwl b'00001000' ; valor Grey para 15

END ; fin de programa

Ejercicio 4.- Diseñar un programa en ensamblador que realice la misma función que el
ejercicio 3, 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

Manuel Meléndez Romero