jueves, 15 de diciembre de 2011

Representar Mensaje en LCD



Buenas a todos, en esta práctica os voy a dar las directrices para poder escribir mediante nuestro soporte xilinx un mensaje de texto. Puesto que para poder visualizarlo vamos a precisar de un LCD, en este caso alfanumérico, mi consejo es que comencemos estudiando el LCD que vamos a utilizar. Esto lo digo porque cada LCD tiene sus propias conexiones y características, y por tanto, diferentes maneras de comunicarse. Este es un pequeño listado de las características.
Pantalla de cristal líquido con una matriz de 2 x 16 caracteres de 5 x 7 píxeles.
Microcontrolador propio de gobierno. (Hitachi μC44780)
Desplazamiento de los caracteres hacia la izquierda o hacia la derecha.
Proporciona la dirección de la posición absoluta o relativa del carácter.
Memoria de 40 caracteres por la línea de pantalla.
Movimiento del cursor y cambio de aspecto.
8 caracteres programables por el usuario.
Conexión a un procesador usando interfaz de 4/8 bits.
Además, os muestro su forma de conexión física.


VSS.- Patilla de GND de alimentación.
VCC.- Patilla de alimentación de +5V.
VEE.- Patilla de contraste del cristal líquido. Normalmente, se conecta a un potenciómetro a través del cual se aplica una tensión variable entre 0 y +5V que permite regular el contraste del cristal líquido.
RS.- Selección del registro de control/datos:
RS=0 Registro de control.
RS=1 Registro de datos.
R/W.- Señal de lectura/escritura:
R/W= 0 EL módulo LCD es escrito.
R/W= 1 EL módulo LCD es leído.
E.- Señal de activación del módulo LCD:
E=0 Módulo desconectado. Las líneas D0-D7 quedan en estado de alta impedancia.
E=1 Módulo conectado.
D0-D7.- Bus de datos bidireccional. A través de estas líneas se realiza la transferencia de información entre el módulo LCD y el sistema de control.



En definitiva nuestro proceso de trabajo se va a basar en un diagrama de estados que irá realizando unas funciones en un orden determinado y hará que se escriba en nuestra pantalla del lcd un mensaje. En este caso “GABRIEL ALLENDE © 2011”.
El protocolo a seguir es el siguiente:
-Secuencia de inicio
-Pantalla ON/OFF
-Cursor a casa
-Escritura en la primera línea
-Salto de línea
-Escritura en segunda línea
Una vez conocemos el protocolo, será el momento de comenzar con la creación del proyecto.
Para eso, como siempre abrimos xilinx y le damos a “file”, “new Project”, y creamos una fila del tipo esquemático y la guardamos en la ruta que deseemos. Después nos pedirá la configuración de los parámetros principales, que deberéis copiar de aquí.



Una vez tengamos el proyecto creado tendremos que añadirle las fuentes. En este caso le vamos a añadir un esquema. Por lo que daremos botón derecho “new source” y seleccionaremos esquemático, en la que meteremos los dos contadores. Y también le añadiremos otra fuente que será un diagrama de estados. Por lo que para eso, daremos botón derecho y marcaremos “new source”, elegiremos state diagram y listo.
Ya tenemos nuestro proyecto con nuestras dos fuentes creadas. Ahora nos meteremos en el diagrama de estados del LCD (state cad), para ir construyendo nuestro proceso de máquina de estados.
En primer lugar una vez estemos dentro del state cad, lo que tendremos que hacer es ir incorporando todas las variables que pretendemos utilizar. Mi consejo es que guardéis un orden, puesto que son muchas variables a introducir y va a ser fácil perderse.


Si echáis un vistazo, veréis que tanto el reset como el three state están en bajo activo, no es ningún fallo funcionen en bajo activo, son las salidas con registros.
Una vez tengamos declaradas las variables, será el momento de empezar a desarrollar el diagrama de estados, que es bastante extenso. En primero lugar lo que haré será ir explicándolo por partes.
La secuencia de inicio:



Ignorar los 3 estados tachados por la línea roja, así como el amarillo de más a la izquierda. Esos no son elementales para el inicio. Esta parte va desde el estado 0 hasta el 9, haciendo un salto del 5 al 9.
Vamos por partes.
Estado 0:
Como veis, todos los elementos declarados dentro del estado, están a cero. Sin embargo, si recordáis, el “three state” trabaja en bajo activo y por tanto, está activado, esto se traduce a que las salidas del autómata quedan en alta impedancia. Además de eso, le añadimos un reset, también en cero, porque trabaja en bajo activo.


