Vous êtes sur la page 1sur 7

Cd. 285744 285728 285750. Informe 03.

Microcontroladores: Parte A. Pila y Subrutinas Parte B. Direccionamiento Indexado y Arreglo


Julin A. Alarcn, Felipe Castaeda, Daniel M. Vargas, Microcontroladores. UNIVERSIDAD NACIONAL DE COLOMBIA.

Resumen En este informe se va a realizar el anlisis detallado de 2 programas, verificando cuales son las consecuencias de cada instruccin que se ve all reflejada, para lo cual se mirar la memoria y los registros correspondientes utilizando una pila y la implementacin de subrutinas. Adicionalmente se va a ver cmo funciona el direccionamiento indexado para acceder a tablas de datos en la memoria. Palabras Clave Direccin, Instruccin, QY4, Registro, Rutina, Stack Pointer, Subrutina, WinIDE.

II. INTRODUCCIN El presente informe consta de dos partes A y B, las cuales son similares pero tienen ciertas diferencias que se van a ver reflejadas a travs de la practica; la primera consta de la pila (Stack) y las subrutinas que se pueden tener en un programa, esto con el fin de poder contar con un pequeo nmero de datos que sean de fcil acceso teniendo en cuenta su orden de ingreso para as saber en qu caso implementarlos. Por otro lado la parte B tratara acerca del direccionamiento indexado y los arreglos que se explicaran mediante la ejecucin paso a paso de un programa suministrado y analizar lo que pasa en sus registros y sus espacios de memoria, verificando as el funcionamiento para entender cmo se puede implementar en los programas a disear posteriormente.

I. OBJETIVOS A. Objetivo General Comprender el funcionamiento adecuado de una pila, para poder utilizarla y tambin las subrutinas para el diseo de programas. B. Objetivos Especficos Construir el sistema de desarrollo utilizando pila y subrutinas. Familiarizarse con los entornos de desarrollo y tambin identificar la comunicacin serial. Practicar el uso de distintos modos de direccionamiento que posee el microcontrolador.

III. MATERIALES Software de desarrollo WinIDE

IV. MARCO TERICO STACK POINTER Cuando se desea almacenar nmeros, la forma ms simple es guardar cada uno en una posicin de memoria diferente. Pero, existe otra forma, la cual consiste en mantener una copia de algunos valores por poco tiempo para luego re-utilizarlos, de tal forma que una construccin muy til, disponible en cualquier microprocesador es la pila (en ingls, stack) que

12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

permite apilar datos, cual si fueran platos. El concepto subyacente es: ltimo dato en v guardar, primer dato en extraer. La principal ventaja de esto es que uno no tiene que preocuparse en qu posicin fsica se guarda cada dato, slo tiene que recordar el orden de almacenamiento. El stack usa una seccin de memoria RAM elegida por el programador. En la familia JK habitualmente se utiliza la instruccin rsp (Carga el Stack Pointer con la posicin ms alta de la RAM, en el caso de los QY4 es de $00FF) para inicializar el SP. A medida que el stack se va llenando el Stack Pointer (SP) se decrementa apuntando a posiciones de memoria ms bajas. El SP es un registro que apunta a la prxima direccin disponible. En condiciones reales, se debe encontrar un equilibrio entre el espacio de RAM que se quiere destinar a variables y lo que se quiere reservar para el stack. Ambos espacios no pueden ser invadidos entre s. No cumplir con esta regla bsica termina en programas que se cuelgan misteriosamente. Algunas de las instrucciones utilizadas en la pila son: Rsp: Carga el Stack Pointer con la posicin ms alta de RAM. Psha: El contenido del AccA se guarda en el Stack y luego se decrementa el SP. Pshh: El contenido del reg.H se guarda en el Stack y luego se decrementa el SP. Pshx: El contenido del reg.X se guarda en el Stack y luego se decrementa el SP.1 Pula: Se incrementa el SP y luego se carga en AccA el dato del stack Pulh: Se incrementa el SP y luego se carga en el reg.H el dato del stack Pulx: Se incrementa el SP y luego se carga en el reg.X el dato del stack

