Vous êtes sur la page 1sur 8

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR REGISTROS

Los registros son posiciones especiales de almacenamiento, con 8 bits de capacidad. Un registro tiene la siguiente apariencia: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Un registro puede almacenar valores numricos de 0 a 255 (positivos sin signo) o entre 128 a 127 (con bit de signo en el bit 7), caracteres ASCII o simples conjuntos de bits sin relaciones entre ellos. Existen 32 registros en los microprocesadores AVR, etiquetados originalmente como R0, R1,..., R31, pero que pueden ser renombrados usando la directiva .def .def registroTemporal=r16 Las directivas son tiles para el ensamblador pero en realidad no generan instrucciones ejecutables. En vez de emplear el nombre r16 se puede acceder con el nombre definido en la directiva. As la instruccin ldi registroTemporal, 150 carga en el r16 de manera inmediata el nmero 150. Otra instruccin interesante es el de copiar datos desde un registro a otro: la instruccin mov. El siguiente cdigo copia el contenido del r16 al registro r20. mov r20,r16 Obsrvese que el primer registro es siempre el registro destino de la operacin. Existen diferentes tipos de registros. As una instruccin del tipo ldi r15, 15 no sera vlida, ya que los nicos registros que permiten cargar un valor de forma inmediato son los registros del r16 al r31. Es decir, no se puede realizar este tipo de operacin con los registros del r0 al r15. Existe una excepcin a esta regla, el comando referido a limpiar los bits (poner todos los bits a 0) clr r15 es vlido para todos los registros. Aparte del comando ldi, las siguientes instrucciones no pueden emplearse con los registros r0 a r15: andi r15,4 ;Realiza el y lgico entre el registro y un nmero cbr r14,45 ;Limpia los bits en el registro determinados por una mscara de bits cpi r13,6 ;Compara el contenido del registro con una constante Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR ;Resta al registro el valor del contenido de la constante y del resultado ; actual del bit de carry sbr r12,89 ; Coloca a '1' los bits en el registro determinados por una mscara de ; bits ser r3 ;Coloca todos los bits del registro a 1 subi r15,9 ;Resta al registro el valor del contenido de la constante. sbci r9,7 REGISTROS PUNTERO

Un papel especial es desmpeado por las parejas de registros r16:r27, r28:r29 y r30:r31. Estas parejas de registros de 16 bits son nombrados de una forma especial, X, Y y Z. Pueden acceder a direcciones de 16 bits en la SRAM (X, Y, Z) o dentro de la memoria del programa (Z). La parte alta de la direccin se coloca en el registro de ndice ms alto, mientras que la parte baja de la direccin se almacena en el registro de ndice ms bajo. Estas partes alta y baja tienen sus propios nombres. As la parte alta del registro Z (r31) se puede acceder como ZH mientras que la baja (r30) se puede acceder como ZL. Ejemplo: .EQU direccion = RAMEND ;en este comentario indicaremos que RAMEND es ;la direccin ms alta en la SRAM ldi YH,high(direccion) ; carga la parte alta de la direccin ldi YL,low(direccion) ; carga la parte baja de la direccin El acceso a direcciones a travs de estos registros punteros es muy sencillo. Los siguientes ejemplos ilustran estos accesos de lectura (ld) y de escritura (st) con el puntero X ld r1,X ; Lee de la direccin X, sin cambiar el fichero st X+,r1 ;Escribe en la direccin X, e incrementa el puntero a la siguiente direccin ld r1,-X ;Decrementa el puntero a la anterior direccin y lee de la direccin X Para insertar los valores en la memoria de programa se emplean las directivas .DB y .DW. Por ejemplo: .DB 123,56,34,1 ; una lista de 4 bytes .DB Esto es un texto ; una lista de bytes, cadena de caracteres. .DW 13454 ; una palabra En las definiciones es recomensable usar un nmero par de bytes ya que el ensamblador aadir un 0 al final, lo cual puede no ser deseado. En vez de constantes se pueden definir etiquetas (destino de saltos) del siguiente modo, siempre en la primera columna: Etiqueta1: ; aqu iran unos comandos Tabla: Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR .DW 134,12312 PUERTOS

