Professional Documents
Culture Documents
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:
-
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
RP0
0
1
0
1
BANCO
0
1
2
3
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
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.
PRCTICA 3
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
...
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).
PRCTICA 3
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
; PROGRAMA EJEMPLO3
; Ilumina todos los leds de la placa PIC'Laboratory
LIST
ORG
INCLUDE
p=16F876
0x05
"P16F876.INC"
Inicio
bsf
clrf
bcf
Repetir
movlw
movwf
goto
b'11111111'
PORTB
; escribe 1 en todas las lneas
Repetir
END
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
-
sincronizar la herramienta con la placa, pulsando el botn Sincronizar PCPlaca (en la esquina superior derecha de la ventana)
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)
PRCTICA 3
10