El mecanismo es el siguiente: Se salta al bloque de cdigo desde cualquier parte, el cdigo se ejecuta y luego se retorna al punto siguiente al salto usando una instruccin especial de retorno. A menudo, suelen pasarse parmetros a las subrutinas, a travs de los registros o posiciones de memoria, y estas devuelven resultados de la misma forma. JSR o BSR: La direccin de la prxima instruccin es guardada en el stack y el Contador de Programa (PC) se carga con la direccin de comienzo de la subrutina. RTS: Los dos bytes del tope del stack son cargados en el PC. Si todo est bien estos dos bytes representan la direccin guardada en el stack por la ltima instruccin JSR.

DIRECCIONAMIENTO INDEXADO A travs del direccionamiento indexado se puede especificar el comienzo de un rea de memoria (direccin base), y luego apuntar a un dato dentro de esa rea mediante un ndice (o desplazamiento). Comparado a un lenguaje de ms alto nivel, tal como el lenguaje C, sera como especificar un arreglo por nombre y entonces usar una variable (x) como el ndice del arreglo (ej.: a=arreglo[x]). En instrucciones da la MCU 908 esto podra escribirse como lda arreglo,x, donde arreglo es un desplazamiento (offset2) que puede ser de 8 o 16 bits. Este modo es muy til, por ejemplo, para implementar tablas de conversin de datos.

V. PROCEDIMIENTO Y ANLISIS DEL LABORATORIO

SUBRUTINAS Una subrutina es un bloque de cdigo que puede ser usado ms de una vez, en cualquier parte de un programa, sin tener la necesidad de reescribir el bloque, cada vez que se necesite. As, se ahorra memoria de programa, ya que las rutinas bsicas se escriben una sola vez, y simplemente se usan cuando se necesitan.

PARTE A. PILAS Y SUBRUTINAS A. Se va a cargar el SP con $FF en la ventana de registros del uC en el simulador, para luego ingresar el programa y ejecutarlo paso por paso. Como primer paso se va a copiar el programa suministrado, en el entorno de desarrollo WinIDE, pero para ello hay que tener en cuenta que se necesita

12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

importar la librera del microcontrolador que se va a manejar, es decir 'qtqy_registers.inc'. Despus de realizado esto se van a declarar los espacios de memoria para la RAM, la ROM, el vector de inicio y el IRQ. Seguido por la definicin del vector de interrupcin. Ahora bien se puede iniciar el programa, iniciando con la instruccin ORG el cual define donde se va a iniciar a escribir el programa. En la figura 1 se puede ver el programa escrito en la consola de WinIDE.

Direccin Instruccin Registro F600 F601 F602 F603 F604 F605 F606 F607 F608 F609 F60A F60B F60C RSP LDA #1 PSHA LDA #2 PSHA LDA #3 PSHA PULA PULX PULH SP ACCA ACCA ACCA ACCA XREG HREG

Nuevo Valor 00FF 01 02 03 03 02 01

SP (hexa) 00FF 00FF 00FE 00FE 00FD 00FD 00FC 00FD 00FE 00FF

Tabla 1. Ejecucin primer programa con la pila

Como se puede ver en la anterior tabla cuando se realizan las instrucciones Pul y PS, cambia el Stack Pointer tanto incrementando como decrementando dada la instruccin, por lo tanto se puede decir que la pila tiene una estructura LIFO (Last In-Fist Out) que significa que el ltimo dato que se ingresa en la pila es el que primero sale de la misma.

B. Para poder entender mejor el programa se van a resolver ciertas preguntas fundamentales que explican las funciones de cada instruccin. La Instruccin pul borra los datos almacenados en la pila? No, la instruccin PUL no borra el dato almacenado en la pila
Figura 1. Primer Programa de implementacin de la Pila

Ahora que se tiene el programa, se va a proceder a simularlo mediante la herramienta Simulator (EXE4) y se ejecutara el programa paso por paso para verificar cada una de las instrucciones, registrndolas en la tabla 1, de tal forma que se pueda ver como se modifican tanto el Stack Pointer como los registros.

