16
Informática Industrial v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria MICROCONTROLADORES Y CICLOS DE MÁQUINA Un microcontrolador no es más que un ordenador miniaturizado de mayor o menor potencia y complejidad al que se le han añadido (integrado) una serie de elementos como: conversores A/D, memoria, comparadores, puertos de E/S, temporizadores, etc. Como ya sabes, el funcionamiento de un ordenador está marcado por una señal de reloj. Si el reloj no funciona, el ordenador se para. Es el ‘tempo’ que marca cuando deben hacerse las cosas (procesar las instrucciones). Podemos pensar en la señal de reloj como en el pulso que da vida a un microcontrolador, si no hay reloj, el microcontrolador no funciona. Hace unos años, esta señal de reloj siempre era externa al microcontrolador. Hoy en día es extraño encontrar un microcontrolador que no lleve integrado este circuito de reloj, de modo que, uno puede comprarse un microcontrolador en una tienda especializada, programarlo y funcionará sin necesidad de componentes externos. En este documento vamos a echar un vistazo a esta señal de reloj. Veremos como influye en la velocidad de un microcontrolador, estudiaremos qué es un ciclo de máquina y con algunos ejemplos simularemos cómo se ejecutan las instrucciones en un microcontrolador. Vemos aquí algunos ejemplos, en concreto el 12F675 y el 16F628: Ambos microcontroladores son del fabricante Microchip (www.microchip.com ). Como ejercicio vamos a ir a su página web y echaremos un vistazo a sus características principales (seleccionamos la pestaña Productos/8-bit PIC Microcontrollers):

MICROCONTROLADORES Y CICLOS DE MÁQUINA ... hacerse las cosas (procesar las instrucciones). Podemos pensar en la señal de reloj como en el pulso que da vida a un microcontrolador,

Embed Size (px)

Citation preview

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

MICROCONTROLADORES Y CICLOS DE MÁQUINA

Un microcontrolador no es más que un ordenador miniaturizado de mayor o menor potencia y complejidad al que se le han añadido (integrado) una serie de elementos como: conversores A/D, memoria, comparadores, puertos de E/S, temporizadores, etc.

Como ya sabes, el funcionamiento de un ordenador está marcado por una señal de reloj. Si el reloj no funciona, el ordenador se para. Es el ‘tempo’ que marca cuando deben hacerse las cosas (procesar las instrucciones). Podemos pensar en la señal de reloj como en el pulso que da vida a un microcontrolador, si no hay reloj, el microcontrolador no funciona.

Hace unos años, esta señal de reloj siempre era externa al microcontrolador. Hoy en día es extraño encontrar un microcontrolador que no lleve integrado este circuito de reloj, de modo que, uno puede comprarse un microcontrolador en una tienda especializada, programarlo y funcionará sin necesidad de componentes externos.

En este documento vamos a echar un vistazo a esta señal de reloj. Veremos como influye en la velocidad de un microcontrolador, estudiaremos qué es un ciclo de máquina y con algunos ejemplos simularemos cómo se ejecutan las instrucciones en un microcontrolador. Vemos aquí algunos ejemplos, en concreto el 12F675 y el 16F628:

Ambos microcontroladores son del fabricante Microchip (www.microchip.com).

Como ejercicio vamos a ir a su página web y echaremos un vistazo a sus características principales (seleccionamos la pestaña Productos/8-bit PIC Microcontrollers):

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Una vez seleccionada la página de microcontroladores de 8 bits, vemos una nueva página con una selección por características (cantidad y/o tipo de memoria, número de pines, tipo de familia y/o dispositivos integrados). Gracias a este listado podemos encontrar rápidamente aquellos microcontroladores con una determinada característica. Solo hay que hacer clic en el literal escogido (en nuestro caso por familia ya que conocemos el modelo) selecciona: “PIC12…” ya que buscamos las características del microcontrolador 12F675.