Pasamos al siguiente estado sin ninguna condición.
Estado 1:
En este caso ponemos el reloj registro en 1 para aumentar la cuenta en el contador de comandos. 


Pasamos al estado 2 sin condiciones.

Estado 2:
Ponemos el “habilitar” en uno para activar el LCD y el “read write” para hacer que se ponga en lectura.


Pasamos  al estado 3 sin condiciones.




 
Le ponemos igual que el estado anterior solo que añadimos  una condición por la cual si “D7_I=’1’” permanecerá en ese estado.
Pasamos al estado 4 si “D7_I = ‘0’  “.
Estado 4:



En el estado cuatro pasamos al cinco 3 veces seguidas para hacer la función de secuencia de inicio que necesita el LCD para activarse.
Estado 5:


Mantenemos el Three state a 1 y el habilitar al 1 también.
Pasamos al estado 9 sin condiciones.
Recordemos que, como dije anteriormente, tenemos que hacer la llamada 3 veces, esta llamada para saber si han sido realmente 3 veces, hemos utilizado un contador de 5 bits. De no ser así, volveremos al estado 0.




Bien, puesto que podemos pasar del 9 al 0 por lo que os acabo de decir, las transiciones  serán las siguientes. Es decir, vamos al estado cero cuando…
 [Q0_R='1' & Q1_R='0' & Q2_R='0'] ó
 [Q0_R='0' & Q1_R='1' & Q2_R='0'] ó
 [Q0_R='1' & Q1_R='1' & Q2_R='0'].
Vamos a dar un pequeño paso para atrás. En el ESTADO 4, vamos a abrir unas cuantas transiciones que antes me salté para no interferir en el proceso de inicio. Desde el estado cuatro sacaremos una transición que vaya a un estado que deje la pantalla encendida, el cursor en ON y el parpadeo del cursor en ON. En este caso el estado 6. La transición que hay entre el estado 4 y el 6 es esta:” Q0_R='0' & Q1_R='0' & Q2_R='1' ”





Del estado 6 al 9 pasaremos sin incorporar ninguna transición.
Haremos algo parecido con el estado 7, en su caso, el objetivo de este estado es mandar el cursor a casa. (Para los que no lo entiendan es hacer que el cursor vaya al inicio del LCD es decir, a la parte superior izquierda de la pantalla).





Lo que se encuentra en el recuadro rojo es la condición entre el estado 4 y el 7. Del 7 al 9 pasamos sin condiciones.
Después nos vamos al estado 10. Este va a ser un estado que va a recoger muchas transiciones. En él pondremos la salida del reloj_dato en 1. Con esto incrementamos la cuenta de datos del contador.


Del 10 pasamos al 11 sin condiciones. 






En él habilitamos el LCD y lo ponemos en modo lectura.
El estado 12 es igual que el 11, solo que lleva consigo una transición que tiene inicio y fin en el mismo estado 12. La condición es  “D7_I=’1’ “. Con esto evitamos que se pase al estado 13 si la máquina se mantiene  ocupada.
Ahora viene uno de los estados más importantes de todos. El estado 13 es el que se “comunica” entre todos los caracteres del LCD. Contando también los espacios. 