El Stack Pointer (SP) apunta al tope de la pila, o a la prxima posicin libre? Apunta a la prxima posicin libre La instruccin psh incrementa o decrementa el contenido del SP? La instruccin PSH decrementa el contenido del SP.

12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

C. Se va a realizar un segundo ejemplo de programacin y se vern los resultados Ahora se va a realizar una modificacin al programa anterior de tal forma que se utilizen las subrutinas es decir que se va a crear un programa en forma de ciclo infinito teniendo saltos de una instruccin a otra, este programa se puede ver en la figura 2.

F604 F605 F606 F607 F608 F609 F60A F60B F60C F60D F60E F60F F610

JSR $F60A

PC

F60A

00FD

BRA $F605 STA $80 PUSHX PULA LDX $80 RTS

PC 0080 00FD ACCA XREG PC

F605 01 02 02 01 F608

00FF 00FD 00FC 00FD 00FD 00FF

Tabla 2. Resultados segundo programa con subrutinas.

En este programa se puede ver como se realizan los saltos en el Program Counter (PC) y en especial en el primer salto JSR donde se realizan cambios tanto en memoria, en el PC y en el SP ya que se guardan los datos de estado actual en la memoria modificando la pila y as mismo realizando el salto necesario, los datos guardados son utilizados despus por la instruccin RTS que salta a BRA como lo indicaba la pila.

Figura 2. Segundo Programa con subrutinas

D. Se va a reemplazar la instruccin PULA que est en la direccin $F60D con una instruccin NOP y se vuelve a realizar la simulacin del programa. Al realizar el cambio en la instruccin por la NOP (figura 3), se pierde el ciclo constante debido a que el SP no se modifica para dejarlo en las posiciones donde se encuentran los valores de la ltima posicin del inicio del ciclo ya que toma los dos bits superiores de la pila, pero como no se realiz el PULA del valor que se introdujo despus; el RTS recoge los valores de la pila donde no hay instrucciones y por lo tanto se termina la ejecucin del programa.

El programa se inicia de la misma forma pero esta vez se van a agregar las instrucciones JSR, RTS y BRA que son las que realizan los saltos, cabe aclarar que la instruccin JSR cuando realiza el salto hacia STA guarda los valores de su posicin en la pila, por lo tanto el SP se va a ver afectado. Cuando se realiza la simulacin del programa se van a encontrar ciertos cambios en los registros y memoria que se pueden ver en la tabla 2. Direccin F600 F601 F602 F603 Instruccin RSP LDA #1 LDX #2 Registro Posicin SP ACCA XREG Nuevo Valor 00FF 01 02 SP (hexa) 00FF 00FF 00FF

12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

ZONA DE DATOS DE RAM $0080 $0081 $0082 $0083 $0084

VALOR

10 11 12 13 14

Tabla 5. Datos almacenados para la seccin B.

Figura 3. Segundo programa con subrutinas y cambio en la instruccin PULA por NOP

Para ver este caso se va a mostrar en la tabla 3, las ltimas instrucciones que fueron cambiadas y se puede ver que ya no termina el SP en $00FF sino en $00FE porque an existe un valor que no se sac de la pila y corresponda a la informacin del ciclo. Direccin F60C F60D F60E F60F F610 Instruccin PUSHX NOP LDX $80 RTS Registro Posicin 00FD XREG PC Nuevo Valor 02 01 F608 SP (hexa) 00FC 00FC 00FC 00FE

Como vemos este programa de la tabla 4 usa el direccionamiento indexado en la instruccin ADD con la cual suma el contenido de la posicin de memoria (X) con el contenido de la posicin $80, ms el contenido del mismo acumulador y coloca el resultado en el acumulador. Se ejecuta un total de 4 veces que es el valor de X, ya que la instruccin DBNZX lo va decrementando, a la vez que saltando constantemente a la instruccin ADD mientras no sea cero el valor del decremento en X. Cuando el decremento si es cero continua sin saltar y finaliza el programa. El cdigo usado en WinIde se ve en la figura 4. Como se ve primero cargamos las posiciones de $80 hasta $84 con distintos valores mostrados en la tabla 5, luego se carga X con el valor #4; la siguiente instruccin carga el acumulador con el valor puesto en $80, a continuacin se suma el contenido de X con el de $80, ms el del acumulador para poner el resultado en el mismo acumulador. En seguida la siguiente instruccin decrementa X y si es cero su valor continua el programa con la instruccin puesta en $FE17 (que en este caso no tiene ninguna), de lo contrario salta nuevamente a la instruccin de suma en la posicin $FE14.

