You are on page 1of 5

PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA

MACROS
Cuando se est programando muchas veces notamos que hay una serie de instrucciones que siempre van juntas para realizar un determinado proceso, y estas instrucciones las repetimos varias veces cuando programamos cambiando solamente algunos operandos. En estos casos, puede ser recomendable utilizar macros. Una macroinstruccin, o macro, ejecuta una serie de instrucciones que el programador slo la invoca una vez mediante una lnea de programa. El programa ensamblador al encontrarse con una macro, la reemplaza por todas las instrucciones por las que est formada para luego obtener el cdigo mquina. Por ejemplo, como el ATmega8 no tiene ninguna instruccin mediante la cual podamos almacenar constantes en un registro de entrada y salida, tenemos que utilizar un par de instrucciones, primero cargamos la constante en un registro de trabajo y luego almacenamos el contenido de este registro de trabajo en el registro de entrada y salida. Si queremos almacenar el dato $F8 en el registro DDRB tenemos que escribir: LDI R16, $F8 OUT DDRB, R16 Y este es un proceso que lo repetimos constantemente a lo largo de los programas. Podemos crear una macro que se llame Store Constant to I/O Location: STIO, que almacene directamente una constante en un registro de entrada y salida. Para crear una macro en el VMLAB tenemos que tener en cuenta los siguientes pasos: Se debe iniciar con la directiva .MACRO seguido del nombre que le asignamos a la macro. Cuando escribamos el cdigo de la macro considerar que al primer parmetro lo representaremos como @0, al segundo como @1, al tercero @2 y as sucesivamente. Se debe finalizar con la directiva .ENDMACRO

Ahora s, codifiquemos nuestra macro STIO .MACRO .ENDMACRO y para invocarla bastar escribir: STIO DDRB, $F8 STIO LDI OUT R16, @1 @0, R16

Como estamos modificando el registro R16, el programador puede no tener en cuenta esto y tener problemas, as que podemos aadir un par de lneas a nuestra macro para que se comporte como una caja negra. .MACRO STIO PUSH LDI OUT POP R16 R16, @1 @0, R16 R16

.ENDMACRO Estas lneas pueden ir en el mismo archivo donde esta el cdigo o en un archivo aparte.

IEE 256

SISTEMAS DIGITALES - LABORATORIO

SEMESTRE 2009-1

PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA

Mostramos un programa que maneja el puerto serial sin utilizar macros.


;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX XXXXX ;XXXXX PONTIFICIA UNIVERSIDAD CATLICA DEL PER XXXXX ;XXXXX Sistemas Digitales - Laboratorio XXXXX ;XXXXX XXXXX ;XXXXX Nombre: SerialMacroA.asm XXXXX ;XXXXX Autor: Ing. Rolando Snchez P. XXXXX ;XXXXX Fecha: Mayo 2009 XXXXX ;XXXXX XXXXX ;XXXXX Descripcin: Se espera la llegada de un dato por el puerto serial, se XXXXX ;XXXXX realiza un ECO si el dato recibido es el cdigo ASCII de una letra XXXXX ;XXXXX mayscula. NO SE UTILIZAN MACROS. XXXXX ;XXXXX Parmetros: 9600, N, 8, 1 XXXXX ;XXXXX XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .INCLUDE "C:\VMLAB\include\m8def.inc"

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX P R O G R A M A P R I N C I P A L XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .CSEG .ORG $000 RJMP INICIO INICIO: LDI OUT LDI OUT RCALL LAZO: RCALL CPI BRLO CPI BRSH RCALL RJMP R16, SPH, R16, SPL, HIGH(RAMEND) R16 LOW(RAMEND) R16 ; Inicializamos la pila

CONFIGURA_USART RX_BYTE R16, 'A' LAZO R16, 'Z'+1 LAZO TX_BYTE LAZO

; Configuramos el Puerto serial ; Esperamos la llegada de un dato ; Analizamos si es mayscula