En él activamos el “rs” es decir el modo de dato. Una vez tengamos esto es hora de comunicar este estado con todos los caracteres. Como las transiciones son un número bastante grande, voy a copiar primero las de la primera línea:
Al STATE14 si [Q0_D='1' & Q1_D='0' & Q2_D='0' & Q3_D='0' & Q4_D='0']
al STATE15 si [Q0_D='0' & Q1_D='1' & Q2_D='0' & Q3_D='0' & Q4_D='0']
al STATE16 si [Q0_D='1' & Q1_D='1' & Q2_D='0' & Q3_D='0' & Q4_D='0']
al STATE17 si [Q0_D='0' & Q1_D='0' & Q2_D='1' & Q3_D='0' & Q4_D='0']
al STATE18 si [Q0_D='1' & Q1_D='0' & Q2_D='1' & Q3_D='0' & Q4_D='0']
al STATE19 si [Q0_D='0' & Q1_D='1' & Q2_D='1' & Q3_D='0' & Q4_D='0']
al STATE20 si [Q0_D='1' & Q1_D='1' & Q2_D='1' & Q3_D='0' & Q4_D='0']
al STATE21 si [Q0_D='0' & Q1_D='0' & Q2_D='0' & Q3_D='1' & Q4_D='0']
al STATE22 si [Q0_D='1' & Q1_D='0' & Q2_D='0' & Q3_D='1' & Q4_D='0']
al STATE23 si [Q0_D='0' & Q1_D='1' & Q2_D='0' & Q3_D='1' & Q4_D='0']
al STATE24 si [Q0_D='1' & Q1_D='1' & Q2_D='0' & Q3_D='1' & Q4_D='0']
al STATE25 si [Q0_D='0' & Q1_D='0' & Q2_D='1' & Q3_D='1' & Q4_D='0']
al STATE26 si [Q0_D='1’ & Q1_D='0' & Q2_D='1' & Q3_D='1' & Q4_D='0']
al STATE27 si [Q0_D='0' & Q1_D='1' & Q2_D='1' & Q3_D='1' & Q4_D='0']
al STATE28 si [Q0_D='1' & Q1_D='1' & Q2_D='1' & Q3_D='1' & Q4_D='0']
al STATE29 si [Q0_D='0' & Q1_D='0' & Q2_D='0' & Q3_D='0' & Q4_D='1']
Estas serían las transiciones de todos los estados que componen la primera línea. Ahora, dentro de cada estado, vamos a tener que ir escribiendo los caracteres. Para eso haremos uso de una tabla para conocer los códigos de cada letra. Esta tabla me la mostró un amigo de clase, para mi gusto, la que mejor se entiende.





Yo aproveché y directamente me construí una tabla en la que iba metiendo los caracteres que necesitaba, para hacerlo directamente, pero por desgracia no la encuentro. 



Esto sería un ejemplo de parte de los caracteres. Dependiendo que salidas activemos formaremos un código y, por tanto, una letra. En mi caso añadí con espacios la parte de arriba que me sobraba para que bajara a la siguiente línea, digamos que este método es más trabajoso, pero una vez que ya llevas un rato haciendo el código se va a piñón fijo, añades espacios hasta que baje y escribes después, listo. Una vez tengamos todas, pasamos al estado 38 sin ninguna condición. Como os muestro en la imagen.


Del 38 pasamos al estado 39 sin ninguna condición. Y por último añadiremos el estado  40, en el cual activaremos el “puesta a 0”. En este estado se reinician los contadores para no perder el control del programa. Una vez tengamos esto, ya habremos acabado nuestra máquina finalizada.
Como siempre ahora toca llevar el proceso de “verificación de funcionamiento”, mediante el testeo de estados.



Una vez veamos que nuestro programa ha pasado por todos y cada uno de los estados, significa que nos funciona y entonces pasaremos a generar el VHDL.


Una vez le demos, nos saldrá el código del programa y nos dirá que la compilación se realizó con éxito.
Entonces pasaremos a incorporar el código. Para eso botón derecho desde el ISE, “Add existing sources”, con esto meteremos el código VHDL anteriormente elaborado  y crearemos  un nuevo símbolo con “create a schematic symbol”.
Tendremos que diseñar un esquemático bastante complejo en el que están los 2 contadores, así como la máquina de estados, la cual, ahora, tiene su código Vhdl integrado. Este sería el diseño del esquemático.
Está compuesto por los siguientes componentes.

-Dos contadores, uno de 4 bits (CB4CE) y otro de 8 bits(CB8CE).
-1 BUFG
-8 OBUFT
-8 IBUF
-1 INV
-1OR
-1AUTOMATA LCD1
-8 BUFT


 
Una vez que tengamos acabado nuestro esquemático con todos los componentes, es hora de pasar al entorno PACE, por eso, abriremos el archivo con extensión UCF. Con eso, colocaremos como deseemos nuestros pines y ya estaría finalizado.


Ya nos encontramos en el punto final, es decir, al tener todos los archivos, esquemático, el diagrama de bloques, tener integrado el vhdl en la máquina y demás, ya será hora de darle a “generate pogramming file” para que nos genere el JED y ya está acabado. Espero que os halla servido de ayuda.  UN SALUDO!



AQUÍ LA DESCARGA

No hay comentarios:

Publicar un comentario