ARQUITECTURA, CARACTERISTICAS, MODOS DE DIRECCIONAMIENTO Y LENGUAJES USADOS.
La familia 68HC11 (abreviado HC11 o 6811) es una familia de microcontroladores de Motorola (ahora Freescale), derivada del microprocesador Motorola 6800. Los microcontroladores 68HC11 son más potentes y costosos que los de la familia 68HC05 y se utilizan en múltiples dispositivos empotrados.
Siguen la Arquitectura de von Neumann, en la que la memoria de programa, de datos y de entrada/salida se direcciona en un único mapa de memoria. Tienen cinco puertos externos (A, B, C, D y E), cada uno de ocho bits excepto el D, que es generalmente de seis bits.
El puerto A se emplea en captura de eventos, salida comparada, acumulador de pulsos y otras funciones de reloj; el puerto D para E/S serie y el puerto E como conversor analógico-digital. La familia 68HC11 puede funcionar tanto con memoria interna o externa. En caso de emplear memoria externa, los puertos B y C funcionan como bus de datos y direcciones respectivamente.
Motorola describe al 68hc11 como un microcontrolador de 8−bits fabricado con tecnología HCMOS, con una frecuencia de bus de 2 Mhz y con una amplia lista de recursos internos. Es capaz de ejecutar todas las instrucciones del M6800 y M6801 y 91 más que se le han incorporado.
El MC68HC11 (MCU), dispone de 98 funciones de entrada y/o salida, las cuales se ven representadas por 52 pines en el caso de un encapsulado del tipo PLCC, o bien 48 para el del tipo DIP. Los diferentes encapsulados se muestran en la figura 3. Además, dependiendo del modelo MCU, se cuenta con diferentes tipos y tamaños de memorias (ROM, RAM, EPROM, EEPROM).
Arquitectura
Su bus de direcciones es de 16 líneas, por lo tanto puede direccionar hasta 64 KB (aunque algunos de sus miembros pueden direccionar más de un megabyte), y aunque el bus de datos es de 8, trabaja fácilmente con datos de 16 bits. Todas las versiones del 68HC11 pueden presentar sus buses al exterior para trabajar con memoria externa. El 68HC11 posee dos registros acumuladores de 8 bits, el A y el B; ambos juntos constituyen además un acumulador D de 16 bits (A y B pueden utilizarse libremente como dos registros independientes o como uno único D). También dispone de dos registros índice de 16 bits, el X y el Y, un registro contador de programa PC y un puntero de pila, SP, también de 16 bits. El registro de estado, denominado CCR (condition code register), incluye 8 señalizadores o flags: C (acarreo), V (desbordamiento), Z (resultado cero), N (resultado negativo), H (acarreo a la mitad), I (máscara de las interrupciones IRQ), X (máscara de las interrupciones XRQ) y S (máscara de la instrucción STOP). Su juego de instrucciones posee más de 300 códigos ocupando cada instrucción entre 1 y 4 bytes.
El microcontrolador dispone de un estado de reposo o bajo consumo, para ahorrar consumo en dispositivos alimentados por baterías en los intervalos de inactividad del dispositivo. Se trata de un modo de funcionamiento del microcontrolador en el que el consumo es mínimo y que se mantiene hasta que se produce una interrupción externa. Normalmente se pasa a este modo mediante una instrucción. El 68HC11 dispone de dos instrucciones (WAIT y STOP) que ponen al microcontrolador en modo de bajo consumo. Se sale de este estado cuando se produce una interrupción o si estas están deshabilitadas cuando se resetea.
Este microcontrolador pertenece a la familia HC08 de Motorola, cuyas principales características son:
Modelo de programación HC05 mejorado.
Control de bucles optimizado
16 modos de direccionamiento
Registro de indice y puntero de pila de 16-bits
Transferencia de datos de memoria a memoria
Rápidas instrucciones de multiplicación de 8x8
Rápidas instrucciones de división de 16/8
Instrucciones BCD (Binario codificado en decimal)
Optimización para aplicaciones de control
Soporte eficiente del lenguaje C
Las características principales del microcontrolador 68hc11 son:
Arquitectura de alto rendimiento M68HC08 optimizada para compiladores C
Compatible con la familia 68HC05
Frecuencia interna del bus de 8-MHz
Código de seguridad para la lectura y programación de la memoria FLASH
Firmware On-chip para la programación desde PC
Programable en el circuito
Sistemas de protección:
"Watch Dog" opcional ( Computer Operating Properly (COP) reset)
Detección de baja tensión con reset opcional
Detección de código ilegal con reset
Detección de direccionamiento ilegal con reset
Diseño de bajo consumo, completamente estático y varios modos de operación
32 Kbytes de memoria FLASH programable en circuito
512 bytes de memoria RAM
Módulo de interfaz serie asíncrono (SPI)
Módulo de interfaz serie síncrono (SCI)
Dos temporizadores de 2 canales de 16 bits (TIM1 y TIM2) con captura de entrada seleccionable, comparadores y capacidad de PWM en cada canal
8 canales para conversión AD por aproximaciones sucesivas de 8 bits
Módulo generador de reloj con PLL "on-chip"C
Hasta 33 pines de entradas/salidas de propósito general
Pullups seleccionables en los puertos A, C, y D. La selección puede ser de forma individual, por bit.
Corriente de entrada/salida de hasta 10mA en todos os puertos
Puerto de 8-bits para menejo de teclado
Encapsulados plástico 40 pines DIP, 42 pines SDIP o 44 pines QFP (quad flat pack)
Clasificación de los pines del microcontrolador en grupos de acuerdo a las funciones
1. Alimentación: VDD, VSS.
2. Reloj: EXTAL, XTAL, E.
3. Reset: RESET.
4. Transmisión serie asíncrona: TxD, RxD.
5. Petición de interrupciones hardware: IRQ, XIRQ, IC1−3, PAI, STRA.
6. Modos de arranque: MODA, MODB.
7. Comparadores: OC1−5.
8. Capturadores: IC1−3, PAI.
9. Transmisión serie síncrona: SCK, MISO, MOSI, SS.
10. Puertos: PA0−7, PB0−7, PC0−7, PD0−3, PE0−3.
11. Conversores: AN0−7. 12. Buses: AD0−7, A8−15, AS, R/W.
MODOS DE DIRECCIONAMIENTO.
Existen 6 modos de direccionamiento distintos. Los modos de direccionamientos son distintas formas que tiene la CPU de acceder a los datos que están en memoria.
Direccionamiento inmediato
El dato al que se hace referencia se encuentra "dentro" de la instrucción, no es necesario acceder a memoria. El dato puede ser de 1 ó 2 bytes. Este modo de direccionamiento se indica mediante el signo #.
Ejemplo: LDAA #08 Esta instrucción carga el valor decimal 8 en el acumulador A. El valor 08 se encuentra a continuación del código de instrucción de LDAA. La instrucción LDAA tiene el código $86, por tanto, en memoria esta instrucción queda representada mediante los valores: (Se supone que esta instrucción comienza en la dirección $0000).
Direccionamiento extendido
El dato se encuentra en la dirección de memoria especificada. El dato puede estar en cualquier posición de la memoria dentro del límite de las 64Kb, por lo que la dirección ocupa 2 bytes.
Ejemplo: LDAA $FC00 Esta instrucción carga en el acumulador el contenido de la dirección $FC00. La dirección del dato se almacena después del código de la instrucción y ocupa 2 bytes. Las instrucciones con este modo de direccionamiento ocupan 3 bytes (1 byte para el código de la instrucción y 2 bytes para la dirección).
Direccionamiento directo
Este modo de direccionamiento es exactamente igual que el anterior con la salvedad de que sólo actúa con direcciones comprendidas entre $00−$FF (256 primeros bytes de la memoria). La utilidad de este modo es que sólo necesita 1 byte para especificar la dirección del dato, con lo que se ahorra espacio y tiempo.
Ejemplo: (1) LDAB $FC00 (2) LDAB $05 Ambas instrucciones cargan en el acumulador B el contenido de la dirección especificada. En el caso de la instrucción 1, se utiliza direccionamiento extendido y la instrucción ocupa 3 bytes. En el caso de la instrucción 2, como la dirección es menor que $FF se utiliza direccionamiento directo y la instrucción ocupa 2 bytes.
Indexado
Este modo de direccionamiento se utiliza para acceder a TABLAS (Arrays, cadenas....) en la memoria. El dato se busca de la siguiente forma: Se toma la dirección del registro índice (X ó Y), se le suma un desplazamiento (offset) de 8 bits y el contenido de esa dirección es el dato buscado. Este modo de direccionamiento se especifica colocando como argumentos en la instrucción un offset, una coma y el registro índice.
Ejemplo: LDAB 5,X Esta instrucción carga en el acumulador B el contenido de la dirección especificada por X más un offset de 5. Se simboliza de la siguiente manera: dir = (X) + 5 , siendo dir la dirección que contiene el dato.
Para el caso particular de tener un offset de 0, es decir, que se quiera acceder a la dirección contenido en X, se puede especificar de las siguientes maneras: LDAB 0,X LDAB ,X LDAB X Las 3 instrucciones son equivalentes.
Este modo de direccionamiento es muy interesante porque permite acceder a cualquier dirección de memoria ($0000−$FFFF) como en el direccionamiento extendido pero las instrucciones sólo ocupan 2 bytes, como en el direccionamiento directo. Además, el registro X se puede variar (incrementar, decrementar...) con lo que se obtiene una gran flexibilidad a la hora de acceder a tablas de datos.
Direccionamiento relativo
Este modo de direccionamiento sólo se utiliza con las instrucciones de bifurcación. Estas indican a la CPU que realice un salto de tantos bytes hacia adelante o hacia atrás. El desplazamiento tiene signo y es de un byte por lo que las bifurcaciones sólo se pueden hacer de 128 bytes hacia atrás ó 127 bytes hacia adelante:
Ejemplo:
Bucle ....
....
BNE bucle
El programador no necesita calcular el salto a efectuar, lo realiza automáticamente el ensamblador. Sin embargo, es importante saber que los saltos con instrucciones BR sólo se pueden realizar hacia posiciones de memoria que estén a menos de 128 bytes por debajo y a menos de 127 bytes por arriba. Si se sobrepasa el límite el ensamblador dará un mensaje de error.
Direccionamiento inherente
Los operandos se encuentran en registros de la CPU. Por el código de la instrucción la CPU sabe de qué registros se trata.
Ejemplo: CÓDIGO MNEMÓNICO $1B ABA ; A:=A+B $5C INCB ; B:=B+1 $08 INX ; X:=X+1
La primera instrucción, de código $1B, suma el contenido del acumulador A y B y el resultado lo introduce en el acumulador A. La segunda incrementa el acumulador B y la tercera el registro de índice X. Estas instrucciones sólo ocupan un byte y por ello conviene abusar de ellas.
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.
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.
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.
Modo de Direccionamiento Relativo
El modo de direccionamiento relativo es usado solamente por las instrucciones de bifurcación (saltos condicionados). Las instrucciones de bifurcación, salvo las bifurcaciones en su versión de manipulación de bits generan dos bytes de código de máquina: uno para el código de operación y otro para el desplazamiento relativo. Ya que es deseable bifurcar en cualquier sentido, el byte de desplazamiento es un número signado según el convenio de complemento a dos con un rango que va desde -128 hasta +127 bytes (respecto a la dirección de la instrucción inmediata posterior a la instrucción de bifurcación). Si la condición de salto es verdad, el contenido de los 8 bits del byte con signo siguiente al código de operación (desplazamiento) es sumado al contenido del contador de programa para formar la dirección de bifurcación efectiva; de otro modo, el control continúa bajo la instrucción inmediata posterior a la instrucción de bifurcación. Un programador especifica el destino de una bifurcación como una dirección absoluta (o rótulo que hace referencia a una dirección absoluta). El ensamblador calcula el desplazamiento relativo de 8 bits con signo, que es colocado en memoria luego del código de operación de la bifurcación.
Ejemplos en ensamblador
En este programa, hay que configurar el SPI como se maneja una no-interrupción por el master. Transmitir un byte de datos que contienen el valor $55. El registro de desplazamiento se debe seleccionar con la línea PB3 del puerto usando un bajo voltaje seleccionado. Hay que asegurarse que la línea BP3 permanece en estado alto entre las transferencias.
Este ejemplo es una rutina que maneja una interrupción asíncrona del puerto de transmisión serie del SCI que tiene un ‘buffer’ circular. La rutina utiliza el indicador de interrupción de transmisión vacía del SCI. En el Módulo del SCI se puede ver en detalle. Se puede examinar el código que la CPU necesita, para realizar la rutina de servicio de interrupción. La rutina muestra el modo de direccionamiento de mover de indexado a directo y el modo de direccionamiento de memoria a memoria.
[11]