Вы находитесь на странице: 1из 28

Directivas de ensamblador

Directriz

Descripcin

BYTE

Reserva byte (s) a una variable.

CSEG

Segmento de Cdigo

CSEGSIZE

Tamao de la memoria de programa

DB

Definir byte constante (s)

DEF

Definir un nombre simblico en un registro

DSEG

Segmento de datos

DW

Definir palabra Constante (s)

ENDM, ENDMAKRO

Endmacro

EQU

Establecer un smbolo igual a una expresin

ESEG

Segmento EEPROM

SALIDA

Salir de archivo

CONTENER

Leer fuente de otro archivo

LISTA

Gire generacin listfile en

LISTMAC

Gire a la expansin de macros en el archivo de lista de

MACRO

Comience Macro

NOLIST

Gire generacin listfile off

ORG

Origen Set programa

SET

Establecer un smbolo de una expresin

ELSE, ELIF

Ensamblaje condicional

TERMINARA SI

Ensamblaje condicional

ERROR

Emite un mensaje de error

SI, IFDEF, IFNDEF

Ensamblaje condicional

MENSAJE

Devuelve una cadena de mensaje

DD

Definir palabra doble

DQ

Definir palabra cudruple

UNDEF

Smbolo registro undefine

ADVERTENCIA

Emite un mensaje de advertencia

OVERLAP / NOOVERLAP

Establecer seccin superposicin

Nota
Tenga en cuenta que todas las directivas deben ir precedidos por un punto.

BYTE - reserva de bytes para una variable

Los recursos de las reservas directiva BYTE memoria en la SRAM o EEPROM. Con el fin de ser capaz de
hacer referencia a la ubicacin reservada, la directiva BYTE debe ir precedida de una etiqueta. La
directiva toma un parmetro, que es el nmero de bytes para reservar. La directiva no se puede
utilizar dentro de un segmento de cdigo (ver directivas ESEG, CSEG, DSEG) .Nota que se debe dar
un parmetro. No se inicializan Los bytes asignados.
Sintaxis:
ETIQUETA: expresin .BYTE
Ejemplo:

.DSEG
var1: .BYTE 1; reservar 1 byte a var1
tabla: tab_size .BYTE; bytes tab_size reserva
.CSEG
r30 LDI, baja (Q1); Cargar Z registro bajo
r31 LDI, alta (Q1); Cargar Z registro de alta
r1 ld, Z; Cargar VAR1 en el registro 1

Segmento de cdigo - CSEG


La directiva CSEG define el inicio de un segmento de cdigo. Un archivo de ensamblador puede
consistir en varios segmentos de cdigo, que se concatenan en un solo segmento de cdigo cuando se
ensamblan. La directiva BYTE no se puede utilizar dentro de un segmento de cdigo. El tipo de
segmento por defecto es Cdigo. Los segmentos de cdigo tienen su propio contador de ubicacin que
es un contador de palabras. La directiva ORG se puede utilizar para colocar cdigo y constantes en
ubicaciones especficas en la memoria de programa. La directiva no toma ningn parmetro.
Sintaxis:
.CSEG
Ejemplo:

.DSEG; Comience segmento de datos


vartab: .BYTE 4; Reserva 4 bytes de SRAM
.CSEG; Comience segmento de cdigo
const: .DW 2; Escribe 0x0002 en prog.mem.
mov r1, r0; Hacer algo

CSEGSIZE - memoria del programa Tamao


AT94K dispositivos tienen una particin de memoria de usuario configurable entre la memoria del
programa AVR y la memoria de datos. El programa y los datos SRAM se divide en tres bloques: 10K x
16 dedicado SRAM programa, 4K x 8 dedicado SRAM de datos, y 6K x 16 o 12K x 8 SRAM configurable
que pueden ser intercambiadas entre el programa y memoria de datos espacios en 2K x 16 o 4K x 8
particiones. Esta directiva se utiliza para especificar el tamao del bloque de memoria de programa.
Sintaxis:
.CSEGSIZE = 10 | 12 | 14 | 16
Ejemplo:

.CSEGSIZE = 12; Especifica el tamao meory programa 12K x 16

DB - Definir byte constante (s) en la memoria de programa y


EEPROM

Los recursos reservas directivas de memoria DB en la memoria de programa o en la memoria


EEPROM. Con el fin de ser capaz de referirse a los lugares reservados, la directiva DB debe ir
precedida de una etiqueta.La directiva DB toma una lista de expresiones, y debe contener al menos
una expresin. La directiva DB debe ser colocado en un segmento de cdigo o un segmento EEPROM.
La lista de expresin es una secuencia de expresiones, delimitado por comas. Cada expresin debe
evaluar a un nmero entre -128 y 255. Si la expresin se evala como un nmero negativo, los 8 bits
complemento a dos del nmero se colocarn en la posicin de memoria de programa o memoria
EEPROM.
Si la directiva DB se da en un segmento de cdigo y el ExpressionList contiene ms de una expresin,
las expresiones se empaquetan de modo que dos bytes se colocan en cada palabra de memoria de
programa. Si el ExpressionList contiene un nmero impar de expresiones, la ltima expresin ser
colocado en una palabra de memoria de programa propio, incluso si la lnea siguiente en el cdigo
assemby contiene una directiva DB. El medio no utilizado de la palabra programa se pone a cero. Una
advertencia se da, con el fin de notificar al usuario que un byte adicional cero se aade el
comunicado .DB
Sintaxis:
ETIQUETA: .DB ExpressionList
Ejemplo:

.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xAA
.ESEG
const2: .DB 1,2,3

DEF - Establezca un nombre simblico en un registro


La directiva DEF permite que los registros para ser remitidos a travs de smbolos. Un smbolo definido
se puede utilizar en el resto del programa para hacer referencia al registro que est asignado. Un
registro puede tener varios nombres simblicos que se le atribuye. Un smbolo puede ser redefinido
ms tarde en el programa.
Sintaxis:
.def Smbolo = Registro
Ejemplo:

.def Temp = R16


.def Ior = R0
.CSEG
temp LDI, 0xF0; Cargar 0xF0 en el registro de temperatura
en ior, 0x3f; Leer SREG en ior registro
eo temp, ior; Exclusiva o temporal y ior

UNDEF - undefine un nombre simblico registro


"La directiva UNDEF se utiliza quitar la definicin de un smbolo previamente definido con
el DEF Directiva. Esto proporciona una forma sencilla de obtener una determinacin del alcance de las
definiciones de registro, para evitar las advertencias sobre reutilizacin registro.
Sintaxis:
Smbolo .UNDEF
Ejemplo:

.def Var1 = R16


LDI var1, 0x20
...; hacer algo ms con var1

.UNDEF Var1
.def Var2 = R16; R16 ahora puede ser reutilizado sin previo aviso.

DSEG - segmento de datos


La directiva DSEG define el inicio de un segmento de datos. Un archivo de fuente en ensamblador
puede consistir en varios segmentos de datos, que se concatenan en un solo segmento de datos
cuando se ensamblan. Un segmento de datos ser normalmente slo constar de directivas BYTE (y
etiquetas). Los segmentos de datos tienen su propio contador de ubicacin que es un contador de
bytes. La directiva ORG se puede utilizar para colocar las variables en ubicaciones especficas en la
SRAM. La directiva no toma ningn parmetro.
Sintaxis:
.DSEG
Ejemplo:

.DSEG; Comience segmento de datos


var1: .BYTE 1; reservar 1 byte a var1
tabla: tab_size .BYTE; reserva tab_size bytes.
.CSEG
r30 LDI, baja (Q1); Cargar Z registro bajo
r31 LDI, alta (Q1); Cargar Z registro de alta
r1 ld, Z; Cargar var1 en el registro 1

DW - Definir la palabra constante (s) en la memoria de


programa y EEPROM
Los recursos reservas directivas de memoria DW en la memoria de programa o en la memoria
EEPROM. Con el fin de ser capaz de referirse a los lugares reservados, la directiva DW debe ir
precedida de una etiqueta. La directiva DW toma una lista de expresiones, y debe contener al menos
una expresin. La directiva DB debe ser colocado en un segmento de cdigo o un segmento EEPROM.
La lista de expresin es una secuencia de expresiones, delimitado por comas. Cada expresin debe
evaluar a un nmero entre -32768 y 65535. Si la expresin se evala como un nmero negativo, los
16 bits complemento de la serie de dos llegarn a ser colocado en la memoria de programa o
ubicacin de la memoria EEPROM.
Sintaxis:
ETIQUETA: .DW ExpressionList
Ejemplo:

.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32.768, 65.535
.ESEG
eevarlst: .DW 0,0xffff, 10

DD - Definir doubleword constante (s) en la memoria de


programa y EEPROM

DQ - Definir palabra cudruple constante (s) en la memoria de


programa y EEPROM
Estas directrices son muy similares a la DW Directiva, excepto que se utilizan para definir 32 bits
(palabra doble) y 64 bits (palabra cudruple), respectivamente. La disposicin de los datos en la
memoria es estrictamente little-endian.
Sintaxis:
ETIQUETA: .Dd ExpressionList
ETIQUETA: .DQ ExpressionList
Ejemplo:

.CSEG
varlist: .Dd 0, 0xfadebabe, -2147483648, 1 << 30
.ESEG
eevarlst: 0,0xfadebabedeadbeef .DQ, 1 << 62

> ELIF, ELSE - ensamblaje condicional


.ELIF Incluir cdigo hasta el ENDIF correspondiente de la siguiente ELIF al mismo nivel si la expresin
es verdadera, y tanto la clusula .IF inicial y todas las siguientes clusulas .ELIF son falsas.
.ELSE Incluir cdigo hasta el .endif correspondiente si la clusula initial.IF y todas las clusulas .ELIF
(en su caso) todos son falsos.
Sintaxis:
.ELIF <Expresin>
.ELSE
.IFDEF Smbolo <> | .IFNDEF <smbolo>
...
.ELSE | .ELIF <Expresin>
...
.TERMINARA SI
Ejemplo:

.IFDEF DEBUG
.message "Depuracin .."
.ELSE
.message "Release .."
.TERMINARA SI

ENDIF - ensamblaje condicional


Ensamblaje condicional incluye un conjunto de comandos en el tiempo de montaje. La directiva ENDIF
define el final para el SI condicional o IFDEF o ifndef directivas.
Condicionales (.IF ... ELIF ... ELSE ... ENDIF bloques) se pueden anidar, pero todos los condicionales
deben terminar al final del archivo (condicionales no pueden abarcar varios archivos).
Sintaxis:
.TERMINARA SI
.IFDEF Smbolo <> | .IFNDEF <smbolo>
...
.ELSE | .ELIF <Expresin>
...
.TERMINARA SI
Ejemplo:

.IFNDEF DEBUG
.message "Release .."
.ELSE
.message "Depuracin .."
.TERMINARA SI

ENDM, ENDMAKRO - Fin macro


La directiva ENDMAKRO define el final de una definicin de macro. La directiva no toma ningn
parmetro. Ver la directiva MACRO para obtener ms informacin sobre la definicin de macros. ENDM
es una forma alternativa, totalmente equivalentes con ENDMAKRO.
Sintaxis:
.ENDMACRO
.ENDM
Ejemplo:

.MACRO SUBI16; Comience macro definicin


subi r16, bajo (@ 0); Byte bajo Reste
r17 SBCI, alta (@ 0); Byte alto Reste
.ENDMACRO

EQU - Establecer un smbolo igual a una expresin