Entonces sólo tenemos que buscar en la lista en pantalla el modelo 12F675 y pinchar en su enlace que nos llevará a una nueva página donde encontraremos las características del microcontrolador que pasaremos a detallar en la siguiente página.

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Aprovechamos la información de la página web, para describir brevemente algunas de las características de este micro (12F675), que podemos encontrar en otros del mercado. Para entrar en detalles es recomendable descargar el documento de especificaciones. Buscad ‘datasheets’ en la página web.

Memoria E/S Timers A/D

1024

FLASH

64/128

SRAM/EEPROM 6 I/O (T0) 8bits y (T1) 16bits 10 bits, 4 canales

Podemos ver que tiene distintos tipos de memoria. El programa que diseñemos

se grabará en la memoria de programa (FLASH Program Memory) y los datos necesarios se grabarán en otra memoria diferente (RAM File Registers + Data

EEPROM). Puede verse en el siguiente diagrama de bloques extraído de su hoja técnica:

Este micro tiene 6 pines de E/S para conectar diferentes dispositivos digitales,

tiene dos temporizadores (T0) y (T1) y un convertidor A/D de 10 bits que podremos utilizar para medir cualquier magnitud física utilizando el sensor adecuado (temperatura, presión, humedad, nivel de luz, resistencia, etc.) Otras características específicas de este microcontrolador son:

- Reloj interno de 4Mhz con posibilidad de utilizar una señal de reloj externa - Sólo 35 instrucciones, es de tipo RISC (Reduced Instruction Set Computer) - Interrupt-on-pin change pin (interrupción cuando detecta cambio en pin E/S) - Dispone de un comparador analógico - Modo de ahorro de energía (SLEEP) - Brown-out Detect BOD (detección de fallo de alimentación) - Watchdog timer WDT (detección de bloqueos) - Protección del código grabado en el micro

Encontraremos en el mercado otros micros que incluyen conexión a USB, red, etc.

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Un microcontrolador siempre funciona con una señal de reloj. Además de las características principales como capacidad de memoria, E/S y otras, lo más importante a la hora de conocer bien un microcontrolador, es tener muy claro como se ejecutan sus instrucciones. Veamos qué sucede dentro de su pequeña unidad de proceso.

Hemos visto el ejemplo del micro 12F675 de Microchip, en clase utilizamos un

micro de Atmel a 12Mhz, pero en el mercado existen modelos que trabajan a diferentes frecuencias o velocidades de reloj. Vamos a empezar calculando la base de tiempos de varias máquinas para poder seguir.

Un período es el tiempo que transcurre entre dos flancos de subida de la señal de reloj, en nuestro caso y según el dibujo, está marcado por las flechas. Fíjate que la señal de reloj tiene una parte positiva y una parte negativa repitiéndose luego sucesivamente. De modo que el periodo (en adelante T) nos indica el tiempo que una señal de reloj tarda en completar un ciclo alto + ciclo bajo.

Si viajamos atrás en el tiempo, concretamente al año 1982, nos encontramos con el microordenador de 8 bits que inició a mucho que luego se convertirían en estusiastas de la informática, hablo del ZX Spectrum, fue el más popular de los años 80, con un microprocesador Z80 de la casa Zilogi funcionaba a una velocidad de 3,5Mhz! Calculemos su periodo T para ver lo rápido que funcionaba su señal de reloj:

Con estos sencillos cálculos comprobamos que para una frecuencia de reloj de 3,5Mhz, el periodo T = 0,285714 microsegundos, es decir, el tiempo que le cuesta a la señal de reloj generar un ciclo alto y un ciclo bajo.

Frecuencia = 3,5Mhz (1Mhz = 106 hz)

T (inversa frec.) = 1/(3,5 106 hz)

(llevo 106 al numerador…)

= 0,285714 10

-6 s = 0,285714 us

T = 0,285714 microsegundos

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Veamos ahora el ejemplo de un microcontrolador de la casa Microchip, el modelo 12F675 que hemos visto antes, un integrado de 8 patillas que funciona a una frecuencia de 4Mhz. Hacemos la misma operación que antes, pero teniendo en cuenta que su frecuencia es un poco mayor. Calculemos su periodo T:

Recordando la fórmula del periodo que ya hemos visto (inversa de la

frecuencia), comprobamos que se cumple con los dos ejemplos que cuando aumentamos la frecuencia, el periodo disminuye:

ν = 3,5Mhz � T = 0,28us

ν = 4,0Mhz � T = 0,25us

Nota: Es importante entender bien las fórmulas. A veces basta con escribir un par de ejemplos para dejar

claro su significado.

Hasta aquí hemos visto la relación entre la frecuencia y el periodo de una señal

de reloj T. Cuanto más frecuencia, menos período, es decir, menos tiempo. Como un microcontrolador lo único que hace es ejecutar instrucciones, si escogemos un microcontrolador con una frecuencia mayor, utilizará menos tiempo en ejecutar las mismas instrucciones.

En el ejemplo anterior he añadido una figura nueva (cronograma remarcado en

verde) para explicar cómo se ejecuta una instrucción dentro del microcontrolador. Hasta ahora sólo hemos calculado el tiempo que tarda la señal de reloj en hacer un ciclo completo, pero no tenemos ni idea de lo que sucede en este ciclo (T) ¿podrá ejecutarse una instrucción en un ciclo de reloj? o por el contrario, ¿necesitará varios ciclos de reloj para ejecutar una instrucción?

Frecuencia = 4Mhz (1Mhz = 106 hz)

T (inversa frec.) = 1/(4 106 hz)

(pasamos 106 al numerador…)

= 0,25 10

-6 s = 0,25 us

T = 0,25 microsegundos

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

CICLOS DE MÁQUINA (CM)

Un microcontrolador es un ordenador en miniatura, con su unidad de proceso, memoria, dispositivos y un juego de instrucciones propio de cada micro como hemos visto en clase: MOV, MOVX, ADD, RR, RL, NOP (en este caso para Atmel). Cada instrucción tiene una función definida y se ejecuta en un tiempo determinado. Hay instrucciones que necesitan más tiempo para ejecutarse y otras sencillas (NOP o RR) que se ejecutan en muy poco tiempo. Para determinar este tiempo se utiliza el término ciclo de máquina que se define como “el tiempo mínimo necesario para ejecutar una instrucción” y está formado por un número determinado de ciclos o periodos de reloj.

Recordando el cronograma que aparecía en la página anterior:

El tiempo de ejecución de todas las instrucciones está expresado en unidades de ciclos de máquina.

Ejemplo: ¿En un micro 12F675 en cuántos ciclos máquina se ejecuta NOP? Lo primero será buscar el datasheet del micro, vamos a la sección de juego de

instrucciones y vemos la tabla que aparece al pie. Buscamos la columna Cycles y ya lo tenemos: 1 ciclo de máquina. En un programa sólo tendremos que ir sumando el tiempo de ejecución de cada instrucción.

Si nos enseñan este dibujo, vemos que se ha definido cuatro estados: Q1 Q2 Q3 y Q4 y luego se va repitiendo, esto quiere decir que para este microcontrolador, un ciclo de máquina está formado por cuatro periodos de reloj y que el tiempo mínimo necesario para ejecutar una instrucción será para este microcontrolador en concreto de cuatro ciclos de reloj:

Es decir, CM (para este micro) = 4 * CLK = 4 * T

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

El ciclo de máquina cambia en cada microcontrolador. Por ejemplo para los micros de Atmel vistos en clase, un ciclo de máquina comprende 12 ciclos de reloj, sin embargo, en un microcontrolador como el 12F675 de Microchip, su ciclo de máquina comprende 4 ciclos de reloj. Por lo tanto para calcular tiempos de ejecución tenemos que saber la velocidad del reloj y tener a mano un cronograma que nos indique cuántos ciclos de reloj comprende un ciclo de máquina.

Retomando este cronograma que veíamos en el tema: “Arquitectura de la familia

de microcontroladores MCS-51” visto en clase:

Se puede ver claramente que la señal principal de reloj es OSC y que justo rotulado arriba puede verse cómo están agrupados los ciclos de reloj en estados (S1 a S6). Para este microcontrolador, el ciclo de máquina está formado por 6 estados, o lo que es lo mismo 12 ciclos de reloj.

Para este micro (el de clase): 1 ciclo de máquina = 12 ciclos de reloj = 12 * T

Básicamente hay que tener a mano dos cosas a la hora de calcular tiempos de

ejecución: 1. Frecuencia de funcionamiento del microcontrolador y 2. Cronograma que muestre la relación entre señal de reloj y estados como hemos visto en ambos casos (Atmel y Microchip). Ahora practicaremos con unos ejemplos lo que hemos visto.

Dado el microcontrolador visto en clase y con las hojas de datos de la microweb

a mano (como en el examen), calcularemos el tiempo de ejecución de las instrucciones PUSH y POP para diferentes frecuencias: 5Mhz, 9Mhz y 33Mhz.

Más adelante haremos lo mismo pero con un fragmento de código (habrá que ir

sumando los tiempos de ejecución parciales teniendo en cuenta que los bucles multiplicarán los tiempos de ejecución…pero eso ya lo veremos).

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Ejemplo: Microcontrolador Para 5Mhz Recordando: Cuando calculamos el periodo y el ciclo de máquina, hablamos de tiempos. - Frecuencia (٧) se mide en Hz - Periodo (T) se mide se segundos

Solución. Primero calculamos el periodo y el ciclo de máquina: 5Mhz es la frecuencia de reloj, calculemos su periodo, es decir, la inversa (1/5Mhz) T = 1/5Mhz = 0,2 * 10-6 s = 0,2 microsegundos, vemos en el dibujo el tiempo calculado:

T = 0,2 microsegundos, es el tiempo que tarda la señal en describir un ciclo de reloj (ciclo bajo + ciclo alto) a la frecuencia de 5Mhz. Podéis ver este tiempo delimitado por las líneas verticales azules. En este micro, cada ciclo de máquina comprende 6 estados: S1..S6, con dos ciclos de reloj cada uno, si sumamos los ciclos totales, tenemos 12 ciclos de reloj.

� Entonces: 0,2 microsegundos * 12 ciclos de reloj = 2,4 microsegundos

Para 5Mhz el ciclo de máquina CM = 2,4 microsegundos. Para calcular el tiempo de ejecución de la instrucción PUSH dir, miramos el manual:

En la segunda columna se indica los ciclos de máquina que necesita para ejecutarse (2), entonces tenemos:

PUSH directo � 2* CM = 2 * 2,4 microsegundos

� PUSH directo, se ejecutará en 4,8 microsegundos Para NOP lo mismo, miramos el manual:

Como sólo necesita 1 CM para ejecutarse, tardará 1 * CM = 1* 2.4 microsegundos

� NOP se ejecutará en 2,4 microsegundos

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Segundo ejemplo: 9Mhz Recordando (otra vez): - Cuando calculamos el periodo y el ciclo de máquina, hablamos de tiempos. - Frecuencia (٧) se mide en Hz - Periodo (T) se mide se segundos.

Solución. Primero calculamos el periodo y el ciclo de máquina: 9Mhz es la frecuencia de reloj, calculemos su periodo, es decir, la inversa (1/9Mhz) T = 1/9Mhz = 0,11 * 10-6 s = 0,11 microsegundos, lo vemos en el dibujo:

T = 0,11 microsegundos, es el tiempo que tarda la señal en describir un ciclo de reloj (ciclo bajo + ciclo alto) a la frecuencia de 9Mhz. Podéis ver este tiempo delimitado por las líneas verticales azules. Si no cambiamos de micro, lo mismo que en el caso anterior: En este micro, cada ciclo de máquina comprende 6 estados: S1..S6, con dos ciclos de reloj cada uno, si sumamos los ciclos totales, tenemos 12 ciclos de reloj. Entonces: 0,11 microsegundos * 12 ciclos de reloj = 1,33 microsegundos

Para 9Mhz el ciclo de máquina CM = 1,33 microsegundos Para calcular el tiempo de ejecución de la instrucción PUSH dir, miramos el manual:

En la segunda columna nos indica los ciclos de máquina que necesita para ejecutarse (2), entonces tenemos 2* CM = 2 * 1,33us

PUSH dir se ejecutará en 2,66 microsegundos Para NOP lo mismo, miramos el manual:

Y como sólo necesita 1 CM para ejecutarse, tardará 1 * CM = 1* 1,33 us

NOP se ejecutará en 1,33 microsegundos

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Tercer ejemplo: 33Mhz (aceleramos un poco) Recordando (otra vez ;-): - Cuando calculamos el periodo y el ciclo de máquina, hablamos de tiempos. - Frecuencia (٧) se mide en Hz - Periodo (T) se mide se segundos.

Solución. Primero calculamos el periodo y el ciclo de máquina: 33Mhz es la frecuencia de reloj, calculemos su periodo, es decir, la inversa (1/33Mhz) T = 1/33Mhz = 0,0303 * 10-6 s = 0,0303 microsegundos, lo vemos en el dibujo:

T = 0,0303 microsegundos, es el tiempo que tarda la señal en describir un ciclo de reloj (ciclo bajo + ciclo alto) a la frecuencia de 33Mhz. Podéis ver este tiempo delimitado por las líneas verticales azules. Si no cambiamos de micro, lo mismo que en el caso anterior: En este micro, cada ciclo de máquina comprende 4 estados: S1..S6, con dos ciclos de reloj cada uno, si sumamos los ciclos totales, tenemos 12 ciclos de reloj. Entonces: 0,0303 microsegundos * 12 ciclos de reloj = 0,3636 microsegundos

Para 33Mhz el ciclo de máquina CM = 0,3636 microsegundos. Para calcular el tiempo de ejecución de la instrucción PUSH dir, miramos el manual:

En la segunda columna nos indica los ciclos de máquina que necesita para ejecutarse (2), entonces tenemos 2* CM = 2 * 0,3636us

PUSH dir se ejecutará en 0,7272 microsegundos Para NOP lo mismo, miramos el manual:

Y como sólo necesita 1 CM para ejecutarse, tardará 1 * CM = 1* 0,3636 us = 0,3636 us.

NOP se ejecutará en 0,3636 microsegundos

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Ejercicio: Cálculo del tiempo de ejecución de un fragmento de código. Entorno: Microcontrolador Atmel a 12Mhz, los datos del juego de instrucciones puedes encontrarlas en la microweb o en Internet en la página del fabricante. Objetivos:

Fijar conceptos como el ciclo de máquina, repasar el juego de instrucciones y aprender a calcular el tiempo de ejecución de un programa en ensamblador. De esta manera te acostumbras a manejar las instrucciones, su codificación y te harás una idea más aproximada de algo que para muchos es tremendamente abstracto: Qué es lo que sucede dentro de un micro. Código de muestra: P0 equ 080h

org 0

MOV P0, #11110011b

MOV P0, A

RR A

MOV R0, #200

B1: NOP

NOP

NOP

DJNZ R0, B1

END

Algunos detalles a tener en cuenta para interpretar bien el código.

En este punto no importa qué es lo que hace el programa, no te entretengas en ello, vamos a calcular sólo el tiempo que le cuesta ejecutarse. P0 equ 080h

La primera línea define la etiqueta P0 con el valor 080h (080h es una dirección

de memoria que corresponde con un puerto de E/S). Cada vez que quieras utilizar esa dirección en una instrucción puedes escribir: MOV P0, A y no MOV 080h, A.

P0 es la etiqueta que defines, “equ” es la directiva y 080h es el valor asignado.

De este modo, si queremos cambiar de puerto a otra dirección por ejemplo: 090h

sólo tenemos que modificar la primera línea. De otro modo, habría que modificar todas las instrucciones del código (en nuestro ejemplo son pocas y no cuesta mucho, pero cuando hay miles de líneas cuesta bastante más). Podríamos haber definido el puerto con otra etiqueta así: Puerto equ 080h

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

