Tutorial Microcontroladores
Microcontroladores
Puntero de Pila (SP) :
El puntero de pila (SP), es un registro de 16 bits que contiene la dirección del próximo Lugar en la pila (Stack). Durante un Reset, el puntero de pila, es preseteado a $00FF. La instrucción Reset Stack Pointer (RSP), setea al byte menos significativo a $FF y no afecta al byte más significativo. Esto se hace para mantener la compatibilidad con el modo de funcionamiento del puntero de pila de la familia HC705.
El puntero de pila es decrementado cuando un dato es almacenado (Push) dentro de la pila e incrementado cuando un dato es recuperado (Pull) desde la pila.
La localización de la pila es arbitraria, y puede ser "re-ubicada" en cualquier parte de la memoria RAM. Moviendo el puntero fuera de la página 0 ($0000 a $00FF) libera el espacio del direccionamiento directo. Para una operación correcta, el puntero de pila debe apuntar solamente posiciones de RAM, aunque por su longitud, pueda "barrer" todo el espacio de memoria del MCU.
Gracias a esta característica, en los modos de direccionamiento con el SP (Stack Pointer) con 8 bits de offset y 16 bits de offset, el puntero de pila (SP) puede funcionar como un segundo registro índice de 16 bits o bien para acceder a datos en la pila. El uso del SP como un segundo registro índice, es muy utilizado en los compiladores de lenguaje de alto nivel como los compiladores "C" y otros.
Contador de Programa (PC):
Al igual que en el CPU05, el Contador de Programa (PC), es de 16 bits de longitud, pero a diferencia de este, el PC del CPU08, no tiene bits fijos en algunas de sus posiciones, o sea el PC puede moverse entre $0000 y $FFFF. De esta forma, el PC puede moverse teóricamente (muchos MCUs de la familia HC908, poseen memorias de programas inferiores a los 64Kbytes) por los 64 Kbytes de espacio de memoria.
Durante el Reset, el contador de programa (PC) se carga con la dirección contenida en el "Reset Vector" que para el MC68HC908 se encuentra en la posición $FFFE y $FFFF. La dirección contenida en el vector, es la dirección de la primera instrucción a ser ejecutada después de salir del estado de RESET.
Registro de Código de Condición (CCR). El registro de código de condición contiene una máscara de interrupción y cinco indicadores de estado que reflejan el resultado de operaciones aritméticas y de otro tipo de la CPU. En esencia, es idéntico al del CPU05, pero con el agregado de una nueva bandera, la de “desborde” (Overflow) o V flag. Las cinco banderas son, Desborde (V), semi acarreo (H), máscara de interrupción (I), negativo (N), cero (Z) y acarreo / préstamo (C).
V – Bit de Desborde :
El CPU pone en 1 el bit de desborde cuando ocurre un desborde por complemento a dos.
Las instrucciones de salto condicionales signados como BGT, BGE, BLE, y BLT usan este bit de desborde.
Modos de Direccionamiento
El poder de cualquier computadora radica en la habilidad para acceder a memoria. Los modos de direccionamiento de la CPU proveen esta capacidad. Los modos de direccionamiento difieren la manera en que una instrucción obtendrá el dato requerido para su ejecución. Debido a los diferentes modos de direccionamiento, una instrucción puede acceder al operando en una de las diversas maneras. Cada variante de diferente modo de direccionamiento de una instrucción debe tener un único código de operación de instrucción, de tal modo que las 62 instrucciones básicas de la CPU del MC68HC05 requieren 210 códigos de operación de instrucción distintos.
La CPU del MC68HC05 usa seis modos de direccionamiento para hacer referencia a memoria. Los seis modos de direccionamiento son inherente, inmediato, extendido, directo, indexado (sin desplazamiento, con desplazamiento de 8 bits, o de 16 bits) y relativo. En los pequeños microcontroladores MC68HC05, todas las variables del programa y los registros de I/O caben en el área de memoria que va de $0000 a $00FF donde el modo de direccionamiento más comúnmente usado es el direccionamiento directo.
En los siguientes párrafos se provee una descripción general y ejemplos de los variados modos de direccionamiento. El término dirección efectiva es usado para indicar la dirección de la posición de memoria donde el argumento para una instrucción es buscado o almacenado. En el apéndice A está disponible la descripción de cada instrucción.
La información provista en los listados de los programas de ejemplo, usan diversos símbolos para identificar variados tipos de números que se presentan en un programa. El capítulo 2 incluye la descripción de los sistemas de numeración y códigos de computadora.
1. El espacio en blanco o ningún símbolo indica que el número es decimal. Este número será trasladado a un valor binario antes de ser almacenado en memoria para ser usado por la CPU.
2. El símbolo $ precediendo a un número indica que el número es hexadecimal; por ejemplo $24 es 24(16) en hexadecimal o el equivalente de 36(10).
3. El símbolo # indica un operando y el número es buscado en la posición de memoria siguiente a la del código de operación. Una variedad de símbolos y expresiones pueden ser usadas siguiendo al carácter #. Ya que no todos los ensambladores usan las mismas reglas de sintaxis ni los mismos caracteres especiales, es necesario referirse a la documentación del ensamblador en particular que usemos.
Para cada modo de direccionamiento es explicada en detalle una instrucción. Esta explicación describe qué sucede en la CPU durante cada ciclo de reloj del procesador de la instrucción. En estos ejemplos, los números de secuencia entre corchetes [nro.] hacen referencia a un ciclo de reloj de la CPU específico.
Modo de Direccionamiento Inmediato
En el modo de direccionamiento inmediato, el operando está contenido en el byte inmediato siguiente al código de operación. Este modo es usado cuando un valor o constante conocido al momento de escribir el programa que no cambiará durante la ejecución del programa. Esta es una instrucción de dos bytes, uno para el código de operación y otro para el byte de dato inmediato.
Listado del Programa de Ejemplo:
0300 A6 02 LDA #$02 ; Cargar el Acumulador con el valor
inmediato
Secuencia de Ejecución:
$0300 $A6 [1]
$0301 $02 [2]
Explicación:
[1] La CPU lee el código de operación $A6 - Carga del acumulador con el valor inmediato siguiente al código de operación.
[2] La CPU lee el dato inmediato $02 de la posición de memoria $0301 y lo carga en el acumulador.
La tabla 5-1 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento inmediato.
Tabla 5-1 – Instrucciones con Modo de Direccionamiento Inmediato.
Modo de Direccionamiento Inherente
En el modo de direccionamiento inherente, toda la información requerida para la operación ya es implícitamente conocida por la CPU y no es necesario recuperar un operando exterior desde la memoria. Los operandos (si los hay) son sólo los registros de la CPU o bien valores de datos almacenados en la pila. Esta es una instrucción de un solo byte.
Listado del Programa de Ejemplo:
0300 4C INCA ; Incrementar el Acumulador
Secuencia de Ejecución:
$0300 $4C [1], [2] y [3]
Explicación:
[1] La CPU lee el código de operación $A6 - Incremento del acumulador.
[2] La CPU le suma uno al valor actual del acumulador.
[3] La CPU almacena el nuevo valor en el acumulador y ajusta las banderas del registro de código de condición de ser necesario.
La tabla 5-2 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento inherente.
Tabla 5-2 - Instrucciones con Modo de Direccionamiento Inherente.
Modo de Direccionamiento Extendido
En el modo de direccionamiento extendido, la dirección del operando está contenida en los dos bytes siguientes al código de operación. Este modo es usado para hacer referencia a cualquier posición de memoria dentro del espacio de memoria del MCU, incluyendo I/O, RAM, ROM, EPROM, FLASH. Esta es una instrucción de tres bytes, uno para el código de operación y otros dos para la dirección del operando.
Listado del Programa de Ejemplo:
0300 C6 03 65 LDA $0365 ; Cargar el acumulador desde
; una dirección extendida
Secuencia de Ejecución:
$0300 $C6 [1]
$0301 $03 [2]
$0302 $65 [3] y [4]
Explicación:
[1] La CPU lee el código de operación $C6 - Carga del acumulador usando el modo de direccionamiento extendido.
[2] La CPU lee $03 de la posición de memoria $0301. Este $03 es interpretado como la mitad de mayor peso de una dirección.
[3] La CPU lee $65 de la posición de memoria $0302. Este $65 es interpretado como la mitad de menor peso de una dirección.
[4] La CPU arma la dirección extendida completa $0365 con los dos valores previamente leídos. Esta dirección es colocada en el bus de direcciones y la CPU lee el valor del dato contenido en la posición de memoria $0365 y lo carga en el acumulador.
La tabla 5-3 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento extendido.
Tabla 5-3 – Instrucciones con Modo de Direccionamiento Extendido
Modo de Direccionamiento Directo
El modo de direccionamiento directo, es similar al extendido excepto que la parte alta de la dirección del operando se asume de valor $00. De tal manera, que sólo es necesario incluir el byte de menos peso de la dirección del operando en la instrucción. Esta área se denomina página directa e incluye a los registros de RAM e I/O del interior del chip. Este modo es eficiente tanto en economía de espacio de memoria de programa como en menor tiempo de ejecución. Esta es una instrucción de dos bytes, uno para el código de operación y otro para el byte de menor peso de la dirección del operando.
Listado del Programa de Ejemplo:
0300 B6 E0 LDA $E0 ; Cargar el acumulador desde una dirección de página
; directa
Secuencia de Ejecución:
$0300 $B6 [1]
$0301 $E0 [2] y [3]
Explicación:
[1] la CPU lee el código de operación $B6 - Carga del acumulador usando el modo de direccionamiento directo.
[2] La CPU lee $E0 de la posición de memoria $0301. Este $E0 es interpretado como la mitad de menor peso de una dirección de página directa (desde $0000 hasta $00FF).
[3] La CPU arma la dirección directa completa $00E0 asumiendo el valor del byte de mayor peso en $00, con el valor previamente leído del byte de menor peso. Esta dirección es colocada en el bus de direcciones y la CPU lee el valor del dato contenido en la posición de memoria $00E0 y lo carga en el acumulador.
La tabla 5-4 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento directo.
Tabla 5-4 – Instrucciones con Modo de Direccionamiento Directo.
Modo de Direccionamiento Indexado
En el modo de direccionamiento indexado, la dirección efectiva del operando es variable y depende de dos factores: 1) el contenido actual del registro índice (X) y 2) el desplazamiento contendido en el / los byte/s siguiente/s al código de operación. La CPU del MC68HC05 soporta tres tipos de direccionamientos indexados: sin desplazamiento, con desplazamiento de 8 bits y con desplazamiento de 16 bits. Un buen ensamblador usará el modo de direccionamiento indexado que requiera el menor número de bytes para expresar el desplazamiento.
Indexado sin desplazamiento. En el modo de direccionamiento indexado sin desplazamiento, la dirección efectiva del operando para la instrucción está contenida en los 8 bits del registro índice. Así, este modo de direccionamiento puede acceder a las primeras 256 posiciones de memoria (desde $0000 hasta $00FF). Esta es una instrucción de un solo byte.
Listado del Programa de Ejemplo:
0300 F6 LDA 0,X ; Cargar el acumulador desde la dirección apuntada
; por X
Secuencia de Ejecución:
$0300 $F6 [1], [2] y [3]
Explicación:
[1] La CPU lee el código de operación $F6 - Carga del acumulador usando el modo de direccionamiento indexado sin desplazamiento.
[2] la CPU arma la dirección completa sumando $0000 al contenido del registro índice de 8 bits (X).
[3] Esta dirección es colocada en el bus de direcciones y la CPU lee el valor del dato contenido en esa posición de memoria y lo carga en el acumulador.
La tabla 5-5 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento indexado sin desplazamiento y con desplazamiento de 8 bits.
Tabla 5-5 – Instrucciones con Modo de Direccionamiento Indexado
(No offset o 8 Bits Offset)
Indexado con desplazamiento de 8 bits. En el modo de direccionamiento indexado con desplazamiento de 8 bits, la dirección efectiva es la suma del contenido del registro índice de 8 bits y el byte de desplazamiento siguiente al código de operación. El byte de desplazamiento suministrado en la instrucción es un número entero no signado de 8 bits. Esta es una instrucción de dos bytes, uno para el código de operación y otro para el byte de desplazamiento. El contenido del registro índice no es alterado.
Listado del Programa de Ejemplo:
0300 E6 05 LDA 5,X ; Cargar el acumulador desde el 6to. ítem de la
; tabla apuntada por X
Secuencia de Ejecución:
$0300 $E6 [1]
$0301 $05 [2], [3] y [4]
Explicación:
[1] La CPU lee el código de operación $E6 - Carga del acumulador usando el modo de direccionamiento indexado con desplazamiento de 8 bits.
[2] La CPU lee $05 de la posición de memoria $0301. Este $05 es interpretado como un desplazamiento de 8 bits.
[3] La CPU arma la dirección completa sumando el valor antes leído ($05) al contenido del registro índice de 8 bits (X).
[4] Esta dirección es colocada en el bus de direcciones y la CPU lee el valor del dato contenido en esa posición de memoria y lo carga en el acumulador.
La tabla 5-5 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento indexado sin desplazamiento y con desplazamiento de 8 bits.
Indexado con desplazamiento de 16 bits. En el modo de direccionamiento indexado con desplazamiento de 16 bits, la dirección efectiva es la suma del contenido del registro índice de 8 bits y los dos bytes de desplazamiento siguientes al código de operación. El byte de desplazamiento suministrado en la instrucción es un número entero no signado de 16 bits. Esta es una instrucción de tres bytes, uno para el código de operación y otros dos para los bytes de desplazamiento. El contenido del registro índice no es alterado.
Listado del Programa de Ejemplo:
0300 D6 03 77 LDA $377,X ; Cargar el acumulador desde el X+1er.
; ítem de la tabla $0377
Secuencia de Ejecución:
$0300 $D6 [1]
$0301 $03 [2]
$0302 $77 [3], [4] y [5]
Explicación:
[1] La CPU lee el código de operación $D6 - Carga del acumulador usando el modo de direccionamiento indexado con desplazamiento de 16 bits.
[2] La CPU lee $03 de la posición de memoria $0301. Este $03 es interpretado como la mitad de mayor peso de una dirección base.
[3] La CPU lee $77 de la posición de memoria $0302. Este $77 es interpretado como la mitad de menor peso de una dirección base.
[4] La CPU arma la dirección completa sumando la dirección base de 16 bits antes leída ($0377) al contenido del registro índice de 8 bits (X).
[5] Esta dirección es colocada en el bus de direcciones y la CPU lee el valor del dato contenido en esa posición de memoria y lo carga en el acumulador.
La tabla 5-6 incluye una lista de todas las instrucciones del MC68HC05 que pueden usar el modo de direccionamiento indexado desplazamiento de 16 bits.
Tabla 5-6 – Instrucciones con Modo de Direccionamiento Indexado
(16 bits de Offset)