You are on page 1of 10

ARQUITECTURA Y ORGANIZACIN DE COMPUTADORES

PRCTICA

3
Objetivo
En esta prctica se presenta la herramienta RealPic, utilizada para el desarrollo
y grabacin de aplicaciones en un PIC16F876, insertado en la placa
PICLaboratory, y se mostrar como funcionan los puertos del PIC para
comunicacin con dispositivos de E/S.
Tras la conclusin de la prctica, el alumno ser capaz de:
-

crear y utilizar subrutinas

usar datos en varios bancos de memoria diferentes

visualizar informacin en los leds o en el display 7-segmentos

depurar un programa que maneja dispositivos de E/S externos utilizando el


entorno de simulacin de MPLAB IDE

grabar un programa en el microcontrolador de la placa PIC'Laboratory y


probar su funcionamiento

Teora
Organizacin de la memoria RAM de datos
El PIC16F876 dispone de una memoria RAM organizada en 4 bancos de
memoria (ver la Figura 2-3 del DataSheet, en la pgina 15). Cada banco
contiene 128 bytes. Las primeras posiciones en cada banco estn reservadas
para los registros especiales (como STATUS, FSR, INDF, etc.). En total, existen 368
bytes disponibles para datos del programa.
El acceso a una posicin de la memoria puede realizarse de modo
directo, utilizando la direccin correspondiente, o de modo indirecto,
mediante los registros FSR e INDF. A continuacin se muestra cmo se lleva a
cabo la seleccin del banco para el modo directo (el indirecto no lo
utilizaremos).
1

PRCTICA 3

Seleccin de bancos de memoria para acceso directo


Se realiza mediante los bits 6 y 5 del registro STATUS, llamados,
respectivamente, RP1 y RP0. La siguiente tabla muestra la relacin entre el
valor de dichos bits y el banco que se selecciona.
RP1
0
0
1
1

RP0
0
1
0
1

BANCO
0
1
2
3

Por defecto, el banco seleccionado es el 0 (este es el motivo de que,


hasta ahora, hayamos podido trabajar sin seleccionar ningn banco y sin
conocer la estructura de la memoria, dado que todos nuestros datos estaban
colocados en posiciones de dicho banco).
Ejemplo 1. Si deseamos acceder a la posicin 0A0h, hemos de seleccionar
previamente el banco 1, como se muestra en la siguiente secuencia de
instrucciones

bcf STATUS,RP1
bsf STATUS,RP0
movf 0A0h,W
...
De no seleccionar previamente el banco 1, la instruccin movf 0A0h,W
no accedera a la posicin 0A0h de la memoria, sino a la 020h, que es la
posicin equivalente en el banco 0.
Recurdese que las direcciones de la memoria RAM son de 9 bits. Todas
las direcciones que tienen los ltimos 7 bits iguales son equivalentes entre s (da
igual cul se utilice en el cdigo): representarn una posicin en uno de los
cuatro bancos, y la posicin concreta depender del banco que est
seleccionado en el momento del acceso. La siguiente tabla recoge las 3
direcciones equivalentes a la 020h.
DIRECCIN
HEX.
020
0A0
120
1A0

DIRECCIN EN
BINARIO
00-0100000
01-0100000
10-0100000
11-0100000

BANCO AL QUE
PERTENECE
0
1
2
3

Como se ve en la tabla, las cuatro direcciones tienen los ltimos 7 bits


iguales, y slo se diferencian en los dos primeros que, precisamente,

ARQUITECTURA Y ORGANIZACIN DE COMPUTADORES

representan el nmero de banco al que pertenece esa posicin. Cuando las


instrucciones se codifican en binario, al ensamblar, no se utilizan 9 bits para
representar la direccin de un dato, sino nicamente 7 (los 7 ltimos) de ah
que las cuatro direcciones sean indistinguibles cuando la instruccin se
ejecuta. Lo que determina la posicin exacta a la que se accede es el valor
de los bits RP1 y RP0, como se muestra en la siguiente figura, extrada del
datasheet.