También podríamos haber definido nombres como S1, S2 (salida1, salida2, etc.) Hay otra etiqueta en el código: B1 y otra directiva: END. Cuando se ensambla un programa, las etiquetas y las directivas sólo son ayudas o guías, no aparecen en el código máquina final, a modo de ejemplo son como las instrucciones de montaje de un modelo, te sirven para ver cómo montar y encajar las piezas, pero lo que montas al final es lo que hay dentro de la caja, las piezas (las instrucciones). El microcontrolador sólo ejecuta instrucciones (ni las etiquetas ni las directivas).

De hecho si buscas en la tabla de instrucciones las directivas equ, End o la

etiqueta B1 no las encontrarás. org 0

MOV P0, #11110011b

En la tercera línea, el símbolo ‘#’ indica que es modo inmediato, la instrucción

copia el valor 11110011 (F3 en hexadecimal) en P0 (en la dirección 080h). El sufijo ‘b’ indica que el número está representado en binario. Cuando aparece una ‘h’ como en el ejemplo de la primera línea, el número está representado en hexadecimal. También suele representarse en hexadecimal anteponiendo el prefijo ‘0x’, por ejemplo 0xF2.

En la instrucción MOV P0, A no se ha definido ‘A’ como en el ejemplo anterior de P0. Esto es porque el entorno de desarrollo (Keil) trae unas etiquetas de serie para este micro (A, R0, R1…) y podemos utilizarlas sin definirlas.

La instrucción DJNZ es salto condicional. Decrementa el registro R0 y salta a otra parte del código si su valor no es cero, de modo y como puedes ver, como R0 se ha cargado con el valor 200, es un bucle que como mínimo se ejecutará 200 veces.

Veamos ahora el código de operación de cada instrucción, los bytes que ocupa cada una y su tiempo de ejecución, que es lo mismo que decir cuántos ciclos máquina consumirá dicha instrucción.

Antes del bucle (hasta B1)

La única pega podría venir de la 3ª instrucción, ya que si buscamos en las hojas, no encontramos la instrucción con P0 en el primer operando. Pero como P0 = 080h, en realidad el micro ve la instrucción así: MOV directo, #11110011b, es decir, copia un valor en una dirección de memoria. Recuerda, una dirección de memoria en las hojas aparecerá como ‘directo’. No confundas aquí los modos de direccionamiento.

P0 equ 080h

org 0

MOV P0, #11110011b

MOV P0, A

RR A

MOV R0, #200

--- bucle ---

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Veamos como va quedando nuestro ejercicio. Todos los datos se sacan de las tablas. En total, las 4 instrucciones se ejecutan en 5 ciclos de máquina:

Instrucción CM Código Segundo byte Tercer byte P0 equ 080h 0 -- -- --

MOV P0, #11110011b 2 01110101 10000000 (dirección) 11110011 (dato = 243d)

MOV P0, A 1 11110101 10000000 (dirección) --

RR A 1 00000011 -- --

MOV R0, #200 1 01111000 11001000 (dato = 200d) --

Total CM 5 Tiempo de ejecución: 5 * T = 5 * 1us = 5 microsegundos

Nota: La primera línea (P0 equ 080h) no genera instrucción alguna, es una directiva que utiliza el

ensamblador como ya vimos. Lo mismo sucede con la directiva END que veréis en los programas, sólo indica al ensamblador el final del código.

Dentro del bucle:

Instrucción CM Código Segundo byte Tercer byte NOP 1 00000000 -- --

NOP 1 00000000 -- --

NOP 1 00000000 -- --

DJNZ R0, dir 2 11011000 (dirección de salto) --

Total CM 5*200 = 1.000 Tiempo de ejecución: 5 * 200 * 1us = 1000 microsegundos

Una pasada del bucle tarda en ejecutarse 5 ciclos de máquina, pero como salta

200 veces hasta que R0 llega a cero, el bucle tarda en ejecutarse 5*200.

El código presentado en el ejercicio tardará en ejecutarse: 1.005 ciclos de máquina y para un microcontrolador a 12Mhz (1us de CM) se ejecutaría en 1.005 microsegundos.

