Universidad Autónoma de Baja California Facultad de Ingeniería Mexicali El procesador HCS08 M.C. Jorge Eduardo Ibarra Esquer Semestre 2011-1 Características del procesador • Todos los microcontroladores de la familia HCS08 utilizan al CPU HCS08, junto con elementos de memoria y diversos periféricos. • Ofrece alta velocidad y bajo consumo de energía. Características del procesador • Frecuencia del CPU máxima de 40MHz • Espacio de memoria de 64KB • 16 modos de direccionamiento • Transferencia de datos de memoria a memoria • Compatibilidad de código con la familia M68HC05 • Instrucciones para operaciones BCD • Operación de multiplicación de 8x8 bits y división de 16/8 Modelo de programación El acumulador A • Registro de propósito general de 8 bits • El CPU lo usa para colocar operandos y resultados de operaciones Registro índice H:X • Permite direccionar el espacio de memoria de 64KB • Se utiliza en los modos de direccionamiento indexado Apuntador de la pila • Contiene la dirección de la siguiente posición en la pila • La dirección se decrementa con las operaciones push y se incrementa con las operaciones pull Contador de programa • Contiene la dirección de la siguiente instrucción u operando que se leerá Registro de código de condiciones • Contiene la máscara de interrupción y algunas banderas que indican el estado de la operación anterior Mapa de memoria Mapa de memoria Programación del microcontrolador Sintaxis de ensamblador Un programa fuente en ensamblador consiste en una secuencia de sentencias. Cada sentencia se codifica en una línea de texto y puede ser: – Un comentario – Una línea de código Comentarios Un comentario puede ocupar una línea completa con el propósito de explicar el funcionamiento de un bloque de código Un comentario se indica con un punto y coma, después del cual sigue el texto del comentario ; Esta línea es un comentario Código Cada línea de código incluye uno o más de los siguientes campos: – Una etiqueta – Un campo de operación – Uno o más operandos – Un comentario Etiquetas La etiqueta es el primer campo en una línea de código. Una etiqueta es un símbolo seguido por dos puntos ‘:’. Las etiquetas están formadas por: – Letras – Números – Puntos – Guión de subrayado Las etiquetas no pueden empezar con un número. Etiquetas Por lo general, el ensamblador considera que cualquier identificador que inicie a partir de la primer columna de una línea, es una etiqueta, incluso aunque no esté terminado con dos puntos. Etiquetas Las etiquetas son obligatorias en las directivas de ensamblador que definen el valor de un símbolo (SET o EQU). En estos casos, la etiqueta toma el valor correspondiente a la expresión en el campo del operando. Etiquetas A las etiquetas que se especifiquen en cualquier otra directiva, instrucción o comentario, se le asigna el valor de la localidad de memoria en la que se definan. Campo de operación Este campo es el que sigue después de la etiqueta y se separa de ella con un espacio en blanco El campo de operación no debe empezar en la primer columna El campo de operación contiene alguno de los siguientes elementos: – Una instrucción – Una directiva – El nombre de una macro Campo de operación • Instrucción – Las instrucciones están definidas en el manual de referencia del CPU HCS08. • Directivas – Son indicadores para el ensamblador que permiten definir secciones, constantes, etc. • Macros – Al incluir el nombre de una macro, el código que éste representa se incluye en esa parte del programa. Campo del operando Cuando se incluye el operando, este sigue al campo de la operación, separado por un espacio en blanco. Si hay dos o más operandos, éstos se separan con comas. Para que el ensamblador, y en su momento el procesador, identifiquen de dónde se tomarán los datos, se utilizan diferentes modos de direccionamiento. Modos de direccionamiento El CPU HCS08 incluye 16 modos de direccionamiento: • Inherente • Inmediato • Directo • Extendido • Indexado • sin offset • offset de 8 bits • offset de 16 bits • Relativo • Apuntador de la pila • offset de 8 bits • offset de 16 bits • Memoria a memoria • Inmediato a directo • Directo a directo • Indexado a directo con post incremento • Directo a indexado con post incremento • Indexado • con post incremento • offset de 8 bits con post incremento Direccionamiento inherente • Las instrucciones que utilizan este direccionamientos no tienen que buscar un operando sobre el cual actuar. • Algunas de estas instrucciones actúan sobre los datos que se encuentran en los registros. – DIV – CLRA – PSHX ¨ CLI ¨ MUL ¨ LSLA ¨ NEGA ¨ NOP ¨ TAX Direccionamiento inmediato • El operando en instrucciones con direccionamiento inmediato se encuentra en los bytes que siguen al código de operación. • Estos bytes son el valor del operando que utilizará la instrucción. • Para indicar que se utilizará direccionamiento inmediato, se utiliza el símbolo # • El operando está limitado a uno o dos bytes, dependiendo del registro involucrado. Direccionamiento inmediato • Algunos ejemplos de uso de este direccionamiento son: – CPHX #$FFFF – LDA #100 – LDHX #etiqueta – SUB #$A0 • Otras instrucciones que lo utilizan: – ADC, ADD, AND, CPX, EOR, ORA, SBC Direccionamiento directo • La mayoría de las instrucciones que lo utilizan pueden acceder a los primeros 256 bytes de la memoria con solo 2 bytes: – 1 byte para el código de operación – 1 byte para la parte baja de la dirección efectiva • El byte más significativo de la dirección efectiva se toma siempre como $00 Direccionamiento directo • El uso de este modo de direccionamiento está limitado a operandos en la página directa o página 0 (direcciones $0000 a $00FF) • En la página 0 se encuentra parte de la memoria RAM del microcontrolador ($0040 a $023F), así como la mayoría de los registros de E/S ($0000 a $003F) Direccionamiento directo • Algunos ejemplos de uso de este modo de direccionamiento son: – STA $03 ;A à Puerto D – LDX $00 ;Puerto A à X – CPX $E0 ;Compara X con el contenido de $00E0 Direccionamiento extendido • Utilizando este modo de direccionamiento, las instrucciones pueden acceder a cualquier dirección en un mapa de memoria de 64Kbytes • Todas las instrucciones extendidas utilizan 3 bytes: – 1 byte para el código de operación – Los otros dos son el MSB y LSB de la dirección del operando Direccionamiento extendido • Se utiliza cuando es necesario utilizar memoria por encima de la página 0 • Algunos ejemplos de uso de este modo de direccionamiento son: – ADC $5006 – AND $0100 – LDX $FE04 Direccionamiento indexado, sin offset • Este modo se utiliza para tener acceso a datos con direcciones variables. X contiene la parte baja de la dirección, mientras que H contiene la parte alta • Estas instrucciones pueden mover un apuntador a través de una tabla o almacenar la dirección de una localidad de RAM o E/S que se utilice frecuentemente Direccionamiento indexado, sin offset • Algunos ejemplos de uso de este modo de direccionamiento son: – JMP ,X – STA ,X – ADC ,X – NEG ,X Direccionamiento indexado, con offset de 8 bits • En estas instrucciones, el CPU suma los bytes sin signo en H:X al byte sin signo que sigue al código de operación. La suma es la dirección efectiva del operando • Estas instrucciones son útiles para seleccionar el k-ésimo elemento en una tabla de n elementos Direccionamiento indexado, con offset de 8 bits • Algunos ejemplos de uso de este modo de direccionamiento son: – JMP $FF,X – STA 18,X – LDA 7,X – NEG $10,X Direccionamiento indexado, con offset de 16 bits • En estas instrucciones, el CPU suma los bytes sin signo en H:X a la palabra sin signo formada por los dos bytes que siguen al código de operación. La suma es la dirección efectiva del operando • Estas instrucciones son útiles para seleccionar el k-ésimo elemento en una tabla de n elementos Direccionamiento indexado, con offset de 16 bits • Algunos ejemplos de uso de este modo de direccionamiento son: – JMP $20FF,X – STA $A018,X – LDA $FF00,X – JSR $1000,X Direccionamiento con el apuntador de la pila, con offset de 8 y 16 bits • Estos modos de direccionamiento son similares a los indexados con offset, sólo que utilizan el apuntador de la pila en lugar del registro índice • Estas instrucciones son útiles para acceder de una manera sencilla a los datos en la pila Direccionamiento con el apuntador de la pila, con offset de 8 y 16 bits • Algunos ejemplos de uso de estos modos de direccionamiento son: – STA $10,SP – TST $25,SP – LDA $FF00,SP – STX $0500,SP Direccionamientos de memoria a memoria • El CPU HCS08 incorpora la capacidad de realizar transferencia de datos directa entre localidades de memoria. • Se utiliza la instrucción MOV. • Se cuenta con cuatro modos de direccionamiento de memoria a memoria. Memoria a memoria: Inmediato a Directo • Generalmente se utiliza para inicializar variables y registros en la página directa • El operando en el byte que sigue al código de operación se almacena en la localidad de la página directa indicada por el segundo byte • La instrucción MOV asociada a este modo no altera el contenido del acumulador Memoria a memoria: Inmediato a Directo "PSHA" " ; Respalda el valor de A "LDA "#$27 " ; A=$27 "STA "$A0" ; Se almacena #$27 en $00A0 "PULA" " ; Se restaura el valor de A El código anterior se puede cambiar por el siguiente: "MOV"#$27,$A0 Memoria a memoria: Directo a Directo • Generalmente se utiliza para intercambiar datos entre registros en la página directa. • El operando en la localidad de la página directa indicada por el byte que sigue al código de operación se almacena en la localidad de la página directa indicada por el segundo byte. • La instrucción MOV asociada a este modo no altera el contenido del acumulador. Memoria a memoria: Directo a Directo "PSHA" " ; Respalda el valor de A "LDA "$04 " ; A=Contenido de la dir. $0004 "STA "$05 " ; $0005=$0004 "PULA" " ; Se restaura el valor de A El código anterior se puede cambiar por el siguiente: "MOV"$04,$05 Memoria a memoria: Indexado a Directo con Post Incremento • Generalmente se utiliza para transferir tablas direccionadas por el registro índice a un registro en la página directa. • El operando direccionado por H:X se almacena en la localidad de la página directa indicada por el byte que le sigue al código de operación. H:X se incrementa al terminar. • La instrucción MOV asociada a este modo no altera el contenido del acumulador. Memoria a memoria: Indexado a Directo con Post Incremento Si quisiéramos escribir el contenido de la dirección a la que apunta H:X en el puerto B, se haría lo siguiente: " " "MOV "X+,$01 Una vez que se ha movido el dato, H:X incrementa su valor en 1, apuntando así a la siguiente dirección. " Memoria a memoria: Directo a Indexado con Post Incremento • Generalmente se utiliza para llenar tablas desde registros en la página directa. • El operando en la localidad de la página directa indicada por el byte que le sigue al código de operación, se almacena en la localidad direccionada por H:X. H:X se incrementa al terminar. • La instrucción MOV asociada a este modo no altera el contenido del acumulador. Memoria a memoria: Directo a Indexado con Post Incremento Si quisiéramos escribir el contenido del puerto D en la dirección a la que apunta H:X, se haría lo siguiente: " " "MOV "$03,X+ Una vez que se ha movido el dato, H:X incrementa su valor en 1, apuntando así a la siguiente dirección. " Direccionamiento relativo • Todas las instrucciones de salto condicional utilizan el direccionamiento relativo para calcular la dirección efectiva resultante. • Si la condición es verdadera, la dirección efectiva se carga en el PC. Si es falsa, avanza a la siguiente instrucción. Direccionamiento relativo • El desplazamiento es un byte en complemento a 2 que permite un rango de salto de -128 a 127 bytes desde la dirección que sigue a la del salto. Inicio: LDA #1 CMP #-2 BLT Inicio ; Salta si A es < -2 Fin: BRA Fin Direccionamiento relativo "Inicio: "LDA #1 ""CMP #-2 ""BLT "Inicio "; Salta si A es < -2 "Fin: "BRA"Fin Direccionamiento indexado con post incremento, sin offset y con offset de 8 bits • Este modo de direccionamiento es útil para búsquedas en tablas. • Una vez direccionado el operando, H:X se incrementa. • Sólo se utiliza con la instrucción CBEQ (Compare and Branch if Equal) Direccionamientos indexados con post incremento " "LDA STA MOV CLRX ciclo: CBEQ BRA iguales: CLRX ciclo2: CBEQ BRA iguales2: BRA #$FF $10 $10,$60 X+,Iguales Ciclo ; Sin offset $50,X,Iguales Ciclo2 Iguales2 ; Offset de 8 bits Directivas Declaración de secciones • Secciones absolutas: Directiva ORG – Permite definir secciones de datos, de constantes y de código Var1: Var2: ORG DS.B DS.B $50 1 1 ;Esta es una sección de datos ;Igual a RMB Cnst1: Cnst2: ORG DC.B DC.B $B000 $35 $A8 ;Sección de constantes ;Igual a FCB ORG CLI CLRA … $B100 ;Sección de código Inicio: La directiva EQU • Esta directiva asigna el valor de la expresión en el campo del operando a la etiqueta indicada: PTOA: EQU $0000 RAM: EQU $0040 DDRA: EQU $0004 EEPROM: EQU $B000 Tarea • Investigar las directivas que se pueden utilizar para programar el procesador HCS08. Un programa de ejemplo $include ‘M9S08LC60.inc’ ; Incluir las etiquetas definidas en este archivo RAM ROM VECT inicio: fin: EQU EQU EQU $0040 $B000 $FFDC ; Inicio del segmento de RAM ; Inicio del segmento de EEPROM ; Inicio del vector de interrupciones ORG LDA ADD STA BRA ROM #$18 #$A0 RAM fin ; Sección de EEPROM ORG DC.W VECT+$22 inicio ; Vector del Reset