Subrutinas
Las macros y subrutinas son dos mecanismos del lenguaje ensamblador que
permiten agrupar una coleccin de instrucciones bajo un nombre comn.
Mediante el uso de macros y subrutinas se simplifica la labor de edicin de
cdigo, dado que se evita tener que repetir varias veces un mismo fragmento,
y se facilita la comprensin y depuracin del programa.
Aunque en este sentido son parecidas, existe una diferencia
fundamental entre ambas y reside en lo que ocurre con ellas durante el
proceso de ensamblado y posterior ejecucin del programa.

Creacin y uso de subrutinas


Una subrutina es un conjunto de instrucciones al que se tiene acceso desde
cualquier punto del programa principal. Es decir, es un subprograma que se
ejecuta cada vez que el programa principal (u otro subprograma) lo necesita.
Es algo equivalente a una funcin o procedimiento en la programacin de
alto nivel.
Una subrutina queda fuera del flujo secuencial del programa principal,
luego son necesario mecanismos para poder llegar a ella (es decir, a la zona
de memoria donde se encuentra almacenada) y una vez ejecutadas las

PRCTICA 3

instrucciones que la componen, volver al punto donde se qued la ejecucin


del programa.
La accin de pasar del programa principal a la subrutina se denomina
"llamada a la subrutina", y se realiza mediante la instruccin call, que lleva
como argumento la direccin de comienzo de la subrutina, es decir, la
direccin de memoria donde se encuentra almacenada la primera instruccin
de dicha subrutina.
La accin de regresar al programa principal cuando la subrutina
termina se denomina "retorno de la subrutina" y se realiza con la instruccin
return. Esta instruccin, a diferencia de call, no lleva argumento, dado que
la direccin a la que se retorna despus de ejecutar una subrutina no es fija:
depende de dnde se realizara la llamada a dicha subrutina. La instruccin
que se ejecuta despus de un return es la instruccin que aparece en el
programa principal despus de la llamada a la subrutina. La direccin de esta
instruccin se conoce en el momento de ejecutar el return porque, al
ejecutar el correspondiente call, se almacen la direccin de retorno en la
pila del sistema.
Tambin puede realizarse el retorno de una subrutina mediante la
instruccin retlw, que, adems de volver al programa que la llam, coloca el
valor que se le pasa como argumento en el registro W.
Ejemplo 2. A continuacin se muestra una subrutina que crea una tabla de tres
elementos en memoria.
CrearTabla

movlw b'00111111'
movwf 20h
movlw b'00000110'
movwf 21h
movlw b'01011011'
movwf 22h
return

Ahora, para crear la tabla al inicio del programa, tenemos que hacer una
llamada a la subrutina, de la siguiente manera
Inicio

call CrearTabla
crlw
...

Supongamos que la direccin de Inicio es 10h. En ese caso, la direccin


de retorno de la subrutina ha de ser 11h, es decir, la direccin de la instruccin
clrw, que ha de ejecutarse tras finalizar la subrutina. Al ejecutar la instruccin
call se almacenar en la pila el valor 11h. Cuando se ejecute el
correspondiente return, se leer 11h de la cima de la pila, y se realizar un
salto a esa direccin para continuar con la ejecucin del programa.
Las subrutinas pueden definirse en cualquier zona del fichero
(siempre antes de la directiva END) y en cualquier orden. Para asegurar la

ARQUITECTURA Y ORGANIZACIN DE COMPUTADORES

correcta ejecucin de nuestro programa, siempre etiquetaremos la primera


instruccin del programa con la etiqueta Inicio, y escribiremos la instruccin
goto Inicio justo debajo de la directiva ORG 0x05.
Las subrutinas permanecen tras el proceso de ensamblado, y se ubican
en memoria en el orden en que aparecen en el cdigo fuente.

Subrutinas anidadas
Cuando una subrutina llama a otra subrutina se produce una situacin
conocida como anidamiento de subrutinas. Cada call sucesivo sin que
intervenga un return crea un nivel de anidamiento adicional y, por tanto, una
nueva entrada en la pila.
El nivel de anidamiento est limitado en cada microcontrolador, y en el
caso del PIC16F876 es de 8: es decir, no pueden producirse ms de 8 llamadas
anidadas.