La directiva EQU asigna un valor a una etiqueta. Esta etiqueta se puede utilizar en expresiones
posteriores. Una etiqueta asignada a un valor por la directiva EQU es una constante y no puede ser
modificado o redefinido.
Sintaxis:
Etiqueta .equ = expresin
Ejemplo:

.equ Io_offset = 0x23


.equ Porta = io_offset + 2.CSEG; Comience segmento de cdigo
clr r2; Registro Claro 2
porta cabo, r2; Escriba a Puerto A

ERRORES Emite una cadena de mensajes de error


La directiva ERROR da salida a una cuerda y se detiene el montaje. Puede ser utilizado en el montaje
condicional.
Sintaxis:
.ERROR "<Cadena>"
Ejemplo:

.IFDEF TOBEDONE
.ERROR "Still cosas que hacer .."
.TERMINARA SI

ADVERTENCIA - Emite una cadena de mensaje de alerta


La directiva .WARNING emite una cadena de advertencia, pero a diferencia de la Directiva .ERROR no
detiene el montaje. Puede ser utilizado en el montaje condicional.
Sintaxis:
.WARNING "<Cadena>"

Ejemplo:

.IFDEF EXPERIMENTAL_FEATURE
.WARNING "Esto no est bien probado, utilice por cuenta y riesgo."
.TERMINARA SI

ESEG - Segmento EEPROM


La directiva ESEG define el inicio de un segmento EEPROM. Un archivo de fuente en ensamblador
puede consistir en varios segmentos de EEPROM, la cual se concatenan en un solo segmento de
EEPROM cuando se ensamblan. Un segmento EEPROM normalmente slo constar de DB y directivas
DW (y etiquetas). Los segmentos EEPROM tienen su propio contador de ubicacin que es un contador
de bytes. La directiva ORG se puede utilizar para colocar las variables en ubicaciones especficas en la
EEPROM. La directiva no toma ningn parmetro.
Sintaxis:
.ESEG
Ejemplo:

.DSEG; Comience segmento de datos


var1: .BYTE 1; reservar 1 byte a var1
tabla: tab_size .BYTE; reserva tab_size bytes.
.ESEG
eevar1: .DW 0xffff; inicializar 1 palabra en EEPROM

EXIT - Salir de este archivo


La directiva SALIDA indica al ensamblador que parar de montar el archivo. Normalmente, el
ensamblador se prolongar hasta el final del archivo (EOF). Si una directiva SALIR aparece en un
archivo incluido, el ensamblador contina desde la lnea que sigue la directiva incluir en el archivo que
contiene la directiva INCLUDE.
Sintaxis:
.SALIDA
Ejemplo:

.SALIDA ; Salir de este archivo

INCLUYE - Incluir otro archivo


La directiva include le dice al ensamblador para empezar a leer desde un archivo especificado. El
ensamblador y luego ensambla el archivo especificado hasta el final del archivo (EOF) o se encuentra
una directiva SALIR. Un archivo incluido puede contener en s CONTENER directivas. La diferencia
entre las dos formas es que el primero busca en el directorio actual primero, el segundo no lo hace.
Sintaxis:
"Nombre de archivo" .include
.include <Nombre de archivo>
Ejemplo:

; iodefs.asm:
.equ SREG = 0x3F; Registro de estado
.equ Sphigh = 0x3e; Pila puntero alta
.equ Splow = 0x3D; Pila puntero baja
; incdemo.asm

Iodefs.asm .include; Incluir las definiciones de E / S


en r0, SREG; Leer registro de estado

SI, IFDEF, IFNDEF - ensamblaje condicional


Ensamblaje condicional incluye un conjunto de comandos en el tiempo de montaje. La directiva IFDEF
incluir cdigo hasta que la correspondiente directiva else if <smbolo> se define. El smbolo se debe
definir con el EQU o directiva SET. (No funciona con la directiva DEF) la Directiva si incluir cdigo si
<expresin> se evala diferente de 0. Vlido hasta el correspondiente ELSE o directiva ENDIF.
Hasta 5 niveles de anidamiento es posible.
Sintaxis:
.IFDEF <Smbolo>
.IFNDEF <Smbolo>
.IF <Expresin>
.IFDEF Smbolo <> | .IFNDEF <smbolo>
...
.ELSE | .ELIF <Expresin>
...
.TERMINARA SI
Ejemplo:

.MACRO SET_BAT
.IF @ 0> 0x3F
.message "Direccin mayor que 0x3F"
lds @ 2, @ 0
sbr @ 2, (1 << @ 1)
pts @ 0, @ 2
.ELSE
.message "Direccin menor o igual 0x3F"
.TERMINARA SI
.ENDMACRO

LISTA - Girar la generacin listfile en


La directiva LISTA dice al ensamblador para convertir la generacin listfile sucesivamente. El
ensamblador genera un listfile que es una combinacin de cdigo fuente montaje, direcciones y
cdigos de operacin.Generacin listfile est activada de forma predeterminada. La directiva tambin
se puede utilizar junto con la directiva NOLIST con el fin de generar solamente listfile de partes
seleccionadas de un archivo de origen de ensamblaje.
Sintaxis:
.list
Ejemplo:

.NOLIST; Deshabilitar la generacin listfile


.include "Macro.inc"; Los archivos incluidos no lo har
.include "Const.def"; se muestra en la listfile
.list; Vuelva a activar la generacin listfile

LISTMAC - Turn expansin macro en


La directiva LISTMAC dice al ensamblador que cuando una macro se llama, la expansin de la macro
se muestra en el listfile generada por el ensamblador. El valor por defecto es que slo la macrollamada con parmetros se muestra en el listfile.
Sintaxis:

.LISTMAC
Ejemplo:

.MACRO MACX; Definir un ejemplo macro


aadir r0, @ 0; Hacer algo
eo r1, @ 1; Hacer algo
.ENDMACRO; Terminar macro definicin
.LISTMAC; Activar la expansin de macros
MACX r2, r1; Llame macro, show de expansin