Como actividad se propone descargar hojas de características de micros de diferentes fabricantes y experimentar las diferencias que existen en sus tiempos de ejecución para un bucle sencillo de 200 ciclos.

También puede utilizarse el entorno Keil para comprobar cómo cada instrucción corresponde exactamente con los códigos de operación, bytes de datos y direcciones en función de los modos de direccionamiento utilizados en las tablas. En la parte inferior de la figura puede apreciarse el código hexadecimal de cada una de las instrucciones escritas arriba:

MOV 80h, A genera � F580 MOV 80h, #11111111b genera � 7580FF

* Como actividad se propone cambiar algunas instrucciones y recalcular el ejercicio. Al final es un proceso bastante automático una vez conocidos los detalles.

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Ejercicio 2: Para el siguiente fragmento de código, analizar el tiempo de ejecución total y rellenar la tabla con los códigos de instrucción, bytes y ciclos de máquina para un micro de la familia MCS-51 a 6Mhz. Añadir las direcciones de memoria que ocupa.

B: equ 0F0h

org 8000h

Etiqueta1:

MOV R0, #11111111b

MOV B, 30h

MOV R1, 31h

CLR A

Etiqueta2:

ADD A, @R1

INC R1

DJNZ R0, Etiqueta2

Etiqueta3:

DIV AB

MOV 32h, A

MOV 33h, B

End.

En este ejercicio se trabaja con un micro MCS-51 (1 CM = 12 ciclos de reloj), pero hay que calcular su periodo T = 1/frecuencia… T = 1/6Mhz = 0,166 * 10-6 = 0,16 microsegundos, por lo tanto: 1 CM @6Mhz � 12 * 0,16 microsegundos = 2 microsegundos.

Dir. Memoria

Instrucción CM Código Segundo byte Tercer byte

B: equ 0F0h 0 -- -- --

Org 8000h 0 -- -- --

8000 MOV R0, #11111111b 2 0111 1 r r r FFh --

8002 MOV B, 30h 2 1000 0101 30h B (0F0h)

8005 MOV R1, 31h 2 1010 1 r r r 31h --

8007 CLR A 1 1110 0100 -- -- Total ciclos ���� 7

8008 ADD A, @R1 1 0010 011 i -- --

8009 INC R1 1 0000 1 r r r -- --

800A DJNZ R0, Etiqueta2 2 1101 1 r r r Dirección de salto -- Total ciclos ���� 4* pasadas del bucle

800C DIV AB 4 1000 0100 -- --

800D MOV 32h, A 1 1111 0101 32h --

800F MOV 33h, B 2 1000 0101 B (0F0h) 33h Total ciclos ���� 7

En este ejercicio el bucle se ejecuta mientras R0 no sea cero. Por lo tanto habrá

un tiempo de ejecución anterior y posterior al bucle (primeras instrucciones y últimas). En la tabla se ha calculado los parciales para clarificar los tiempos. Es importante fijarse que cuando si el código de instrucción incluye ‘rrr’, hay que sustituirlas por el número en binario del registro que se esté utilizando, si es R3 � rrr = 011, etc. Una vez tengamos el total de ciclos de máquina necesarios para ejecutar el programa, solo hay que multiplicar por el tiempo que hemos calculado antes (2microsegundos).

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria

Ejercicio 3: Para el siguiente fragmento de código, analizar el tiempo de ejecución total y rellenar la tabla con los códigos de instrucción, bytes y ciclos de máquina para un micro de la familia MCS-51 a 33Mhz. Incluir el mapa de memoria.

Entrada: equ 080h

Salida: equ 090h

org 100h

Inicio:

MOV R0, #00001111b

CLR A

Copia:

MOV Salida, Entrada

DJNZ R0, Copia

NOP

NOP

Finaliza:

MOV Salida, #FFh

End.

i Zilog, http://www.zilog.com/

Informática Industrial

v0.2 Marzo 2007 · Bloque 2 · Microcontroladores · Documentación complementaria