Está en la página 1de 17

INSTITUTO TECNOLÓGICO SUPERIOR

P’URHÉPECHA

DIVISIÓN DE ESTUDIOS PROFESIONALES


DEPARTAMENTO DE INGENIERÍA BIOMÉDICA

ASIGNATURA:
MICROCONTROLADORES

REPORTE DE PRÁCTICA NUMERO 2

LCD

Presentan:
ALFREDO SILVERIO SAUCEDO.
JOSE JUAN NUCI ESTRADA
JOSE DANIEL MARCELO PAHUAMBA.
JHONATAN DURAN VELAZQUES

CHERÁN, MICHOACÁN 10 de junio de 2019


Índice
Introducción. ........................................................................................................................... 1

Marco Teórico ........................................................................................................................ 2

1.1 EL PROGRAMA ENSAMBLADOR .......................................................... 2

Desarrollo ............................................................................................................................... 9

Pruebas y Resultados ............................................................................................................ 12

Conclusiones......................................................................................................................... 14

Bibliografía ........................................................................................................................... 15

ii
Introducción.
Los microcontroladores AVR cuentan con un amplio conjunto de instrucciones y con 32
registros de trabajo de propósito general. En este caso se trabajara con microcontrolador
ATMEGA 328P de la familia Atmel, programado con la herramienta Atmel Studio de
AVR. Esta herramienta nos permite programar nuestros microcontroladores con un
lenguaje de programación de alto nivel C++, o con un lenguaje de bajo nivel Ensamblador,
en este caso se utilizó el lenguaje ensamblador, con la finalidad de escribir palabras en un
LCD para el código del programa utilizado se utilizaron subrutinas y registros guardados en
la pila, así como directivas de ensamblador. La finalidad de este programa es la
familiarización de el estudiante con este tipo de subrutinas y llamados a la pila, ya que en
mayor parte el programa crea registros y salidas de estos mismos.
Marco Teórico
1.1 EL PROGRAMA ENSAMBLADOR

Descripción:
El programa ensamblador es el programa que realiza la traducción de un programa
escrito en ensamblador a lenguaje máquina. Esta traducción es directa e inmediata, ya que
las instrucciones en ensamblador no son más que nemotécnicos de las instrucciones
máquina que ejecuta directamente la CPU.
Estructura:
Un programa en ensamblador está compuesto por líneas, conteniendo cada una de
ellas un comentario, una única instrucción o una directiva. En lo que sigue se utilizan los
símbolos <> para encerrar un identificador o un número que el programador debe escribir;
los símbolos [] elementos opcionales; los símbolos {} encierran elementos que se puede
escribir consecutivamente varias veces; el carácter |separa elementos opcionales.
Directivas del Ensamblador:
Controlan acciones auxiliares que realiza el programa ensamblador. No son
traducibles a código máquina, sino que indican al ensamblador las preferencias del
programador de cómo ha de efectuarse la traducción a lenguaje máquina. Ejemplo:
Variable DS.B 1 Variable es la etiqueta, DS.B es la directiva y 1 es su argumento
La Directivas en el Ensamblador se ajustan al código del usuario. Por ejemplo,
podrás cambiar la localidad del código en la memoria del programa, asignando etiquetas
que direccionan a la SRAM o definir los valores de las constantes. “. macro” es también
una directiva en el ensamblador.
.equ
Esta directiva asigna un nombre a una constante la cual no pueda cambiarse
después.

Conjunto de instrucciones:
En este apartado se comentan las instrucciones de ensamblador que poseen los
µC AVR de 8-BIT. El conjunto de instrucciones para estos microcontroladores se
puede dividir en el siguiente orden de grupos: Instrucciones Aritméticas y Lógicas
Instrucciones de Desvío (salto)Instrucciones de Transferencia de Datos Instrucciones de Bit
y prueba de Bit Una línea típica en lenguaje ensamblador está dada de la siguiente forma:
[Mnemónico] operando1, operando2
Los Mnemónicos son las instrucciones en lenguaje ensamblador que puede
reconocer el microprocesador. Dependiendo de la instrucción, puede haber uno o dos
operandos, incluso pueden no existir; su contenido consiste en un número, una variable o
una dirección; normalmente el resultado de una operación lógica, aritmética o de carga es
almacenado en operando1.