MACRO - Comience macro


La directiva MACRO le dice al ensamblador que este es el comienzo de una macro. La directiva MACRO
toma el nombre de la macro como parmetro. Cuando el nombre de la macro se escribe ms adelante
en el programa, la definicin de macro se expande en el lugar que fue utilizado. Una macro puede
tardar hasta 10 parmetros. Estos parmetros se conocen como @ 0- @ 9 dentro de la definicin de
macros. Al emitir una llamada de macro, los parmetros se dan como una lista separada por
comas. La definicin de macro se termina por una directiva ENDMAKRO.
Por defecto, slo la llamada a la macro se muestra en la listfile generada por el ensamblador. Con el
fin de incluir la expansin de la macro en el listfile, se debe utilizar una directiva LISTMAC. Una macro
es marcada con un + en el campo cdigo de operacin del listfile.
Sintaxis:
.MACRO Macroname
Ejemplo:

.MACRO SUBI16; Comience macro definicin


subi @ 1, bajo (@ 0); Byte bajo Reste
SBCI @ 2, alta (@ 0); Byte alto Reste
.ENDMACRO; Terminar macro definicin
.CSEG; Comience segmento de cdigo
SUBI16 0x1234, r16, r17; Sub.0x1234 de r17: r16

MENSAJE - Salida de una cadena de mensaje


La directiva MENSAJE emite una cadena. til en el ensamblaje condicional.
Sintaxis:
.message "<Cadena>"
Ejemplo:

.IFDEF DEBUG
.message "Modo de depuracin"
.TERMINARA SI

NOLIST - Girar generacin listfile off


La directiva NOLIST dice al ensamblador para convertir la generacin listfile apagado. El ensamblador
normalmente genera una listfile que es una combinacin del cdigo fuente montaje, direcciones y
cdigos de operacin. Generacin listfile est activada de forma predeterminada, pero se puede
desactivar mediante el uso de esta directiva. La directiva tambin se puede utilizar junto con la
directiva LISTA con el fin de generar solamente listfile de partes seleccionadas de un archivo de origen
de ensamblaje.
Sintaxis:

.NOLIST
Ejemplo:

.NOLIST; Deshabilitar la generacin listfile


.include "Macro.inc"; Los archivos incluidos no lo har
.include "Const.def"; se muestra en la listfile
.list; Vuelva a activar la generacin listfile

Origen programa Set - ORG


La directiva ORG establece el contador de ubicacin para un valor absoluto. El valor de establecer se
da como un parmetro. Si una directiva ORG se da dentro de un segmento de datos, entonces es el
contador de ubicacin SRAM que se fija, si la directiva se da dentro de un segmento de cdigo,
entonces es el contador de la memoria de programa que se establece y si la directiva se da dentro de
un Segmento EEPROM, es el contador de ubicacin EEPROM que se fija.
Los valores por defecto del Cdigo y los contadores ubicacin EEPROM son cero, y el valor por defecto
de la barra de ubicacin SRAM es la direccin inmediatamente despus del final de E / S del espacio
de direcciones I (0x60 para dispositivos sin que extendi de E / S, 0x100 o ms para dispositivos con
extendido de E / S) cuando se inicia el montaje. Tenga en cuenta que los contadores de SRAM y
ubicacin EEPROM cuentan bytes mientras que el contador de posicin de memoria de programa
cuenta con palabras. Tambin tenga en cuenta que algunos dispositivos carecen de SRAM y / o
EEPROM.
Sintaxis:
Expresin .ORG
Ejemplo:

.DSEG; Comience segmento de datos


.ORG 0x120; Establecer direccin SRAM a hexadecimal 120
variables: .BYTE 1; Reserve un byte a adr SRAM. 0x120
.CSEG
.ORG 0x10; Establecer contador de programa a hexadecimal 10
mov r0, r1; Hacer algo

SET - Establece un smbolo igual a una expresin


La directiva SET asigna un valor a una etiqueta. Esta etiqueta se puede utilizar en expresiones
posteriores. A diferencia del EQU Directiva, una etiqueta asignada a un valor por la directiva SET se
puede cambiar (redefinido) ms tarde en el programa.
Sintaxis:
Etiqueta .SET = expresin
Ejemplo:

.SET FOO = 0x114; establecer FOO para que apunte a una ubicacin SRAM
lds r0, FOO; ubicacin de carga en r0
.SET FOO FOO = + 1; incremento (redefinir) FOO. Esto sera ilegal si se utiliza .equ
lds r1, FOO; cargar prxima ubicacin en r1

OVERLAP / NOOVERLAP - Configure la seccin superposicin


Introducido en AVRASM 2.1. Estas directrices son para proyectos con necesidades especiales y se
deben normalmente no se pueden utilizar.
Estas directivas slo afectan el segmento activo actualmente (CSEG / DSEG / ESEG).
Las directivas / nooverlap .overlap marcan una seccin que se permitir a superponerse cdigo / datos
con cdigo / datos definidos en otro lugar, sin ningn error o mensajes de advertencia que se

generan. Esto es totalmente independiente de lo que se establece mediante los #pragma directivas. El
atributo de superposicin-permitido permanecer en efecto a travs de directivas .org, pero no va a
seguir a travs de .cseg / .eseg / .dseg directivas (cada segmento marcado por separado).
Sintaxis:
.OVERLAP
.NOOVERLAP
Ejemplo:

.overlap
.org 0; seccin 1
rjmp por defecto
.nooverlap
.org 0; seccin 2
rjmp REINICIAR; No hay error dado aqu
.org 0; la seccin # 3
rjmp REINICIAR; Error aqu porque se solapan con # 2

Macros Asamblea