Tabla 3. Resultados despus del cabio de instruccin

PARTE B. DIRECCIONAMIENTO INDEXADO Y ARREGLO

Mem FE10 FE11 FE12 FE13 FE14 FE15 FE16

Instruccin LDX #4 LDA $80 ADD 80,X DBNZX $FE14

Registro X ACCA ACCA X

1 4

2 -

3 -

4 -

10 -

24 37 49 5A 3 2 1 0

Tabla 4. Resultados de la ejecucin del programa de la seccin b. 12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

Figura 5. Definicin de tabla en CW.

Figura 4. Cdigo WinIde de la seccin B.

Cmo inicializar una tabla de datos en la memoria RAM? En este caso usamos el comando ORG para colocar los valores de la tabla en el segmento de RAM que tenga el microcontrolador disponible. Tambien podemos usar el comando EQU para asignar un direccin especfica para cada dato de la tabla dentro de la RAM VII. CONCLUSIONES Durante el desarrollo de esta gua se obtuvo valioso conocimiento prctico sobre el uso de la mayora de los tipos de direccionamiento presentados en clase, adems que fue un refuerzo positivo para el dominio de la programacin de los microcontroladores Freescale. En el caso de trabajar en el entorno WinIde, se hizo en este laboratorio ms claro la importancia de la tabulacin a la hora de escribir el cdigo, ya que si no se tiene un orden adecuando en la misma surgen errores que pueden no ser detectados tan fcilmente por no ser culpa del cdigo en s. Conocer y entender el mapa de memoria del microcontrolador tambin fue una tarea importante para esta gua, ya que revisarla para entender los

VI. PREGUNTAS Cmo se hace la definicin de tablas en CW?: Como primer paso se debe encontrar la direccin de memoria a partir de donde se iniciarn las definiciones de datos dentro de la tabla. Se debe procurar no establecer el inicio de la tabla en direcciones de memoria de uso frecuente, adems de verificar que la direccin escogida est disponible para ser usado en nuestro microcontrolador. Con la directiva ORG se establece la direccin de memoria que ser el inicio de la tabla. Por otro lado con la directiva DC.B, se definen constantes de tamao no mayor a 1 byte. En la figura 5 se ve un ejemplo de cmo definir una tabla de caracteres.

12 de Abril de 2013

Cd. 285744 285728 285750. Informe 03.

campos que se usaban en los diferentes programas permiti verificar cuales son los espacios de memoria del microcontrolador usados para guardar el programa, as como las posiciones correspondientes a la RAM y otros sectores tiles que en laboratorios posteriores se usaran.

VIII. BIBLIOGRAFA [1] DataSheet, M68HC08 Microcontrollers, MC68HC908QY4, Freescale. [2] CPU08, Reference manual HC08, [En lnea]. Available: http://es.scribd.com/doc/40652098/MotorolaHc08. [ltimo acceso: 17 marzo 2013]. [3] Freescale, Freescale, Information Center, 2004. [En lnea]. Available: http://www.freescale.com/infocenter/index.jsp?topic=%2 Fcom.freescale.doc.mcu.hcs08_compiler%2Fdoc%2FHI MAN_CODEWARRIOR_TIPS_AND_TRICKS.html. [ltimo acceso: 27 Febrero 2013]. [4] Assemblig a Program, [En lnea]. Available: http://ece.utep.edu/courses/web3376/Assembly.html. [ltimo acceso: 27 Febrero 2013].

12 de Abril de 2013

Vous aimerez peut-être aussi