La pila (stack)
Es una zona de memoria que se encuentra separada tanto de la memoria de
datos como de la de programa. Est formada por 8 registros y tiene una
estructura de tipo LIFO (Last In, First Out). El acceso a esta memoria se realiza
nicamente mediante las instrucciones call (introduce un nuevo valor en la
cima de la pila) y return (extrae el valor en la cima de la pila).

Conexin de dispositivos de E/S mediante puertos


En el microcontrolador PIC16F876, los dispositivos de E/S se conectan y se
manejan mediante puertos. Existen 3 puertos denominados puerto A, puerto B
y puerto C. Cada puerto tiene asociados dos registros especiales, llamados
PORT y TRIS (PORTA Y TRISA para el puerto A, PORTB y TRISB para el puerto B, y
PORTC Y TRISC para el puerto C).
El registro PORT almacena el dato recibido del dispositivo de E/S o enviado a
dicho dispositivo. Este registro se encuentra ubicado en el banco 0 de la
memoria RAM.
El registro TRIS se utiliza para la configuracin de las lneas (bits) conectadas al
puerto, eligiendo el sentido de la comunicacin: cada bit del registro TRIS con
valor 0 configura la lnea correspondiente como salida; cada bit con valor 1
configura la lnea como entrada. Se encuentra ubicado en el banco 1 de la
memoria RAM.

PRCTICA 3

Dispositivos de salida conectados al puerto B: 8 leds y un


display 7-segmentos
La placa PICLaboratory contiene 2 dispositivos de salida digital conectados al
puerto B del microcontrolador: 8 leds y un display 7-segmentos. La siguiente
figura muestra el esquema de conexin de ambos dispositivos al puerto B.

a
f

b
c

d
h
h
T
R
I
S
B

P
O
R
T
B

Puerto B

RB0

RB7

PIC16F876

Cada lnea del puerto B est conectada a un LED y a un segmento del display,
tal y como muestra la figura: la lnea RB0 se conecta al LED situado a la
derecha y al segmento a, y as sucesivamente hasta la lnea RB7, que se
conecta al led situado a la izquierda y al segmento h correspondiente al
punto.
Para poder visualizar informacin en estos dispositivos es necesario configurar
las lneas del puerto B como salidas, escribiendo 00h en el registro TRISB.
Una vez configurado, escribimos la informacin a visualizar en el registro PORTB:
un 1 en aquellas lneas conectadas a los leds o segmentos que deseamos
iluminar, y un 0 en las que estn conectadas a leds o segmentos que
deseamos apagar. Por ejemplo, para encender los 4 leds de la derecha y
dejar apagados los 4 de la izquierda, escribiramos un 0Fh en PORTB. Si
deseamos mostrar un 1 en el display, encendemos los segmentos b y c
poniendo a 1 las lneas RB1 y RB2, para lo cual escribimos 06h en PORTB.
Como los leds y el display estn conectados al mismo puerto, no pueden
utilizarse ambos dispositivos de manera simultnea para visualizar informacin
distinta. Por ejemplo, si deseamos encender todos los leds, tambin se
encendern todos los segmentos del display. Lo habitual es trabajar con uno

ARQUITECTURA Y ORGANIZACIN DE COMPUTADORES

slo de los dispositivos en cada momento. La seleccin se hace mediante los


jumpers J1 (para activar los leds) y J2 (para activar el display) de la placa.

Ejemplo 3. El siguiente programa realiza el encendido de todos los leds de la


placa.

; PROGRAMA EJEMPLO3
; Ilumina todos los leds de la placa PIC'Laboratory
LIST
ORG
INCLUDE

p=16F876
0x05
"P16F876.INC"

Inicio

bsf
clrf
bcf

STATUS,RP0 ; seleccin del banco 1


TRISB
; configura puerto B como salida
STATUS,RP0 ; seleccin del banco 0

Repetir

movlw
movwf
goto

b'11111111'
PORTB
; escribe 1 en todas las lneas
Repetir

END

Creacin y grabacin de programas