http://www.avrtutorials.com/projects/avrmicrocontroller-based-projects
Qu es un Macros?
En la programacin de ensamblaje de una macro es bsicamente un conjunto de
instrucciones representado por una sola sentencia. Una macro puede ser visto como una
nueva instruccin creado por el programador para el microcontrolador.
Tenga en cuenta sin embargo que esta nueva instruccin (la macro) se crea mediante el
uso de las instrucciones existentes que se proporcionan con el microcontrolador AVR.

El uso de un Macros Asamblea

Digamos que usted quiere inicializar el puntero de pila AVR. Se necesitaran cuatro (4)
instrucciones para realizar esta tarea, como se muestra en el cdigo ensamblador AVR

continuacin. Aqu estamos cargando la ltima direccin de SRAM en el puntero de pila


microcontrolador AVR.
; Inicializar el puntero de pila microcontrolador AVR
LDI R16, baja (RAMEND) OUT
SPL, R16
LDI R16,

alta (RAMEND) OUT

SPH, R16

Ahora, en lugar de escribir los cuatro (4) de instrucciones para inicializar el puntero de pila
AVR puede definir una macro, decir LSP, con estas instrucciones y utilizar esta macro
para reemplazar el conjunto de la instruccin como se muestra en el cdigo
ensamblador AVR continuacin.
; Inicializar la pila
LSP R16, RAMEND

Pasos en escritos macros montaje AVR

Las macros son simples de cdigo, como se muestra en el ejemplo de cdigo a


continuacin, slo tienes que seguir los sencillos pasos dados aqu:
1. Todas las definiciones de macros se inicia con la MACRO Directiva ensamblador
seguido por el nombre de la macro en la misma lnea. Aqu el nombre de nuestro
macro es LSP.
2. Fjese en la definicin macro por debajo de la @ 0 y @ 1 smbolos. Estos son
marcadores de posicin para los argumentos que se pasarn a la macro, @ 0 y @
1 se reemplazan con el primer y segundo argumentos respectivamente. Nota que
tambin podra tener @ 2, @ 3 y as sucesivamente.
3. Utilice la ENDMAKRO Directiva ensamblador AVR para poner fin a la definicin de
la macro.
. MACRO

LSP
LDI @ 0, baja (@ 1)
OUT
SPL, @ 0
LDI @ 0, alta (@ 1) OUT

SPH, @ 0. ENDMAKRO

Una vez que haya definido su macro se puede utilizar como cualquier otra de las
instrucciones de microcontroladores AVR. A continuacin se muestra como se puede
utilizar la macro simplemente definir arriba.Ntese aqu que @ 0 y @ 1 ser sustituido
por R16 y RAMEND, respectivamente, en la definicin de la macro.
LSP R16, RAMEND

AVR Tutoriales espera este tutorial montaje sobre escribiendo macros montaje AVR fue
beneficioso para usted y espera con inters sus continuas visitas para todas sus
necesidades de tutora microcontrolador.

El reloj ATmega16 LCD Digital

En este proyecto ATmega16 AVR estaremos diseando e implementando un reloj digital


con la ayuda de un microcontrolador Atmel AVR ATmega16 y una pantalla de cristal
lquido alfanumrico (LCD). Nota: Aunque este proyecto AVR fue diseado alrededor del
ATmega16 el proyecto podra haber utilizado otra microcontrolador tal como un
ATmega32, ATMega8515, etc. ATmega16 LCD Operacin Reloj Digital Nuestro reloj
digital funciona como sigue. Cuando el circuito se enciende el reloj comienza
a "00:00:00" para "HH: MM: SS". Hay dos pulsadores utilizados para ajustar la
hora. Interruptor SW1 se utiliza para configurar los minutos, al pulsar este botn los
minutos en aumento hasta llegar a 59 y luego restablecer y empezar a contar desde
0. Interruptor SW2 es para establecer las horas.

ATmega16 LCD Reloj Digital Descripcin del hardware

La figura a continuacin da el diagrama de circuito para la pantalla LCD Reloj Digital


ATmega16.

Nota Importante: Para que nuestro reloj digital para que funcione correctamente el
oscilador interno del microcontrolador ATmega16 AVR debe estar habilitado y se puso a 4
MHz.

Software ATmega16 LCD Reloj Digital

A continuacin se muestra la ejecucin AVR C de todo el cdigo para el reloj digital LCD
basada ATmega16. El cdigo fue implementado y construido con AVR
Studio 5. Recurdese que el reloj interno del microcontrolador ATmega16 debe estar
habilitado y programado para funcionar a 4 MHz para el cdigo AVR C para funcionar
correctamente. Un video del reloj digital LCD en la operacin se presenta al final de esta
pgina.
/ *
* LCD-Digital-Clock.c
*
* Escrito en AVR Studio 5
* Compilador: AVR GNU C Compiler (GCC)
*
* Creado: 12/22/2011 6:34:36 PM
* Autor: AVR Tutoriales
* Sitio web: www.AVR-Tutorials.com
* /
#define F_CPU 4000000UL
#include <avr / delay.h>
#include <avr / io.h>
#include <string.h>
#include <avr / interrupt.h>
/ * Variables globales Declaraciones * /
unsigned Char horas = 0;
sin firmar Char minutos = 0;
sin firmar Char segundo = 0;
Char tiempo [] = "00:00:00";
/ * Declaraciones de funciones LCD */
void LCD_send_command ( unsigned char cmnd ) ;
void LCD_send_data ( unsigned char data ) ;
void LCD_init ( ) ;
void LCD_goto ( unsigned char y , unsigned char x ) ;
void LCD_print ( char * string ) ;
void LCD_update_time ( void ) ;
/ * Contador Temporizador 1 Comparar rutina de ajuste de un Servicio de
Interrupcin / Interrumpir Manejador * /
ISR (TIMER1_COMPA_vect);
#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB
#define LCD_DATA_PIN PINB
#define LCD_CNTRL_PORT PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC
#define
#define
#define
#define
#define

LCD_RS_PIN 5
LCD_RW_PIN 6
LCD_ENABLE_PIN 7
SET_HOUR 3
SET_MINUTE 4