3
NOMENCLATURA DEL CONJUNTO DE INSTRUCCIONES

4
5
6
7
Tablas 1.1.-Instrucciones para lenguaje ensamblador.

8
Desarrollo
a continuación, se presenta el código utilizado en el programa Atmel Studio, el siguiente
código presenta una impresión en un LCD 8x1 en el cual se imprimirá la palabra HI. El
siguiente código muestra varias rutinas, saltos de rutinas y almacenamiento en pila. Para
poder utilizar instrucciones de llamados a subrutinas, y en general la pila del
microcontrolador entonces es necesario indicarle al programa la posición inicial de la
misma, esto se logra con las siguientes instrucciones:

.EQU LCD_DPRT=PORTD //asigna al puerto D el nombre de LCD_DPRT


.EQU LCD_DDDR=DDRD //asigna el nombre LCDDPIN a todos los puertos del
puerto D
.EQU LCD_DPIN=PIND //asigna el nombre de LCD_DPIN al PIND
.EQU LCD_CPRT=PORTB //asigna el nombre de LCD_CPRT al puerto B
.EQU LCD_CDDR=DDRB //asigna el nombre de LCD_CDDR=
.EQU LCD_CPIN=PINB //asigna el nombre de LCD_CPIN al PIN B
.EQU LCD_RS=0 // se asigna 0 como constante llamado LCD_RS
.EQU LCD_RW=1 // se asigna 1 como constante llamado LCD_RW
.EQU LCD_EN=2 // se asigna 2 como constante llamado LCD_EN

En los códigos anteriores se ha utilizado la subrutina .EQU, esta directiva


asigna un nombre a una constante la cual no pueda cambiarse después:
.equ max_byte = 255
A continuación, se describe el resto del código utilizado incluyendo las
directivas antes mencionadas.

.EQU LCD_DPRT=PORTD //asigna al puerto D el nombre de LCD_DPRT


.EQU LCD_DDDR=DDRD //asigna el nombre LCDDPIN a todos los puertos del
puerto D
.EQU LCD_DPIN=PIND //asigna el nombre de LCD_DPIN al PIND
.EQU LCD_CPRT=PORTB //asigna el nombre de LCD_CPRT al puerto B
.EQU LCD_CDDR=DDRB //asigna el nombre de LCD_CDDR=
.EQU LCD_CPIN=PINB //asigna el nombre de LCD_CPIN al PIN B
.EQU LCD_RS=0 // se asigna 0 como constante llamado LCD_RS
.EQU LCD_RW=1 // se asigna 1 como constante llamado LCD_RW
.EQU LCD_EN=2 // se asigna 2 como constante llamado LCD_EN

LDI R21,HIGH(RAMEND) //carga el registro 21 con los 8 bits más


significativos de RAMEND
OUT SPH,R21 //copia el contenido del registro 21 en SPH.

9
LDI R21,LOW(RAMEND) //carga el registro 21 con los 8 bits más
significativos de RAMEND
OUT SPL,R21 //copia en contenido del registro 16 en SPL

LDI R21,0XFF //se carga el registro 21 con el valor binario


0b11111111 o 0xFF en hexadecimal

OUT LCD_DDDR,R21 //se habilita el puerto D como salida del


registro 21.
OUT LCD_CDDR,R21 // se selecciona el bit cero del puerto b como
salida
CBI LCD_CPRT,LCD_EN //pone en cero cualquier registro en el PUERTO B
CALL DELAY_2ms //hace un retardo de 2 milisegundos.
LDI R16,0x38 //carga en el registro 16 el valor de 00111000
CALL CMNDWRT //COMANDO DE ESCRITURA
CALL DELAY_2ms //retardo de 2 milisegundos
LDI R16,0x0E //carga en el registro 16-00001110
CALL CMNDWRT //COMANDO DE ESCRITURA
CALL DELAY_2ms //retardo de 2 milisegundos
LDI R16,0x01 //pone el bit 0 del registro 16 en 1
CALL CMNDWRT //COMANDO DE ESCRITURA
CALL DELAY_2ms //retardo de 2 milisegundos
LDI R16,0x06 //carga 00000110 en el registro 16
CALL CMNDWRT //COMANDO DE ESCRITURA
LDI R16,'H' //guarda en el registro 16 la letra H
CALL DATAWRT // ESCRITURA DE DATOS
LDI R16,'I' // guarda en el registro 16 la letra I
CALL DATAWRT // ESCRITURA DE DATOS