Para poder grabar y ejecutar nuestro programa en el microcontrolador
insertado en la placa PICLaboratory, es necesario realizar el siguiente proceso.
1. Conexin de la placa al PC
Lo primero que haremos ser conectar la placa a la red elctrica, utilizando un
transformador AC/AC de 12V. La placa dispone de su propio sistema de
rectificacin, filtrado y estabilizacin a +5Vcc. Si la placa est siendo
correctamente alimentada, se ha de iluminar el led D10 situado a la derecha
de la fuente.
A continuacin hay que conectar la placa al PC, para poder establecer
comunicacin con el micro y escribir el programa en su memoria flash a travs
de la aplicacin RealPic. La conexin se realiza a travs del puerto serie RS232.
2. Abrir la aplicacin RealPic
La edicin, ensamblado y grabacin del programa en el micro se realiza
utilizando la aplicacin RealPic. Si la placa est bien conectada y funciona
correctamente, al abrir la aplicacin mostrar el mensaje La placa ha sido
conectada. En otro caso, el mensaje ser Sincronizacin inicial fallida.

PRCTICA 3

3. Edicin y ensamblado
Podemos crear nuestros ficheros fuente desde esta aplicacin, o abrir un
fichero ya creado con cualquier editor de texto o con la herramienta MPLAB
IDE. A travs del men Archivo encontramos estas dos opciones.
Una vez disponemos del cdigo fuente, se ensambla utilizando el botn
ENSAMBLAR. Esta operacin genera un fichero con igual nombre al del cdigo
fuente y extensin .hex. Es el fichero que contiene el cdigo mquina
directamente ejecutable por nuestro micro.
4. Grabacin del programa en el PIC
Cuando se haya ensamblado sin errores, pasamos a grabar el programa en la
placa, para lo cual hay que
-

abrir el fichero .hex (men Archivo)

sincronizar la herramienta con la placa, pulsando el botn Sincronizar PCPlaca (en la esquina superior derecha de la ventana)

grabar el programa pulsando el botn ESCR PROG (en la parte inferior de la


ventana)

NOTA: La edicin y ensamblado del programa se harn siempre primero con el


entorno MPLAB IDE. De esta forma, el ensamblado del programa con RealPic
se realizar siempre sin errores. Tambin se realizar una primera verificacin
del funcionamiento del programa mediante simulacin.
5. Ejecucin y prueba
Una vez grabado el programa, para ceder el control a la placa y poder
verificar su funcionamiento, seleccionamos Ejecucin en el men Ejecucin (o
pulsamos F9). A partir de ese momento, el programa ya est en
funcionamiento, y podemos probarlo actuando directamente sobre los
dispositivos de E/S de la placa.

ARQUITECTURA Y ORGANIZACIN DE COMPUTADORES

PRCTICA 3. Ejercicios
P1: Leds
Escribe un programa que encienda uno a uno los leds de la placa,
empezando por el de la izquierda (o cualquier otro juego de luces). Probar su
funcionamiento en la placa.

P2: Subrutinas
Convierte el programa P2 de la prctica anterior en una subrutina.
a) Verifica el funcionamiento de la subrutina utilizando MPLAB IDE. Para ello,
crea un programa principal que simplemente haga una llamada a dicha
subrutina. Los valores de Num se introducirn directamente en memoria.
b) Qu direccin se almacena en la pila en el momento de ejecutar la
instruccin de call? Comprubalo con MPLAB IDE. (Nota: hay que mostrar
Hardware Stack en el men View)

P3: Display 7-segmentos


Escribe un programa que muestre en el display 7-segmentos los dgitos
hexadecimales del 0 a la F, utilizando la subrutina creada en el ejercicio
anterior. Funcionar de forma cclica, tal y como muestra el siguiente
diagrama de flujo. Verifica el programa sobre la placa.

PRCTICA 3

Nota: Este programa puede hacerse tambin sin necesidad de


implementar un bucle como ste, utilizando aspectos de bajo nivel, como
la posibilidad de manipular bits directamente. Una pista: consistira en
anular los primeros cuatro bits de Num, de forma que siempre sean cero. As
el lmite se controla slo, es decir, cuando pasamos de 15 a 16, en binario
sera pasar del 00001111 al 00010000, con lo que s anulamos los cuatro
primeros bits estaramos de nuevo en el 00000000 que es el primer valor, y
con un goto bastara.

10

You might also like