int principal (void)


{unsigned
char i;
LCD_init ();
LCD_goto (1, 2);
LCD_print ("AVR-tutoriales");
LCD_goto (2, 4);
LCD_print (tiempo);
LCD_CNTRL_PORT =

(1 << SET_HOUR |

1 << SET_MINUTE);

TCCR1B = (1 << CS12 | 1 << WGM12);


OCR1A = 15 625 - 1;
TIMSK = 1 << OCIE1A;
sei ();
while ( 1 )
{

if ( ! ( LCD_CNTRL_PIN & ( 1 << SET_HOUR ) ) )


{
hours ++;
if ( hours > 23 )
hours = 0 ;
}
if ( ! ( LCD_CNTRL_PIN & ( 1 << SET_MINUTE ) ) )
{
minutes ++;
if ( minutes > 59 )
minutes = 0 ;
}
_delay_ms ( 250 ) ;
}

/ * Esta funcin enva un comando 'CMND' al LCD module*/


void LCD_send_command ( unsigned char cmnd )
{
LCD_DATA_PORT = cmnd ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RW_PIN ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RS_PIN ) ;
LCD_CNTRL_PORT |= ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 2 ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 100 ) ;
}
/ * Esta funcin enva 'datos' los datos al LCD module*/
void LCD_send_data ( unsigned char data )
{
LCD_DATA_PORT = data ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RW_PIN ) ;
LCD_CNTRL_PORT |= ( 1 << LCD_RS_PIN ) ;
LCD_CNTRL_PORT |=

( 1 << LCD_ENABLE_PIN ) ;

_delay_us ( 2 ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 100 ) ;
}
void LCD_init ()
{LCD_CNTRL_DDR = 0xFF;
LCD_CNTRL_PORT = 0x00;
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;
_delay_ms ( 10 )
LCD_send_command
LCD_send_command
LCD_send_command
_delay_ms ( 10 )
LCD_send_command

;
(
(
(
;
(

0x38 ) ;
0x0C ) ;
0x01 ) ;
0x06 ) ;

}
/ * Esta funcin mueve el cursor a la recta y la columna x en el mdulo
LCD * /
void LCD_goto (sin firmar
carbn y, sin firmar carbn x) {unsigned
carbn firstAddress [] = {0x80, 0xC0, 0x94, 0xD4};

LCD_send_command (firstAddress [y - 1]
_delay_ms (10);}
void LCD_print (Char

+ x - 1);

* cadena) {unsigned char i;

mientras (string [i] =! 0)


{LCD_send_data (string [i]);
i ++;}} void LCD_update_time () {unsigned carbn temp;

LCD_goto (2, 4);


itoa (horas / 10, temp, 10);
LCD_print (temp);
itoa (hora% 10, temporales, 10);
LCD_print (temp);
LCD_print (":");
itoa (minutos / 10, temp, 10);
LCD_print (temp);
itoa ((minuto% 10), temperatura, 10);

LCD_print (temp);
LCD_print (":");
itoa (segundos / 10, temp, 10);
LCD_print (temp);
itoa (segundos% 10, temp, 10);
LCD_print (temp);} / * Contador Temporizador 1 Compara Partido Un
servicio de interrupcin Rutina / Interrumpir Manejador * /
ISR (TIMER1_COMPA_vect)
{segundo ++;

si (segundo ==

60)

{segundos = 0;
minutos ++;}
si (minutos ==

60)

{minutos =
horas ++;}

0;

si (hora> 23)
horas = 0;
LCD_update_time ();}

El Termmetro Digital LM35 ATmega16 LCD

En este proyecto ATmega16 AVR estaremos diseando e implementando un termmetro


digital con la ayuda de un microcontrolador Atmel AVR ATmega16, una temperatura LM35
sensor / transductor y un mdulo LCD alfanumrico. Nota: Aunque este proyecto AVR fue
diseado alrededor del ATmega16 el proyecto podra han utilizado otro microcontrolador
tales como ATmega32, etc. El microcontrolador debe contener un Analog-to-Digital
Converter (ADC) sin embargo. ATmega16 LCD Termmetro Operacin Digital y
Hardware DescripcinNuestro circuito LCD termmetro digital y el programa C es la
siguiente. Cuando el circuito se enciende la temperatura del aire actual se mostrar en la
pantalla LCD. La figura a continuacin da el diagrama de circuito para el Termmetro
Digital LCD ATmega16.

Nota Importante: Para que la unidad Termmetro Digital LM35 LCD para que funcione
correctamente el oscilador interno del microcontrolador ATmega16 AVR debe estar
habilitado y se puso a 4 MHz.

Software

para

el

Termmetro

Digital

LCD

ATmega16

A continuacin se muestra la ejecucin AVR C de todo el cdigo de los ATmega16


Termmetro Digital LCD basada. El cdigo fue implementado y construido con AVR
Studio 5. Recurdese que el reloj interno del microcontrolador ATmega16 debe estar
habilitado y programado para funcionar a 4 MHz para el cdigo AVR C para funcionar
correctamente. Un video del Termmetro Digital LCD en funcionamiento se presenta al
final de esta pgina.
/ *
* Digital_Thermometer.c
*
* Autor: AVR Tutoriales
* Sitio web: www.AVR-Tutorials.com
*
* Escrito en AVR Studio 5
* Compilador: AVR GNU C Compiler (GCC)
* /
#define F_CPU 4000000UL
#include <avr / delay.h>
#include <avr / io.h>
#include <string.h>
#include <avr / interrupt.h>
/ * Variables globales Declaraciones * /
/ * Declaraciones de funciones LCD */
void LCD_send_command ( unsigned char cmnd ) ;
void LCD_send_data ( unsigned char data ) ;
void LCD_init ( ) ;
void LCD_goto ( unsigned char y , unsigned char x ) ;
void LCD_print ( char * string ) ;
/ * Conversin ADC completa rutina de servicio de interrupcin (ISR) * /
ISR (ADC_vect);
#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB
#define LCD_DATA_PIN PINB
#define LCD_CNTRL_PORT PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC
#define
#define
#define
#define
#define