Los puertos son puertas entre la unidad de procesamiento central hasta hardware o software externo. La CPU se comunica con estos componentes, los lee y/o los escribe. Los puertos tienen direcciones fijas, independientemente del microprocesador AVR. As, por ejemplo el puerto B se encuentra siempre en la direccin 0x18 (notacin hexadecimal). Por supuesto el programador no tiene necesidad de recordar todas estas direcciones. Los nombres vienen definidos en un fichero de encabezado para los diferentes tipos de microcontrolador y que son proporcionados por el fabricante. Estos ficheros include tienen una lnea para definir la direccin del puerto B como sigue: .EQU PORTB, 0x18 por lo que solamente se debe recordar el nombre del puerto y no su direccin. El fichero correspondiente se incluye mediante la siguiente directiva .include 8515def.inc Los puertos generalmente se organizan en conjunto de 8 bits relacionados entre s, pero pueden estar organizados en conjuntos sin relacin. En este caso es habitual que cada uno de los bits tenga su propio nombre y funcin determinados. Como ejemplo, el registro MCUCR consiste en un nmero de bits de control del integrado, cada uno de ellos con sus nombres (por ejemplo ISC00, ISC01). La forma de enviar un valor determinado a uno de estos puertos es mediante la instruccin out y mediante el empleo de un registro intermedio: ldi r16, 0b00010000 ; ejemplo de configuracin binaria out MCUCR, r16 El caso contrario, el de lectura, se realiza mediante el comando in in r16, MCUCR En este caso debemos aclarar que existen algunos puertos que tienen bits que no son usados o estn reservados. En este caso se devuelve un bit a 0. Es frecuente que se desee poner a 0 1 un bit concreto de un puerto. Una opcin para ello consistira en leer el registro correspondiente, emplear las operaciones lgicas para alterar el bit seleccionado y reenviar el byte al puerto. Sin embargo, esto se puede llevar a cabo mediante las instrucciones sbi (poner el bit a 1) y cbi (poner el bit a 0). Como ejemplos: .EQU bitCambiado = 5 sbi PortB, bitCambiado cbi PortB, bitCambiado

Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR

Las dos instrucciones tienen una limitacin, solamente afectan a puertos con una direccin inferior a 0x20 PUERTOS RELEVANTES EN AVR Componente Acumulador Pila SRAM externa, interrupcin externa Interupcin externa Interrupcin timer Nombre del puerto SREG SPL/SPH MCUCR Registro-Puerto Registro de estado Puntero de pila Registro de Control General MCU Registro de mscara de interrupcin Registro de flags de interrupcin Registro de mscara de interrupcin del timer Registro de flags de interrupcin del timer Registro de control del contador 0 Contador 0 Registro A de control del timer Registro B de control del timer Contador 1 Registro de comparacin A Registro de comparacin B Registro de captura de entrada Registro de direcciones EEPROM Registro de datos EEPROM Registro de control EEPROM Registro de datos UART Registro de estado UART Registro de control UART Registro de baudios Registro de control y estado del comparador analgico Registro de salida del puerto Registro de direccin del puerto Registro de entrada del puerto

GIMSK GIFR del TIMSK TIFR

Timer 0 Timer 1

EEPROM

UART

Comparador analgico Puertos de entrada y PORTx salida DDRx PINx

TCCR0 TCNT0 TCCR1A TCCR1B TCNT1 OCR1A OCR1B ICR1L/H EEAR EEDR EECR UDR USR UCR UBRR ACSR

RAM ESTTICA, SRAM La SRAM es una memoria que no es accesible directamente por la CPU (ALU) como es el caso de los registros. Para acceder a esta parte de la memoria se deben emplear los registros como paso intermedio. Por lo tanto las operaciones que involucran a la SRAM son ms lentas que la de los registros. A partir del modelo AT90S8515 se permite conectar una RAM externa adicional. Uno de los casos de empleo ms importante de la SRAM es como pila. El acceso a la SRAM se lleva a cabo mediante las instrucciones STS y LDS. Ejemplos STS 0x0060, R1 ; el contenido del registro R1 se copia en la direccin 0x0060 Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR LDS R1, 0x0060 ; el contenido de la direccin 0x0060 se copia en el registro R1 Se suelen emplear nombres simblicos para evitar emplear direcciones fijas. .EQU direccionMemoria = 0x0060 STS direccionMemoria, R1 SRAM como pila

El uso ms comn de la SRAM es como pila. La pila es como una torre de bloques. Cada bloque que se aade se coloca en el tope de la pila, cada vez que se extrae un dato de la pila tambin se saca del tope de pila. Esta estructura es llamada LIFO (last in, first out, el ltimo en entrar, el primero en salir). Para emplear la SRAM como pila se necesita definir el puntero de pila. El puntero de pila es de 16 bits, accesible como un puerto. SPH es la parte ms significativa y SPL la parte menos significativa. Para construir la pila, el puntero se carga con el valor de la direccin ms alta de la SRAM (la pila crece hacia las direcciones ms bajas). ldi out ldi out r16, SPH, r16, SPL, HIGH(RAMEND) r16 LOW(RAMEND) r16

