Page 40
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Temporización
Una fuente de reloj de alta frecuencia (típicamente derivada de un cristal conectado al
MCU) se usa para controlar el secuenciamiento de las instrucciones de la CPU. Los
MCU típicos dividen la frecuencia base del cristal por dos o más para obtener un reloj
de frecuencia de bus. Cada lectura o escritura de memoria toma un período (ciclo) de la
frecuencia de bus. En el caso del MC68HC705J1A, un reloj oscilador a cristal de 4
MHz (máximo) dividido por 2 obtiene la frecuencia interna de reloj del procesador de
frecuencia de bus (500 nS mínimo). La mayoría de las instrucciones toman de dos a
cinco de estos pasos; por lo tanto, la CPU es capaz de ejecutar más de 500000
instrucciones por segundo.
Programa visto por la CPU
El listado 4-1 es de un pequeño programa de ejemplo que usaremos en nuestra discusión
de la CPU. El capítulo de programación provee mucha más información que la que
necesita ka CPU para que una persona pueda leer y entender programas. En la primera
columna se presentan direcciones de cuatro dígitos hexadecimales. Las tres columnas
que le siguen, son valores de 8 bits (el contenido de una única posición de memoria). El
resto de la información del listado es para ayudar a la persona que necesita leer el
listado.
El significado de esta información será discutido más detalladamente en el capítulo de
programación.
La figura 4-2 es un mapa de memoria del MC68HC705J1A, presenta cómo el programa
de ejemplo se aloja en la memoria del MCU. Esta figura es similar a la figura 3-4
excepto que una diferente porción del espacio de memoria ha sido expandida para
presentar el contenido de todas las posiciones de memoria en el programa de ejemplo.
La figura 4-2 muestra que la CPU ve al programa de ejemplo como una secuencia lineal
de códigos binarios, incluyendo instrucciones y operandos en posiciones de memoria
consecutivas. Un operador es cualquier valor, que no es un código de operación, y que
la CPU necesita para completar una instrucción. La CPU inicia este programa con su
contador de programa (PC) apuntando al primer byte del programa. El código de
operación de cada instrucción le dice a la CPU cuántos (si los hay) y de qué tipo son, los
operandos que vienen en la instrucción. Así la CPU puede mantenerse en línea con los
límites de una instrucción sin mezclar códigos de operación con operandos, lo que se
nos presenta confuso.
__rendered_path__13
40
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 41
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Image_173_0
Listado 4-1 – Programa de Ejemplo.
__rendered_path__13
41
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 42
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Image_177_0
Fig. 4-2 – Mapa de memoria del Programa Ejemplo.
__rendered_path__13
42
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 43
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
La mayoría de los programas de aplicación podrían alojarse en ROM, EPROM u
OTPROM / FLASH, aunque no es un requerimiento especial las instrucciones deberán
estar en una memoria tipo ROM para ser ejecutadas. En lo que a la CPU respecta, un
programa es sólo una serie de patrones de bits que procesará secuencialmente.
Estudiaremos cuidadosamente el listado 4-1 del programa de ejemplo y el mapa de
memoria de la figura 4-2. encontraremos la primera instrucción de la subrutina DLY50
en el listado 4-1 y luego encontraremos los mismos dos bytes en la figura 4-2.
Habremos encontrado una línea de la siguiente forma casi al final del listado 4-1.
0323 B7 EO DLY50 STA TEMP1 ; Save accumulator en RAM
La sección resaltada de memoria a la derecha de la figura 4-2 es el área que habremos
identificado.
Operación de la CPU
En esta sección discutiremos primero la operación detallada de las instrucciones de la
CPU y luego explicaremos cómo la CPU ejecutaría el programa de ejemplo. Trataremos
de hacer una detallada descripción de típicas instrucciones de la CPU para pensar cómo
lo hace una CPU. Podemos entonces recorrer el programa de ejemplo usando una
técnica de adiestramiento llamada “jugando a la computadora”en la que pretenderemos
ser una computadora interpretando y ejecutando las instrucciones de un programa.
Operación detallada de las Instrucciones de la CPU
Antes de ver cómo la CPU ejecuta los programas, nos ayudaría conocer (en detalle)
cómo la CPU divide una instrucción en operaciones fundamentales y realiza estas
pequeñas etapas para llevar a cabo una determinada instrucción. Como veremos,
muchos pequeños pasos se ejecutan rápidamente y con suma precisión dentro de cada
instrucción, pero nada de estas pequeñas etapas es demasiado complicada.
El circuito de lógica dentro de la CPU parecería ríspido para un ingeniero habituado a
trabajar con lógica TTL o bien con lógica de relevadores. Lo que hace del MCU y su
CPU otras formas de lógica digital es la densidad del encapsulado. Las técnicas de muy
alta escala de integración (VLSI) hacen posible colocar el equivalente de miles de
circuitos integrados TTL en una simple pastilla de silicio. Ordenando las compuertas de
lógica para formar una CPU, podemos obtener un ejecutor de instrucciones de propósito
general capaz de actuar como una caja negra universal. Colocando diferentes
combinaciones de instrucciones podría virtualmente realizar cualquier función definible.
Una típica instrucción toma de dos a cinco períodos del reloj interno del procesador.
Aunque normalmente no es importante saber con exactitud qué sucede durante cada uno
de estos períodos de ejecución, será de ayuda recorrer algunas instrucciones en detalle
para entender cómo trabaja internamente la CPU.
__rendered_path__13
43
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 44
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Almacenamiento del Acumulador (Modo de Direccionamiento Directo)
Echemos un vistazo a la instrucción STA en el apéndice A. En la tabla de la parte
inferior de la página, veremos que $B7 es la versión en modo de direccionamiento
directo (DIR) de la instrucción almacenamiento del acumulador. Además veremos que
la instrucción requiere dos bytes, el primero para especificar el código de operación
($B7) y el segundo para especificar la dirección directa donde será almacenado el
acumulador. (Los dos bytes se presentan como “B7 dd”en la columna de código de
máquina de la tabla).
Discutiremos el modo de direccionamiento directo más detalladamente en otro capítulo,
pero la breve descripción siguiente nos ayudará a entender cómo la CPU ejecuta esta
instrucción. En el modo de direccionamiento directo, la CPU asume que la dirección
está en el rango de $0000 a $00FF; en consecuencia, no es necesario incluir los dos
dígitos de más peso de la dirección del operando en la instrucción (pues es siempre
$00).
La tabla de la parte inferior de la página correspondiente a STA nos muestra que la
versión de STA en modo de direccionamiento directo toma cuatro períodos de la CPU
para su ejecución. Durante el primer ciclo, la CPU vuelca el contenido del contador de
programa sobre el bus interno de direcciones y lee el código de operación $B7, que
identifica a la instrucción como la versión en modo de direccionamiento directo de la
instrucción STA y avanza a la PC hasta la próxima posición de memoria.
Durante el segundo ciclo, la CPU vuelca el contenido de la PC sobre el bus interno de
direcciones y lee el byte de menos peso de la dirección directa ($00 por ejemplo). La
CPU usa el tercer ciclo de esta instrucción STA para armar en su interior la dirección
completa donde se almacenará el acumulador, ya que avanza al PC hasta la próxima
posición de memoria (la dirección del código de operación de la próxima instrucción).
En este ejemplo, la CPU une el valor asumido $00 (por ser de modo de
direccionamiento directo) con el $00 que fue leído durante el segundo ciclo la
instrucción para obtener la dirección completa $0000. durante el cuarto ciclo de esta
instrucción la CPU vuelca la dirección construida sobre el bus interno de direcciones,
además vuelca el contenido del acumulador sobre el bus interno de datos y acciona la
señal de escribir. Esto es, la CPU escribe el contenido del acumulador en la posición de
memoria $0000 durante el cuarto ciclo de la instrucción STA.
Mientras el acumulador está siendo almacenado, los bits N y Z del registro de código de
condición son modificados de acuerdo al dato almacenado. La fórmula de lógica
booleana para estos bits está en la mitad de la página de la instrucción STA. El bit Z irá
a uno lógico si el valor almacenado es $00; sino, el bit Z irá a cero lógico. El bit N irá a
uno lógico si el bit más significativo del valor almacenado es uno; sino el bit N irá a
cero lógico.
__rendered_path__13
44
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 45
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Carga del Acumulador (Modo de Direccionamiento Inmediato)
Echemos un vistazo a la instrucción LDA en el apéndice A. En la tabla de la parte
inferior de la página, veremos que $A6 es la versión en modo de direccionamiento
inmediato (IMM) de la instrucción carga del acumulador. Además veremos que la
instrucción requiere dos bytes, el primero para especificar el código de operación ($A6)
y el segundo para especificar el dato inmediato con que será cargado el acumulador.
(Los dos bytes se presentan como “A6 ii”en la columna de código de máquina de la
tabla).
La tabla de la parte inferior de la página correspondiente a LDA nos muestra que la
versión de LDA en modo de direccionamiento inmediato toma dos períodos de la CPU
para su ejecución. Durante el primer ciclo, la CPU vuelca el contenido del contador de
programa sobre el bus interno de direcciones y lee el código de operación $A6, que
identifica a la instrucción como la versión en modo de direccionamiento inmediato de la
instrucción LDA y avanza a la PC hasta la próxima posición de memoria (la dirección
del operando inmediato ii).
Durante el segundo ciclo, la CPU vuelca el contenido del PC sobre el bus interno de
direcciones, lee el byte del dato inmediato y lo carga en el acumulador, y luego avanza
la PC hasta la próxima posición de memoria (la dirección del código de operación de la
próxima instrucción).
Mientras el acumulador está siendo cargado, los bits N y Z del registro de código de
condición son modificados de acuerdo al dato almacenado. La fórmula de lógica
booleana para estos bits está en la mitad de la página de la instrucción LDA. El bit Z irá
a uno lógico si el valor cargado es $00; sino el bit Z irá a cero lógico. El bit N irá a uno
lógico si el bit más significativo del valor almacenado es uno; sino el bit N irá a cero
lógico.
El bit N (negativo) puede servir para detectar el signo de números signados según el
convenio de complemento a dos. En este convenio el bit más significativo es usado
como un bit de signo, un uno indica un valor negativo y un cero uno positivo. El bit N
puede además usarse sólo como indicador del estado del bit de más peso de una
magnitud binaria.
Bifurcación Condicional
Las instrucciones de bifurcación condicional permiten a la CPU elegir uno de dos
posibles caminos a seguir por el programa, dependiendo del estado de un bit en
particular de la memoria o bien de varios bits del CCR. Si la condición evaluada por la
instrucción de bifurcación es verdadera, el programa efectúa la bifurcación a la
posición de memoria especificada. Si la condición evaluada es falsa, la CPU continúa
con la instrucción siguiente a la instrucción de bifurcación. Los bloques de decisión en
un diagrama de flujo corresponden a instrucciones de bifurcación condicional en un
programa.
__rendered_path__13
45
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 46
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
La mayoría de las instrucciones de bifurcación contienen dos bytes, uno para el código
de operación y otro para un byte de desplazamiento relativo. Las instrucciones bifurcar
si el bit es cero (BRCLR) y bifurcar si el bit es uno (BRSET) requieren tres bytes: el
código de operación, un byte de una dirección directa de un byte (para especificar la
posición de memoria a evaluar) y el byte de desplazamiento relativo.
El byte correspondiente al desplazamiento relativo es interpretado por la CPU como un
número signado en convenio de complemente a dos. Si la condición de bifurcación
evaluada es verdad, este desplazamiento con signo se suma a la PC y la CPU lee su
próxima instrucción desde la nueva dirección calculada. Si la condición de bifurcación
evaluada es falsa, la CPU continúa con la instrucción siguiente a la de bifurcación.
Llamado a Subrutinas y Retornos
Las instrucciones salto (JSR) y bifurcación (BSR) a subrutina automatizan el proceso
permitiendo salir del flujo lineal normal de un programa, ejecutar un grupo de
instrucciones y luego retornar al punto desde donde se saliera del flujo normal del
programa. El grupo de instrucciones externas al programa normal se denomina
subrutina. Una instrucción JSR o BSR se usa para ir del programa en curso a una
subrutina. Una instrucción retorno de subrutina (RTS) se usa para completar una
subrutina, para retornar al programa desde el que fuera llamada la subrutina.
El listado 4-2 presenta líneas del listado de un programa de ejemplo generado por un
ensamblador que usaremos para demostrar cómo la CPU ejecuta un llamado a subrutina.
Asumimos que el puntero a la pila (SP) apunta a la dirección $00FF cuando la CPU
encuentra la instrucción JSR en la posición de memoria $0302. Este listado se describe
con más detalle en el capítulo 6.
Image_190_0
Listado 4-2 – Ejemplo de llamado a Sub – Rutina.
Haremos referencia a la figura 4-3 durante la siguiente discusión. Partiremos nuestra
explicación con la CPU ejecutando la instrucción “LDA #$02”en la dirección $0300. el
lado izquierdo de la figura muestra el flujo normal del programa compuesto por TOP
LDA #$ 02, JSR SUBBY y STA $EO (en ese orden) ubicados en posiciones de
memoria consecutivas. En el lado derecho nos presenta las instrucciones de la subrutina
SUBBY DECA, BNE SUBBY y RTS.
__rendered_path__13
46
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar

Page 47
Curso Introductorio sobre Microcontroladores familias HC705 y HC908 de Freescale
Image_194_0
Fig. 4-3 – Secuencia de llamado de una Sub-rutina.
El número de ciclos de reloj de la CPU (entre corchetes) se usará como referencia en la
siguiente explicación de esta figura.
[1] La CPU lee el código de operación $A6 de la posición de memoria $0300 (LDA
inmediato).
[2] La CPU lee el dato inmediato $02 de la posición de memoria $0301 y lo carga en el
acumulador.
[3] La CPU lee el código de operación $CD de la posición de memoria $0302 (JSR
extendido)
[4] La CPU lee el byte más significativo de la dirección extendida $04 de la posición de
memoria $0303.
[5] La CPU lee el byte menos significativo de la dirección extendida $00 de la posición
de memoria $0304.
[6] La CPU arma la dirección completa de la subrutina ($0400).
[7] La CPU escribe $05 en la posición de memoria $00FF y decrementa el SP a $00FE.
En otras palabras diremos que “hemos ingresado en la pila el byte menos significativo
de la dirección de retorno”.
[8] La CPU escribe $03 en la posición de memoria $00FE y decrementa el SP a $00FD.
En otras palabras diremos que “hemos ingresado en la pila el byte más significativo de
la dirección de retorno”. La dirección de retorno salvada en la pila es $0305, que es la
de la instrucción siguiente al JSR.
__rendered_path__13
47
Autor : Ing. Daniel Di Lella – Dedicated Field Application Engineer
__rendered_path__9__rendered_path__11
www.edudevices.com.ar - dilella@arnet.com.ar