; Si s lo es, hacemos un ECO

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: CONFIGURA_USART XXXXX ;XXXXX XXXXX ;XXXXX Configura el USART para fosc = 1MHz : XXXXX ;XXXXX Modo de operacin: Asncrono doble velocidad XXXXX ;XXXXX Velocidad: 9600bps XXXXX ;XXXXX Paridad: Sin Paridad XXXXX ;XXXXX Bits de Stop: 1 XXXXX ;XXXXX Bits de Datos: 8 XXXXX ;XXXXX XXXXX ;XXXXX Registros Modificados: R16, SREG XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CONFIGURA_USART: LDI OUT LDI OUT LDI OUT LDI OUT LDI OUT RET R16, HIGH($000C) UBRRH, R16 R16, LOW($000C) UBRRL, R16 R16, (1<<U2X) UCSRA, R16 R16, (1<<RXEN | 1<<TXEN | 0<<UCSZ2) UCSRB, R16 R16, (1<<URSEL | 0<<UMSEL | 0<<UPM1 | 0<<UPM0 | 0<<USBS | 1<<UCSZ1 | 1<<UCSZ0) UCSRC, R16

IEE 256

SISTEMAS DIGITALES - LABORATORIO

SEMESTRE 2009-1

PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: RX_BYTE XXXXX ;XXXXX XXXXX ;XXXXX Espera que se reciba un dato por el puerto serial, devuelve el dato recibido XXXXX ;XXXXX XXXXX ;XXXXX Parmetro de salida: R16 <- Dato recibido XXXXX ;XXXXX Registros Modificados: R16, SREG XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX RX_BYTE: SBIS RJMP IN RET UCSRA, RXC RX_BYTE R16, UDR

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: TX_BYTE XXXXX ;XXXXX XXXXX ;XXXXX Enva al USART un dato para ser transmitido por el puerto serial. XXXXX ;XXXXX XXXXX ;XXXXX Parmetro de entrada: R16 <- Dato a transmitir XXXXX ;XXXXX Registros Modificados: ninguno XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TX_BYTE: SBIS RJMP OUT RET UCSRA, UDRE TX_BYTE UDR, R16

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX F I N XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

IEE 256

SISTEMAS DIGITALES - LABORATORIO

SEMESTRE 2009-1

PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA

Ahora el mismo programa pero utilizando macros:


;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX XXXXX ;XXXXX PONTIFICIA UNIVERSIDAD CATLICA DEL PER XXXXX ;XXXXX Sistemas Digitales - Laboratorio XXXXX ;XXXXX XXXXX ;XXXXX Nombre: SerialMacroB.asm XXXXX ;XXXXX Autor: Ing. Rolando Snchez P. XXXXX ;XXXXX Fecha: Mayo 2009 XXXXX ;XXXXX XXXXX ;XXXXX Descripcin: Se espera la llegada de un dato por el puerto serial, se XXXXX ;XXXXX realiza un ECO si el dato recibido es el cdigo ASCII de una letra XXXXX XXXXX ;XXXXX mayscula. SE UTILIZAN LAS MACROS INIC_PILA, STIO y BRNR. ;XXXXX Parmetros: 9600, N, 8, 1 XXXXX ;XXXXX XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .INCLUDE .INCLUDE "C:\VMLAB\include\m8def.inc" "C:\VMLAB\include\MisMacros.inc"

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX P R O G R A M A P R I N C I P A L XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .CSEG .ORG $000 RJMP INICIO INICIO: INIC_PILA RCALL LAZO: RCALL BRNR RCALL RJMP CONFIGURA_USART RX_BYTE R16, 'A', 'Z', LAZO TX_BYTE LAZO ; Inicializamos la pila ; Configuramos el Puerto serial ; Esperamos la llegada de un dato ; Analizamos si es mayscula ; Si s lo es, hacemos un ECO

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: CONFIGURA_USART XXXXX ;XXXXX XXXXX ;XXXXX Configura el USART para fosc = 1MHz : XXXXX ;XXXXX Modo de operacin: Asncrono doble velocidad XXXXX ;XXXXX Velocidad: 9600bps XXXXX ;XXXXX Paridad: Sin Paridad XXXXX ;XXXXX Bits de Stop: 1 XXXXX ;XXXXX Bits de Datos: 8 XXXXX ;XXXXX XXXXX ;XXXXX Registros Modificados: R16, SREG XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CONFIGURA_USART: STIO STIO STIO STIO STIO RET ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: RX_BYTE XXXXX ;XXXXX XXXXX ;XXXXX Espera que se reciba un dato por el puerto serial, devuelve el dato recibido XXXXX ;XXXXX XXXXX ;XXXXX Parmetro de salida: R16 <- Dato recibido XXXXX ;XXXXX Registros Modificados: R16, SREG XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX RX_BYTE: SBIS RJMP IN RET UCSRA, RXC RX_BYTE R16, UDR UBRRH, UBRRL, UCSRA, UCSRB, UCSRC, HIGH($000C) LOW($000C) (1<<U2X) (1<<RXEN | 1<<TXEN | 0<<UCSZ2) (1<<URSEL | 0<<UMSEL | 0<<UPM1 | 0<<UPM0 | 0<<USBS | 1<<UCSZ1 | 1<<UCSZ0)