LCD_RS_PIN 5
LCD_RW_PIN 6
LCD_ENABLE_PIN 7
SET_HOUR 3
SET_MINUTE 4

int principal (void)


{unsigned
char i;

LCD_init ();
LCD_goto (1, 2);
LCD_print ("La temperatura es");
LCD_CNTRL_PORT =

(1 << SET_HOUR |

1 << SET_MINUTE);

DDRA = 0x00; // Configurar PortA como entrada


ADCSRA = 0x8F;
funcin de interrupcin

//

sei ();
interrupciones
ADCSRA | =

//

Activar

el

ADC

su

// y establecer el ACD reloj preescalar a CLK / 128


ADMUX = 0xE0; // Seleccione 2.56V interna como Vref, dej
justificar // registros de datos y seleccione ADC0 como canal de entrada
Habilitar

1 << ADSC; // Iniciar conversin

mientras que (1);}


/ * Esta funcin enva un comando 'CMND' al LCD module*/
void LCD_send_command ( unsigned char cmnd )
{
LCD_DATA_PORT = cmnd ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RW_PIN ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RS_PIN ) ;
LCD_CNTRL_PORT |= ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 2 ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 100 ) ;
}
/ * Esta funcin enva 'datos' los datos al LCD module*/
void LCD_send_data ( unsigned char data )
{
LCD_DATA_PORT = data ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_RW_PIN ) ;
LCD_CNTRL_PORT |= ( 1 << LCD_RS_PIN ) ;

LCD_CNTRL_PORT |= ( 1 << LCD_ENABLE_PIN ) ;


_delay_us ( 2 ) ;
LCD_CNTRL_PORT &= ~ ( 1 << LCD_ENABLE_PIN ) ;
_delay_us ( 100 ) ;

void LCD_init ()
{LCD_CNTRL_DDR = 0xFF;
LCD_CNTRL_PORT = 0x00;
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;

Global

_delay_ms ( 10 )
LCD_send_command
LCD_send_command
LCD_send_command
_delay_ms ( 10 )
LCD_send_command

;
(
(
(
;
(

0x38 ) ;
0x0C ) ;
0x01 ) ;
0x06 ) ;

}
/ * Esta funcin mueve el cursor a la recta y la columna x en el mdulo
LCD * /
void LCD_goto (sin firmar
carbn y, sin firmar carbn x) {unsigned
carbn firstAddress [] = {0x80, 0xC0, 0x94, 0xD4};

LCD_send_command (firstAddress [y - 1]
_delay_ms (10);}
void LCD_print (Char

+ x - 1);

* cadena) {unsigned char i = 0;

mientras (string [i] =! 0)


{LCD_send_data (string [i]);
i ++;}}

/ * Conversin ADC completa rutina de servicio de interrupcin (ISR) * /


ISR (ADC_vect) {Char tempC, tempF, pantalla; float tempff;

tempC = ADCH; // ADCH Salida a PORTD


tempff = (float) tempC;
tempff = (tempff * 9) / 5 + 32;
tempF = tempff;
LCD_goto ( 2 , 4 ) ;
itoa ( tempC / 10 , display
LCD_print ( display ) ;
itoa ( tempC % 10 , display
LCD_print ( display ) ;
LCD_send_data ( 0xDF ) ;
LCD_print ( "C " ) ;
itoa ( tempF / 10 , display
LCD_print ( display ) ;
itoa ( tempF % 10 , display
LCD_print ( display ) ;
LCD_send_data ( 0xDF ) ;
LCD_print ( "F" ) ;
_delay_ms ( 500 ) ;

, 10 ) ;
, 10 ) ;

, 10 ) ;
, 10 ) ;

ADCSRA |=
Conversin}

1 << ADSC ;

// Comience

El ATmega16 siete segmentos Reloj Digital

En este proyecto ATmega16 AVR estaremos diseando e implementando un reloj digital


con la ayuda de un microcontrolador Atmel AVR ATmega16 y siete segmentos
Displays. Como tal antes de ir a travs de este proyecto AVR reloj digital se recomienda
para completar el tutorial sobre Interconexin una pantalla de siete segmentos con el
AVR microcontrolador. Nota: Aunque este proyecto AVR fue diseado alrededor del
ATmega16 el proyecto podra haber utilizado otro microcontrolador tales como
ATmega32 , ATMega8515, etc. ATmega16 Reloj Digital Operacin Nuestro reloj digital
funciona como sigue. Cuando el circuito se enciende el reloj comienza
a"00:00:00" para "HH: MM: SS". Hay dos pulsadores utilizados para ajustar la
hora. Interruptor SW1 se utiliza para configurar los minutos, al pulsar este botn los
minutos en aumento hasta llegar a 59 y luego restablecer y empezar a contar desde
0. Interruptor SW2 es para establecer las horas.

ATmega16 Reloj Digital Descripcin del hardware

La figura a continuacin da el diagrama de circuito para el ATmega16 Seven Segment


Display Digital Clock. Una caracterstica a tener en cuenta en que los siete exhibiciones
de segmento son impulsados por el mismo puerto(PortB). El microcontrolador a travs de
controles de Puerto C indican cuales siete pantalla segmento se muestra en cada
dgito. Tenga en cuenta que estos siete segmentos Muestra son ctodo comn pantalla.

Nota Importante: Para que nuestro reloj digital para que funcione correctamente el
oscilador interno del microcontrolador ATmega16 AVR debe estar habilitado y se puso a 4
MHz.

ATmega16 Software Digital Clock

A continuacin se muestra la implementacin AVR C de todo el cdigo para el reloj digital


