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;