HERE: JMP HERE //salta aquí


;----------------------------------------------------------------------
------------------------------------------------------------
CMNDWRT:
OUT LCD_DPRT,R16 //asigna al Puerto D el registro 16
CBI LCD_CPRT,LCD_RS //asigna al puerto B el valor de 0
CBI LCD_CPRT,LCD_RW //asigna al puerto B el valor de 1
SBI LCD_CPRT,LCD_EN //asigna 2 a un bit del puerto B
CALL SDELAY //llamara a la subrutina SDELAY
CBI LCD_CPRT,LCD_EN //asigna al puerto B el valor de 2

CALL DELAY_100us //crea un retardo de 100


milisegundos
RET //regresa a la subrutina CMNDWRT
;----------------------------------------------------------------------
------------------------------------------------------------
DATAWRT:
OUT LCD_DPRT,R16 //asigna el registro 16 a LCD_DPRT
SBI LCD_CPRT,LCD_RS //pone en cero un bit del registro 16
CBI LCD_CPRT,LCD_RW //pone en 1 un bit del registro 16
SBI LCD_CPRT,LCD_EN //pone en 2 un bit del registro 16
CALL SDELAY //si lo anterior se cumple salta a
SDELAY
CBI LCD_CPRT,LCD_EN //SI NO, PONE EN 2 el registro 16

10
CALL DELAY_100us //crea un retardo de 100
milisegundos
RET //regresa a la subrutina DATAWRT

;----------------------------------------------------------------------------
----------------------------------------------------------
SDELAY:
NOP //no se realiza nada en este ciclo
NOP //no se realiza nada en este ciclo
RET //regresa a la subrutina SDELAY

;----------------------------------------------------------------------------
--------------------------------------------------------
DELAY_100Us:
PUSH R17 //carga el registro 17 en la pila
LDI R17,60 //carga 60 en el registro 17
DR0: CALL SDELAY //llama a subrutina SDELAY
DEC R17 //decrementa el registro 17
BRNE DR0 //salta si el registro ha cambiado
POP R17 //saca el dato del registro 17 de la pila
RET //regresa a la subrutina DELAY_100Us

;----------------------------------------------------------------------------
--------------------------------------------------------
DELAY_2ms:
PUSH R17 //carga el registro 17 en la pila
LDI R17,20 //carga 20 en el registro 17

11
Pruebas y Resultados

Imagen 2.1. circuito armado en Proteus sin correr.

En la imagen anterior se puede observar el circuito armado en Proteus sin correr aun
el programa, se puede notar las conexiones de los pines del microcontrolador y en que pines
del LCD están estos conectados.
Imagen 2.2. circuito armado en Proteus corriendo.

En la imagen anterior se puede observar el circuito armado en Proteus ya corriendo,


en el cual se imprime en la pantalla LCD la palabra HI, completando así la final de la
práctica.

13
Conclusiones
Con lo visto anteriormente y durante el lapso de la elaboración del código anterior,
se llegó a la conclusión que el lenguaje ensamblador llega a ser mas complicado y tedioso
que el lenguaje de alto nivel C++ por lo que muchos estudiantes optan por usar el lenguaje
de alto nivel en proyectos para prueba, ya que logra ser menos complicado, se utiliza una
menor cantidad de líneas de código. Se optaría por usar lenguaje de bajo nivel en caso de
que se fuera a poner en ejecución el programa, pero por lo pronto y para practicas escolares
los estudiantes optamos por lenguaje de alto nivel.
Bibliografía
ATMEL. (2016). AVR Instruction Set Manual. ATMEL.
M, J. (2010). SEÑALES.
Madrid., U. C. (2002). Cuaderno de Prácticas Laboratorio de Fundamentos de
Computadores. Madrid: Facultad de Informática.
Mojica, J. S. (2016). INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL.
cd. mexico: MAGALLANES.
PADILLA., C. (2016). Directivas y Software Del AVR Studio (español). CD. MEXICO:
MAGALLANES.
Solis, F. (14 de Febrero de 2017). acuscorp.blogspot. Obtenido de acuscorp.blogspot:
http://acuscorp.blogspot.com/2017/02/programacion-del-microatmega328p-en.html