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