Laboratorio 4: “Display Alfanumérico 2x16”

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores
Segundo Semestre 2008
Laboratorio 4: “Display Alfanumérico 2x16”
Objetivos.
• Experimentar con la conexión de dispositivos externos al microcontrolador.
• Manejar puertos del microcontrolador en forma bidireccional.
• Aprender a utilizar un display LCD alfanumérico inteligente y conocer sus ventajas
como herramienta para depurar programas.
Preparación previa.
4.1 Introducción
Hoy en día existen en el mercado un grupo de displays LCD alfanuméricos muy populares
de la familia AND. Éstos son displays de texto y todos utilizan la misma interfaz, pero
vienen en distintas configuraciones, variando en número de líneas y cantidad de caracteres
que pueden mostrar. Poseen un repertorio limitado de caracteres, entre los cuáles se
encuentran los dígitos, letras mayúsculas y minúsculas, y caracteres de puntuación. Para
escribir un caracter se utiliza el código del estándar ASCII.
4.2 Display ANDxx1GST/GST-LED
El diplay LCD a utilizar en el laboratorio es producido por la empresa Purdy Electronics
Corporation, de la familia Intelligent Alphanumeric Displays modelo ANDxx1GST/GSTLED. El tamaño físico del display es de 2 líneas de 16 caracteres alfanuméricos cada una.
Internamente se maneja una matriz de 2 x 64 caracteres en forma independiente del tamaño
físico.
Estos displays poseen 3 pines de alimentación, 3 pines de control y 8 pines de datos. Los
datos enviados al display pueden ser de 2 tipos: texto o control. El display posee un cursor
sobre el cual se va escribiendo el texto enviado en formato ASCII. Este cursor y la pantalla
pueden ser configurados y controlados mediante comandos de control. Por ejemplo, el
cursor puede ser configurado para moverse automáticamente hacia la derecha después de
escribir un carácter, también puede estar encendido, apagado o parpadeando y puede
moverse hacia cualquier posición de la pantalla, etc.
El conexionado básico de un display LCD de esta familia se muestra en la figura 4.1.
Una descripción detallada del funcionamiento de los displays LCD se encuentra en el
documento AlphanumericAppNotes.pdf, incluyendo diagramas temporales (página 4), tipos
de comandos (página 5) y tabla de caracteres ASCII soportados (página 9).
Una característica importante en el manejo del display es que cada vez que se envía un
comando o texto, la ejecución de esta acción demora cierto tiempo, lo que también es válido
para las lecturas desde el display. Durante este tiempo el display ignorará el envío de otros
comandos, por lo que se suele incluir una rutina de retado después (o antes) de del envío de
un comando.
Lab. 04 / 23-09-2008
Pág. 1 de 4
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores
Segundo Semestre 2008
+5
10k 1k
LCD
GND
+5V
Vo
RS
R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
BL+
BL-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+5
RS
RW
EN
DATA[0..7]
10k
10k
10k
10k
10k
10k
10k
+5
10k
LCD_DISPLAY
Figura 4.1: Señales de Interconexión Display LCD
Una forma más eficiente en la operación con el display es comprobar su estado mediante
una encuesta del bit 7 (BusyFlag) del comando Read-Busy-Flag&Address. De
esta manera se puede saber si el display ha terminado la ejecución de una instrucción. La
lectura del Busyflag se implementará en el último punto del laboratorio. Para comenzar,
se utilizarán rutinas de retardos suficientemente grandes como para asegurar el correcto
funcionamiento del display.
4.3 Trabajos Previos
a) Leer el documento AlphanumericAppNotes.pdf para interiorizarse del funcionamiento
del display LCD que se utilizará en el laboratorio.
b) Modifique y complemente el archivo display.c de tal manera de disponer de las siguientes
rutinas (recuerde introducir los retardos adecuados):
•
void udelay(unsigned int x)
Esta rutina produce un retardo de ‘x‘ microsegundos. Esta rutina deberá ser calibrada
en el laboratorio, para ello configure el Timer B con el reloj más rápido que pueda
y compare el valor del registro TBR antes y después de llamar a esta rutina. Esta
diferencia corresponde al tiempo de ejecución de la rutina. Para crear esta rutina se
puede utilizar la operación asm(“NOP”); que tiene una duración de un ciclo de
máquina lo que para un reloj de 8 [MHz] equivale a 125 [ns].
•
void send_cmd(unsigned char value)
Rutina que envía el commando ‘value’ al display. Utilice el diagrama temporal de la
página 4 del documento AlphanumericAppNotes.pdf.
Lab. 04 / 23-09-2008
Pág. 2 de 4
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores
Segundo Semestre 2008
•
void init_display(void)
Esta rutina deberá inicializar el display LCD en modo 8 bits, 2 líneas, corrimiento
hacia la derecha y mostrar el cursor. Utilice el diagrama que aparece en la página 12
del documento AlphanumericAppNotes.pdf
•
void send_data(char value)
Esta rutina envía el dato especificado en ‘value’ al display.
•
unsigned char get_pos(void)
Esta rutina retorna la posición del cursor.
•
char get_data(void)
Esta rutina retorna el contenido de la posición actual del cursor.
c) Defina una variable global ‘sec’ de tipo unsigned int, que se inicialice en cero y
que se incremente exactamente cada un segundo, utilizando para ello el Timer A,
alimentado por la señal de reloj ACLK, la cuál utiliza el cristal X1 de 32,768 [KHz].
+3V
+5
10k 1k
LCD
GND
+5V
Vo
RS
R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
BL+
BLLCD_DISPLAY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+5
RS
RW
EN
DATA[0..7]
10k
10k
10k
10k
10k
10k
10k
+5
10k
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
U?
DVcc
AVcc
P6.3/A3
DVss
P6.4/A4
AVss
P6.5/A5
P6.2/A2
P6.6/A6/DAC0
P6.1/A1
P6.7/A7/DAC1/SVSIN
P6.0/A0
Vref+
RST/NMI
XIN
TCK
XOUT/TCLK
TMS
Veref+
TDI/TCLK
Vref-/VerefTDO/TDI
P1.0/TACKL
XT2IN
P1.1/TA0
XT2OUT
P1.2/TA1
P5.7/TBOUTH/SVSOUT
P1.3/TA2
P5.6/ACLK
P1.4/SMCLK
P5.5/SMCLK
P1.5/TA0
P5.4/MCLK
P1.6/TA1
P5.3/UCLK1
P1.7/TA2
P5.2/SOMI1
P2.0/ACLK
P5.1/SIMO1
P2.1/TAINCLK
P5.0/STE1
P2.2/CAOUT/TA0
P4.7/TBCLK
P2.3/CA0/TA1
P4.6/TB6
P2.4/CA1/TA2
P4.5/TB5
P2.5/Rosc
P4.4/TB4
P2.6/ADC12CLK/DMAE0
P4.3/TB3
P2.7/TA0
P4.2/TB2
P3.0/STE0
P4.1/TB1
P3.1/SIMO0/SDA
P4.0/TB0
P3.2/SOMI0
P3.7/URXD1
P3.3/UCLK0/SCL
P3.6/UTXD1
P3.4/UTXD0
P3.5/URXD0
64
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
MSP430F1612
Figura 4.2: Conexión Display LCD y MSP
Lab. 04 / 23-09-2008
Pág. 3 de 4
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores
Segundo Semestre 2008
En el Laboratorio.
4.1
Implemente la rutina udelay(x) para generar retardos de ‘x’ microsegundos.
Calibre la rutina de tal manera de que udelay(1000) produzca un retardo de 1 [ms]
medido con el osciloscopio.
4.2
Conecte el microcontrolador según se muestra en la figura 4.2. Diseñe un programa
que escriba una línea de texto en el display LCD utilizando la función printf().
Para ello incluya el archivo display.c en el proyecto y redefina la función
putchar() como sigue:
int putchar(unsinged int c)
{
send_data( (unsigned char) c );
udelay(50);
return 1;
}
4.3
Modifique la rutina putchar() para interpretar el caracter ‘\n’ como un comando
de nueva línea. Cuando este comando aparezca, la rutina debe copiar el texto de la
línea 2 en la línea 1 (scroll), y luego borrar la línea 2 (similar a presionar ‘enter’ en
una ventana de DOS). Utilice el Timer B con la señal ACLK como fuente de reloj,
para que cada 0.5 segundos se invoque a la siguiente rutina:
int lines = 0; // variable global
void new_line(void)
{
printf(“\nLinea %d”, lines++);
}
4.4
Diseñe una rutina show_time(unsigned char p, unsinged int s) que
muestre en la posición ‘p’ del LCD, el argumento ‘s’ en minutos y segundos en el
formato mm:ss, pero sólo si un pin de I/O (a elección) se encuentra en 1. Esta rutina
debe dejar el cursor del LCD en la misma posición que estaba antes de ser invocada.
Considerando el programa del punto anterior, incluya al final del main()
un
lazo
infinito
que
invoque
constantemente
a
la
rutina
show_time(0x4A, sec);
4.5
Modifique el retardo de 50 [us] generado por software en la rutina putchar() y los
retardos de las rutinas get_pos() y get_data() y cámbielos por una rutina
unsigned char wait_BF(void) que utilice el bit ‘BusyFlag’ para saber
cuando el display ha terminado de ejecutar un comando.
Lab. 04 / 23-09-2008
Pág. 4 de 4
Descargar