basado ATmega16. El cdigo fue implementado y construido con AVR
Studio 5. Recurdese que el reloj interno del microcontrolador ATmega16 debe estar
habilitado y programado para funcionar a 4 MHz para el cdigo AVR C para funcionar
correctamente. Un video del reloj digital en la operacin se presenta al final de esta
pgina.
Por favor ver la Interfaz de una pantalla de siete segmentos con el AVR
Microcontrolador tutorial para obtener ms informacin en la pantalla de siete segmentos.
A continuacin se muestra el cdigo AVR C para el reloj digital basada ATmega16. Este
cdigo fue escrito en AVR Studio 5.
/ *
* DigitalClock.c
* Escrito en AVR Studio 5
* Compilador: AVR GNU C Compiler (GCC)
*
* Creado: 10/12/2011 1:17:19 PM
* Autor: AVR Tutoriales
* Sitio web:
www.AVR-Tutorials.com
* /
#define F_CPU 4000000UL
#include <avr / delay.h>
#include <avr / io.h>
#include <avr / interrupt.h>
#define SegDataPort PORTB
#define SegDataPin PINB
#define SegDataDDR DDRB
#define SegCntrlPort PORTC
#define SegCntrlPin PINC
#define SegCntrlDDR DDRC
/ * Variables globales Declaraciones * /
unsigned Char horas = 0;
sin firmar Char minutos = 0;
sin firmar Char segundo = 0;

/ * Funcin
Dgitos (0-9) a siete valores del segmento Encoder * /
unsigned
carbn DigitTo7SegEncoder (sin firmar
carbn dgitos, sin
firmar carbn comn);
/ * Contador Temporizador 1 Comparar rutina de ajuste de un Servicio de
Interrupcin / Interrumpir Manejador * /
ISR (TIMER1_COMPA_vect);
/ * Inicio Program*/
/
*************************************************************************
****/
int main ( void )
{
SegDataDDR = 0xFF ;
SegCntrlDDR = 0x3F ;
SegCntrlPort = 0xFF ;
TCCR1B = (1 << CS12 | 1 << WGM12);
OCR1A = 15 625 - 1;
TIMSK = 1 << OCIE1A;
sei ();
mientras que (1)
{/ * Minutos establecidos al pulsar SegCntrl Pin 6 Interruptor * /
si ((SegCntrlPin y

0x40)

==

0)

{_delay_ms (200);
si (minuto <59)
minutos ++;
else
minutos = 0;

}
/ * Horas establecidos al pulsar SegCntrl Pin 7 Interruptor * /
si ((SegCntrlPin y 0x80) == 0)
{_delay_ms (200);
si (horas <23)
horas ++;
else
horas = 0;}
SegDataPort = DigitTo7SegEncoder
SegCntrlPort = ~ 0x01 ;
SegDataPort = DigitTo7SegEncoder
SegCntrlPort = ~ 0x02 ;
SegDataPort = DigitTo7SegEncoder
SegCntrlPort = ~ 0x04 ;
SegDataPort = DigitTo7SegEncoder

( seconds % 10 , 1 ) ;
( seconds / 10 , 1 ) ;
( minutes % 10 , 1 ) ;
( minutes / 10 , 1 ) ;

SegCntrlPort = ~ 0x08 ;
SegDataPort = DigitTo7SegEncoder ( hours % 10 , 1 ) ;
SegCntrlPort = ~ 0x10 ;
SegDataPort = DigitTo7SegEncoder ( hours / 10 , 1 ) ;
SegCntrlPort = ~ 0x20 ;
}
Volver

0;}

/ *
* Funcin descriptiva:
* Codificar un dgito decimal 0-9 a su equivalente de siete segmentos.
*
* Argumentos de funcin:
* Dgito - dgito decimal a codificar
* Comn - nodo comn (0), Ctodo Comn (1)
* SegVal - Codificado Valor siete segmentos
*
* Conexiones:
* Encoded SegVal es el retorno en la otra GFEDCBA es A es el menos
* Poco significativo (bit 0) y G bit 6.
* /
Unsigned
carbn DigitTo7SegEncoder (sin firmar
carbn dgitos, sin
firmar carbn comn) {unsigned carbn SegVal;

switch ( digit )
{
case 0 :

case

1 :

case

2 :

1 )

break ;
if ( common ==

case

3 :

break ;
if ( common ==

1 )

case

4 :

break ;
if ( common ==

1 )

case

5 :

break ;
if ( common ==

SegVal =
SegVal

1 )

else

0b01100110 ;

SegVal =
SegVal

else

0b01001111 ;

SegVal =
SegVal

else

0b01011011 ;

break ;
if ( common ==

SegVal =
SegVal

else

0b00000110 ;

1 )

else

0b00111111 ;

if ( common ==

SegVal =
SegVal

1 )

SegVal =

0b00111111
=

0b00000110
=

0b01011011
=

0b01001111
=

0b01100110
=

0b01101101

else
0b01101101 ;
case

break ;
if ( common ==

6 :

SegVal
1 )

else

0b01111101 ;
case

break ;
if ( common ==

7 :

SegVal
1 )

else

0b00000111 ;
case

break ;
if ( common ==

8 :

case

break ;
if ( common ==

9 :

else

SegVal =
SegVal

1 )

else

0b01111111 ;

SegVal =

SegVal =
SegVal

1 )

SegVal =
SegVal

0b01111101
=

0b00000111
=

0b01111111
=

0b01101111
=

0b01101111 ;
}
return SegVal ;
}
/ * Contador Temporizador 1 Comparar Partido Un servicio de interrupcin
de rutina / Interrumpir Manejador * /
ISR (TIMER1_COMPA_vect)
{segundo ++;
si (segundo ==

60)

{segundos = 0;
minutos ++;}
si (minutos ==

60)

{minutos =
horas ++;}
si (hora> 23)
horas = 0;}

0;

Вам также может понравиться