ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN PARÍS. Por JAVIER SOL...
Guia practica 1.0 2011
1. Electrónica III
Guía de Práctica N° 1
TEMA: El sistema de desarrollo y el lenguaje ensamblador
Objetivos:
Generales: Comprender la programación básica del microcontrolador 8051,
su sistema de desarrollo y el uso de un lenguaje ensamblador para la
realización de programas en bajo nivel.
Particulares: Comprender el funcionamiento del microcontrolador PLC935
de Philips y el entorno de desarrollo KeilµVision para la realización de
programas en bajo nivel
Introducción
El desarrollo de un sistema basado en microcontrolador implica: el diseño y montaje de un
hardware, y el diseño y depuración del software correspondiente. Las primeras pruebas y depuraciones
del diseño de ambos bloques (hard y soft) se realizan en sistemas de desarrollos. Estos sistemas poseen un
Entorno de Desarrollo Integrado (IDE, por sus siglas en inglés) que corre en una PC, el cual se comunica
con un circuito externo que posee el mismo microcontrolador que utilizamos en nuestro diseño hardware.
Por lo general, estos sistemas de desarrollo permiten la edición, el ensamblado, ejecución, depuración y
simulación de los programas y su posterior grabación en el microcontrolador. Permiten asismismo la
emulación del funcionamiento del software en el hardware provisto por el sistema de desarrollo.
En estas clases de práctica emplearemos sistemas o kits de desarrollo que utilizan el IDE Keil
µVision3, el cual se comunica a través del puerto serie con la placa MCB900 con el microcontrolador
89LPC935 y que se muestra a continuación:
Keil
Placa para el
µVision
P89LPC935 3
Esquema del sistema de desarrollo
Placa MCB 900
El lenguaje ensamblador (assembler) es una ayuda en las tareas de codificación en bajo nivel ya
que, además de contener los nemónicos de las instrucciones, presenta ciertas ventajas que evitan el trabajo
de manipular el código hexadecimal, como por ejemplo símbolos e identificadores que referencian a datos
o posiciones de memoria. Los nemónicos son abreviaturas de los nombres o descripciones de las
instrucciones que se utilizan como ayuda a la memoria del diseñador. Así también se encuentran las
pseudoinstrucciones o directivas que facilitan la codificación de algoritmos. Las directivas no son
instrucciones del microcontrolador por lo que no generan código ejecutable, pero pertenecen al software
ensamblador.
El programa codificado en lenguaje ensamblador se denomina programa fuente y requiere de su
traducción a código máquina o programa objeto, proceso que se denomina ensamblado, para correr en un
microcontrolador o en un sistema de emulación.
PROGRAMA FUENTE ensamblado PROGRAMA OBJETO
( Nemónicos y directivas) Guía 1 ( Código de máquina) 1 de 6
2. Electrónica III
El IDE Keil µVision3 utiliza el macro assembler Ax51 para ensamblar programas para la familia de
los microcontroladores 8051. Trabaja asociado a otros dos programas: el Lx51 que vincula (o “linkea”)
distintos modulos de un proyecto asignando direcciones absolutas; y el OHx51 que genera el código
objeto en formato Intel.
Para generar el código de máquina para el microcontrolador P89LPC935 ( versión de la empresa Philips
del µC 8051 de Intel), es necesario contar con una PC con sistema operativo Windows 98 o superior con el
Keil µVision3, en el cual se ejecutan dos aplicaciones interactivas entre sí que posibilitan:
Aplicación 1: edición, ensamblado y grabación del micro
Aplicación 2: ejecución, depuración y simulación del programa
Para crear una aplicación en Keil µVision3 es necesario seguir los siguientes pasos:
a) Ejecutar el entorno Keil µVision3
b) Desplegar la ventana Project y crear un nuevo proyecto seleccionando Create New Project , dentro de
un directorio creado para contener todos los archivos de nuestro proyecto. Ejemplo:
demoguia1.uv2 dentro del directorio GUIA1
c) Seleccionar la CPU para el dispositivo P89LPC935 y NO habilitar el copiado y adicion del código
del LPC900 Startup.
d) Configure el proyecto de manera que al ensamblar el progama fuente se genere un archivo con
extensión HEX (el código objeto). Esto se realiza seleccionando la opción Options for target ´Target 1´
en la ventana Project y en la pestaña Output seleccionar el box Create HEX file
e) En la pantalla se desplegará la aplicación 1 en donde se podrán identificar las siguientes ventanas:
Menú
desplega Depuración
ble
Botones de
ensamblado
Grabación del
micro
Ventana de edición
Ventana de salida
f) Despliegue la opción de menú File y cree un nuevo archivo. Edite en la ventana de edición un
programa en lenguaje asembler respetando los campos de edición: etiquetas, codigos de operación
y operandos. Recuerde que las líneas con comentarios se indican con “;” o con “//”. A modo de
ejemplo tipee el siguiente código fuente:
NAME PROGRAMA_DEMOSTRACION
MOV R3,#OPER
Guía 1 2 de 6
3. Electrónica III
MOV R5,#01H
SALTO: MOV A,R3
ADD A,R5
MOV R3,A
JNC SALTO
ACA: SJMP ACA
OPER EQU 0FEH
END
g) Guarde el archivo con una extensión A51. Ejemplo: demoguia1.A51.
h) Presione el clic contrario del mouse sobre “Source Group 1” de la ventana izquierda y adicione el
archivo demoguia1.A51 al grupo.
i) Ensamble el programa fuente presionando el botón build target en la parte superior izquierda de la
pantalla del Keil µVision3..Con esta acción se han creado el código objeto demoguia1.hex y los
archivos : demoguia1.lst, demoguia1.obj,demoguia1.M51, etc.
j) Observe que en la ventana de salida se visualizarán mensajes del ensamblador y los errores de
sintaxis detectados.
k) Para realizar una primera depuración de la lógica de programación se puede presionar el botón de
Depuración indicado en la figura anterior o seleccionar el inicio de la sesión en el menú Debug del
desplegable superior.
Al activar la depuración del programa, se desplega la pantalla de la aplicación 2.
l) En esta pantalla se puede observar una nueva barra de herramientas en la zona superior y otras
dos ventanas, aparte de la de salida, en la zona inferior de la pantalla. En una de ellas se podrá
observar la evolución de los registros, variables que utilizamos en nuestro programa y el uso de la
pila o stack (Watches Window) En la otra se podrán visualizar las distintas zonas de memoria
(Memory Window). También podrán seleccionarse otras ventanas de inspección que nos ayudarán en
la depuración de nuestro programa: el analizador lógico (Logic Analyzer Window). y el analizador de
perfomance (Perfomance Analyzer Window). Esto se realiza presionando el botón correspondiente en el
submenú mencionado.
m) Configure las ventanas de depuración que desee utilizar. En nuestro caso ejemplo
inspeccionaremos el contador de programa, los registros r3, r5, el acumulador y las banderas;
observando su evolución en la ventana Workspace que se puede abrir a la izquierda de la pantalla.
También podremos observar la evolución de otras variables locales, presionando F2 en la
ventana rotulada Watches y colocando el nombre del registro o variable.
n) Para ejecutar el programa paso a paso presione F11. Al hacerlo puede observar el efecto que la
ejecución del programa tiene sobre los registros, variables y memoria seleccionada, y evaluar de
esta manera el desempeño del mismo.
o) Para ejecutar por completo el programa presione el botón correspondiente en el submenú o la
opción Run en el menú Debug
Guía 1 3 de 6
4. Electrónica III
Perfomance Analyzer Logic Analyzer
Project
Workspace
Watches Window Memory Window
Output Window
Pantalla de la aplicación 2: ejecución, depuración y simulación del programa
ACTIVIDADES PRESENCIALES:
Respecto del programa demostración: investigue y responda:
a. ¿qué hace el programa demostración presentado anteriormente?
b. explique paso a paso la función de cada instrucción dentro del programa e identifique los
modos de direccionamiento de cada una
c. identifique las directivas del ensamblador empleadas y describa sus funciones
d. con qué instrucción podría reemplazarse el incremento al dato en R3?
e. Investigue alternativas a la escritura de la instrucción SJMP
2. Tipee, ensamble y simule el siguiente programa:
NAME PROGRAMA_DEMOSTRACION_2
MOV R3,#CANT
MOV DPTR,#TABLA
MOV R5,#0FFH
MOV R4,#00
SALTO: MOV A,R5
INC A
MOV R5,A
MOVC A,@A+DPTR
ADD A,R4
MOV R4,A
DEC R3
Guía 1 4 de 6
5. Electrónica III
MOV A,R3
JNZ SALTO
QUEDO: SJMP QUEDO
TABLA: DB 1,2,3,4,5,6,7,8,9,10
CANT EQU 0AH
END
a. Identifique y corrija los errores surgieron al ensamblar el programa fuente
b. Cual es la función de la directiva DB? Cuál es el valor de la etiqueta TABLA?
c. ¿qué hace el programa demostración presentado anteriormente?
d. Explique paso a paso la función de cada instrucción dentro del programa e identifique
los modos de direccionamiento de cada una
e. Identifique las directivas del ensamblador empleadas y describa sus funciones
f. Inspeccione el mapa de memoria y verifique la ubicación de la tabla.
g. Por qué instrucción podría reemplazar las siguientes líneas de código:
DEC R3
MOV A,R3
JNZ SALTO
3. Edite, ensamble y simule 2 de los ejercicios que se proponen a continuación y el resto resuélvalos
en papel.
EJERCICIOS:
1. Escribir el dato FAH en todas las posiciones de memoria RAM entre 30H y 7FH. Investigue y
responda: por qué se eligieron estas posiciones de memoria?
2. Sumar el contenido de las direcciones de memoria 51H y 52H, almacenar el resultado en la 53H.
Investigue y responda: qué contienen las direcciones de memoria de programa a partir de la
0000H? Que tipo de direccionamiento utilizó?
3. Escribir un programa que reste el contenido del par de registros R3 y R4 del dato ubicado en las
posiciones de memoria 38H y la siguiente. Almacenar el resultado en R5 y R6. El valor del carry
colocarlo en el bit 2 de la dirección 20H. Investigue y responda: por qué se eligió esta posición de
memoria para almacenar el carry? Qué contienen las direcciones de memoria RAM: 04H, 05H,
06H y 07H?
4. Buscar el primer dato=FFH existente en el bloque de datos de la memoria RAM direccionada
desde la 30H hasta la 40H. Almacenar la dirección donde se lo encontró en el registro R3.
Investigue y responda: qué registro empleó como puntero de datos? Por qué?
5. Trasladar 30 datos ubicados a partir de la posición de memoria RAM 30H y colocarlos a partir
de la 50H. Utilice los registros R0 y R1. Investigue y responda: por qué se sugiere utilizar estos
registros como punteros? Que tipo de direccionamiento utilizó?
6. Realizar un programa que tome un bloque de datos de 64 bytes ubicados a partir de la dirección
de RAM 30H y los escriba a partir de la misma dirección pero en orden invertido.
7. Escribir un programa que coloque en cero las cuatro bits de mayor peso (nible superior) de las
posiciones de memoria de RAM desde 30H hasta la posición 70H.
8. Escribir un programa que parta el byte almacenado en la dirección de RAM 30H en dos nibles y
los almacene en las 31H y 32H de tal manera que los 4 bits más significativos de éstas últimas
sean cero.
Guía 1 5 de 6
6. Electrónica III
9. Realizar un programa que sume cuatro números ubicados en posiciones de memoria de RAM
sucesivas a partir de la 30H y almacene el resultado en la quinta posición consecutiva. Si se
necesita usar otro byte para el resultado almacenarlo en la sexta posición.
10. Realizar un programa que reste dos vectores de diez elementos de datos de un byte ubicados todos
en posiciones consecutivas a partir de la 30H. Almacene el resultado en otro vector a
continuación de los vectores anteriores. (suponer todos los vectores de datos ubicados en la zona
de RAM de direccionamiento indirecto) Utilizar punteros de distintos bancos de registro.
11. Escribir un programa que multiplique los datos almacenados en las direcciones de RAM 30H y
31H. Almacene el resultado en las siguientes posiciones de memoria.
12. Escribir un programa que divida el dato almacenado en las dirección 30H por el que está en la
dirección 31H. Almacene el resultado en las siguientes posiciones de memoria.
13. En 3 posiciones consecutivas de memoria RAM están almacenados 3 datos. Guardar el mayor de
ellos en la siguiente posición de memoria libre.
14. Realizar un programa que tome un dato de la posición de memoria 40H, lo convierta a BCD y lo
almacene en las tres posiciones anteriores de manera que las unidades queden en la dir 3FH..
15. Realizar un programa cuya función sea demorar 1, 10 o 100 mseg.
16. Realice un programa que incremente un contador BCD de 0 a 100. Le cuenta se debe incrementar
cada 1 ms y el estado actual del contador se debe almacenar en las direcciones 20H, 21H y 22H.
El programa debe utilizar dos subrutinas: Retardo y BIN-BCD.
17. Escribir un programa que calcule el máximo de un bloque de 40 datos ubicados a partir de la
dirección 30H.
18. Ordenar de mayor a menor un bloque de 40 datos ubicados a partir de la dirección 30H.
19. Realizar un programa que copie los datos de una tabla de 10 datos que reside en la memoria de
código, a una zona de RAM ubicada a partir de la dirección 30H. Utilice las directivas DB y DS.
20. Realizar un programa que transfiera 30 datos ubicados en memoria de código hacia la posición
38H en delante de memoria RAM, con un intervalo de 100 mseg. entre dato y dato.
21. Realizar una programa que convierta a BCD números binarios de 8 bits, no mayores que 255, y
que se encuentran almacenados en posiciones de memoria sucesivas a partir de la dirección 30H.
Almacene los 3 dígitos BCD en 2 posiciones de memoria sucesivas a partir de la dirección 31H.
22. Realizar un programa que sume o reste números positivos de 32 bits de magnitud según sea
R3=FFh (suma) y si R2=00 (resta). Si el resultado es negativo, colocar R4=FFh.
Bibliografía
Keil Software. “Macro Assembler and Utilities Macro Assembler, Linker/Locator, Library Manager,
and Object-HEX Converterfor 8051, Extended 8051, and 251 Microcontrollers” User’s Guide2.2001
Odant B. “Microcontroladores 8051 y 8052” Ed- Paraninfo.1995
Philips Semiconductor – P89LPC933/ 934/ 935/ 936 User Manual
José Matas Alcalá y Rafael Ramón Ramos Lara. Microcontroladores MCS-51 y MCS-251.
Kenneth L. Short. Microprocesadores y lógica programada.
José Angulo. Microprocesadores. Curso sobre aplicaciones en sistemas industriales.
Guía 1 6 de 6