Professional Documents
Culture Documents
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
SEMESTRE 2009-1
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA
;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
;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
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
IEE 256
SEMESTRE 2009-1
PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU FACULTAD DE CIENCIAS E INGENIERIA SECCION ELECTRICIDAD Y ELECTRONICA
;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
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
IEE 256
SEMESTRE 2009-1