El empleo de la pila es sencillo. Los contenidos de los registros pueden volcarse en la pila de la siguiente forma push r16 De modo anlogo para extraer elementos de la pila, pop r16 Un caso especial de uso de las pilas es el de la llamada a las subrutinas. Al llamar a la subrutina el programa almacena en la pila la direccin de la prxima instruccin a ejecutar rcall rutina ;saltar a la subrutina ... rutina: ; aqu las instrucciones de la subrutina ret ; instruccin de retorno de la subrutina DIRECTIVAS .CODE Para indicar el comienzo de un cdigo de un programa. .DSEG La seccin de la SRAM en el integrado (datos) Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR

.ESEG La seccin EEPROM .ORG Para indicar que el segmento de cdigo o datos comienza en una direccin distinta de la de por defecto. SALTOS La ejecucin de un programa es lineal. Sin embargo, las instrucciones de bifurcacin (branches) y los saltos incondicionales alteran esta ejecucin lineal. Supngase que se desea implementar un contador de 32 bits empleando los registros r1 a r4. El bit ms significativo en r1 se incrementa en 1 (operacin inc). Si el registro se desborda, el registro tendr el valor de 0 (255+1=0), y se tendr que sumar 1 al r2. En caso de desborsamiento de r2, se incrementa r3 y as sucesivamente. Para ello se emplea la instruccin brne. inc r1 brne sigue inc r2 brne sigue inc r3 brne sigue inc r1 sigue: Como ejemplo de instrucciones de salto condicional: brge ; mayor o igual (con bit de signo) brlt ; menor que (con bit de signo) MACROS Una macro permite la utilizacin repetida de secuencias de instrucciones. Por ejemplo: .MACRO Delay nop nop nop nop .ENDMACRO ; instrucciones Delay ; ms instrucciones Una macro no ahorra espacio de memoria puesto que al compilar la etiqueta de la macro es reemplazada por el conjunto de instrucciones correspondientes. Para el caso de querer ahorrar espacio se emplean las subrutinas. Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR

SALTOS INCONDICIONALES Aparte del rcall para llamar a las subrutinas, existe otra clase de salto incondicional, el rjmp: saltar directamente a la direccin deseada. Aqu, a diferencia no va a haber un retorno (ret) a la siguiente instruccin. Existen unas instrucciones que permiten saltarse (skip) la siguiente instruccin a ejecutar, por ejemplo sbrc r1,7 ;saltarse la siguiente direccin si el bit 7 del registro est a baja rcall siBitDistinto7 ;ejecutada solamente si el bit 7 est a 0 rcall otro ;ejecutada de todas maneras Anlogamente se encuentra la instruccin sbic para los puertos de entrada/salida sbic PINB,0 ; saltarse la siguiente instruccin si el bit 0 del puerto b est a baja Otro tipo de instruccin de skip es la de comparacin de registros cpse r1,r2 ;saltarse la siguiente instruccin si los contenidos de r1 y r2 son ;iguales INTERRUPCIONES Con frecuencia se debe reaccionar ante condiciones hardware u otros eventos, por ejemplo en el cambio de valor de un pin de un puerto (por ejemplo detectar que un usuario ha pulsado una tecla). Un modo de procesarlo podra consistir en hacer un bucle que leyese contnuamente el valor de esa lnea. Desgraciadamente, un programa debe hacer en general ms cosas que estar leyendo en un bucle un puerto y no puede permitirse el lujo de ese bucle. Adems en caso de deteccin de pulsos muy pequeos, el mtodo del bucle es intil. Es ms adecuado emplear interrupciones. Las interrupciones se disparan por alguna condicin, que debe ser habilitada primero, ya que todas las interrupciones hardware se encuentran deshabilitadas por defecto. El microprocesador posee un bit en su registro de estado para permitir que se procesen las interrupciones. Para activar/desactivar este bit se emplean las instrucciones sei y cli. Si la condicin de la interrupcin se produce, el procesador coloca en la pila, la direccin de la siguiente instruccin a ejecutar. De este modo, la ejecucin del programa puede continuar despus de procesar la interrupcin. Despus procesa la instruccin correspondiente en su vector de interrupcin, que generalmente es un salto incondicional a la subrutina de procesamiento de interrupcin. El vector de interrupcin es una posicin dependiente del procesador. Existe un orden de prioridad en las interrupciones, de modo que si dos o ms interrupciones habilitadas se producen simultneamente solamente ser procesada la de mayor prioridad. Las dems simplemente esperarn a que se haya procesado la de mayor prioridad. La rutina de procesamiento puede terminar con la instruccin Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna

Gua rpida del ensamblador de los microprocesadores ATMEL-AVR

RETI BIBLIOGRAFIA Gerhard Schmidt, Beginners Introduction to the Assembly Language of ATMEL-AVRMicroprocessors, http://www.avr-asm-tutorial.net. Diciembre de 2003.

Evelio J. Gonzlez Gonzlez, Grupo de Computadores y Control. Universidad de la Laguna