IEE 256

SISTEMAS DIGITALES - LABORATORIO

SEMESTRE 2009-1

PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA

;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX SUBRUTINA: TX_BYTE XXXXX ;XXXXX XXXXX ;XXXXX Enva al USART un dato para ser transmitido por el puerto serial. XXXXX ;XXXXX XXXXX ;XXXXX Parmetro de entrada: R16 <- Dato a transmitir XXXXX ;XXXXX Registros Modificados: ninguno XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TX_BYTE: SBIS RJMP OUT RET UCSRA, UDRE TX_BYTE UDR, R16

Este es el archivo MisMacros.inc que se debe incluir en el programa


;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX MACRO STIO XXXXX ;XXXXX Almacena una constante de 8 bits en un registro de Entrada y Salida XXXXX ;XXXXX XXXXX ;XXXXX Operacon: I/O(A) <- K XXXXX ;XXXXX Sintaxis: LDIO A, K XXXXX ;XXXXX Operandos: 0 <= A <= 63 0 <= K <= 255 XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .MACRO STIO PUSH LDI OUT POP .ENDMACRO ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX MACRO BRNR XXXXX ;XXXXX Analiza el contenido de un registro de trabajo y realiza un salto condicional XXXXX ;XXXXX si el contenido de dicho registro NO se encuentra dentro de un rango. XXXXX ;XXXXX XXXXX ;XXXXX Operacon: Si Rd no se encuentra en el rango [Lim1, Lim2] XXXXX ;XXXXX entonces salta a ETIQUETA XXXXX ;XXXXX XXXXX ;XXXXX Sintaxis: BRNR Rd, Lim1, Lim2, ETIQUETA XXXXX ;XXXXX XXXXX ;XXXXX Operandos: 16 <= d <= 31 0 <= Lim1, Lim2 <= 255 XXXXX ;XXXXX PC-64 <= ETIQUETA <= PC+63 XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .MACRO BRNR CPI BRLO CPI BRSH .ENDMACRO ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXX MACRO INIC_PILA XXXXX ;XXXXX Inicializa el puntero de pila con el valor ms alto de memoria posible XXXXX ;XXXXX XXXXX ;XXXXX Operacon: SP <- RAMEND XXXXX ;XXXXX Sintaxis: INIC_PILA XXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .MACRO INIC_PILA LDI OUT LDI OUT .ENDMACRO R16, SPH, R16, SPL, HIGH(RAMEND) R16 LOW(RAMEND) R16 @0, @1 @3 @0, @2+1 @3 R16 R16, @1 @0, R16 R16

Material de trabajo elaborado por: Ing. Rolando Snchez Mayo 2009

IEE 256

SISTEMAS DIGITALES - LABORATORIO

SEMESTRE 2009-1

You might also like