LCD-BootstrapAT91G1

= Integrantes = by by by

= Proyecto LCD=

Nota : sientanse libres de corregir ortografia, contenido y posibles imprecisiones que haya podido cometer.

Este proyecto consiste en utilizar la tarjeta de desarrollo CondorBoard, para vizualizar a traves de una pantalla LED un nivel de voltaje controlado a partir de un potenciometro. La idea de esta primera practica es familiarizarse con los pines disponibles en la tarjeta, asi como con la nomenclatura de registros necesaria para programar el microcontrolador de la tarjeta (AT91SAM9 ARM). Los documentos que necesitaran para este proposito los pueden encontrar en los siguientes links:

Si van a utilizar la pantalla LED de referencia, el siguiente es un link directo a el datasheet:

Datasheet de datasheetcatalog.com

Para programar el microporcesador necesitaran la aplicacion del Bootstrap, y su Application Note, que pueden encontrar en el siguiente link (escojan el segundo pdf):

AT91Bootstrap

Por ultimo, pueden encontrar el esquematico de la CondorBoard en el siguiente servidor, este archivo lo necesitaran para saber la correspondencia entre los pines de la tarjeta y los del micro :

[BOARD:CondorBoard_1_5]

= Diagrama de caja negra = El diagrama de caja negra, que se muestra a continuación, es bastante sencillo, pues solo tiene una entrada y una salida. La entrada consiste en un ajuste del potenciometro (un ángulo de rotacion de la perilla si se quiere), mientras que la salida consiste en una visualización en el display alfanúmerico (una barra de estado), que varia linealmente con respecto a la posición del potenciometro.

= Diagrama de Bloques = El diagrama de bloques correspondiente a la implementación del modulo LCD se muestra en la siguiente figura. Alli se pueden apreciar los bloques que conforman el sistema completo, incluidos los bloques internos que hacen parte del microcontrolador AT91SAM9EX256 y del display.

A continuación, se muestra la descripción de cada uno de los bloques:
 * Control: En este caso, el bloque de control se muestra en el diagrama de bloques por formalidad, pues en el proyecto no puede encontrarse un bloque de control como tal. Puede decirse que el bloque de control es la parte del codigo fuente que se encarga de configurar los demás bloques para que funcionen correctamente.
 * Conversión de Datos: Es el bloque encargado de tomar la señal analoga del potenciometro y convertirla en una señal digital que pueda ser procesada por el sistema.
 * Puerto Paralelo: El puerto paralelo o PIOB, es el bloque que se comunica con el modulo LCD, ya sea para enviarle los datos correspondientes a un caracter ASCII o un comando.
 * Controlador de display alfanumérico: Es el sistema digital que se encarga de tomar los datos correspondientes a un caracter ASCII o un comando y mostrar la informacion en el Display como tal.
 * Display: Es el soporte fisico que se compone de LEDs o segmentos de cristal liquido que se activan con las señales del controlador para formar caracteres entendibles.

= Componentes= En esta seccion se muestran los diferentes componentes que componen el sistema. Estos componentes se dividen en componentes software y componentes hardware.

Dispositivos Hardware

 * Tarjeta Condorboard
 * En la seccion Tarjetas de desarrollo>Condorboard 1.5 se puede encontrar información detallada sobre este componente.
 * Display LCD
 * Hoja de datos del controlador de LCD alfanúmerico HD44780U.

Herramientas Software

 * SAMBA
 * Herramienta que permite cargar los codigos a la memoria del microcontrolador
 * ARM Toolchain
 * Herramientas que permiten compilar el codigo que ha de ser cargado en el microcontrolador. En la seccion Tarjetas de desarrollo>Condorboard 1.5 se pueden encontrar instrucciones detalladas acerca de la instalación de estas herramientas.

=Configurar el AT91 =

Para la aplicacion que se quiere programar funcione correctamente, se debe configurar el microcontrolador para que "sepa" cuales de sus pines serán entradas y cuales serán salidas. Así mismo, algunos periféricos deben configurarse desde el PMC (power management controller) para que tengan una fuente de reloj. En este caso, PIOB ya se encontraba configurado en el archivo original del Bootstrap y, en cuanto al ADC, este no necesita de una configuración especial aparte de la del pin.

Configurar la pantalla LCD
La inicialización y configuración del display LCD alfanumérico consta de tres pasos básicos que se deben realizar desde el microcontrolador al momento del arranque del programa. Aunque en el datasheet se muestran cinco pasos (contando el encendido del display y la configuracion del modo de entrada), con los tres pasos que se resumirán a continuación suele ser suficiente para que el display funcione de manera adecuada, pues si se omite el paso de la configuracion del modo de entrada, el display usara el que tiene por defecto. Si desea obtener detalles sobre los comandos especificos que debe enviar al display para su correcta configuracion, remítase al datasheet del display listado en la bibliografía (página 209) o tambien puede referirse a la documentacion del codigo fuente.

Function set (a)
El paso correspondiente al funcion set, debe realizarse en dos etapas cuanto se maneja un bus de datos de cuatro bits pues se le debe decir al display que debe funcionar con cuatro bits de datos en lugar de ocho. En efecto, esta primera instrucción se interpreta como una instrucción de ocho bits.

Function set (b)
En este momento, el display ya ha sido configurado para funcionar con cuatro bits de datos. Ahora se debe configurar el numero de lineas que se usaran para mostrar el texto (una o dos lineas) y la resolución de 5x8 puntos o de 5x10 puntos.

Display on/off control
En este último paso se enciende el display para dejarlo preparado para recibir caracteres, también se puede encender o apagar el cursor y se puede activar o desactivar el blink del cursor.

Características del Conversor

 * Este conversor A/D está basado en un registro de aproximaciones sucesivas. Si desea conocer más acerca de este circuito, remítase a Circuitos Microelectrónicos. Sedra and Smith. 3rd Ed.


 * Cuenta con cuatro entradas análogas, haciendo posible la conversión de 4 canales dedicados exclusivamente a conversión simultáneamente. Cuenta con entradas adicionales configurables.


 * Su conversión se realiza en dos resoluciones configurables de 8 y 10 bits.


 * El resultado de la conversión para TODOS las entradas se guarda en un UNICO registro: ADC_LDCR, llamado ADC Last Converted Data Register, el cual guarda todos los datos convertidos . Para cada entrada dedicada, existe un registro: ADC_CDR0, ADC_CDR1, ADC_CDR2, ADC_CDR3.


 * Cuenta con la opción de disparo externo del conversor (Extern Trigger), adicional al disparo por software programado.


 * El rango de la señal análoga está entre 0 V y ADVREF, donde el pin ADVREF debe alimentarse con un voltaje positivo respecto de la tierra (GND) del microcontrolador.


 * Tiempo de inicio configurable; sample and hold time configurable (Para más detalles de estos tiempos, remítase a Sedra & Smith, 3rd Ed.). La configuración de los tiempos ha de revisarse en la página 789 de la hoja de datos (datasheet) del AT91SAM9XE128. Allí encontrará las ecuaciones necesarias para realizar los cálculos respectivos.


 * Posee un 'sleep mode' que permite ahorrar energía y reducir el trabajo del microprocesador.

Modos de Funcionamiento
Posee dos modos de funcionamiento: Modo normal y modo “dormido” (Normal and sleep mode). En modo normal, una vez el conversor es activado, la conversión se realiza indefinidamente. En modo dormido, la conversión se realiza una vez el conversor es activado, sin embargo una vez finaliza la conversión, no realiza conversiones hasta que se active otra vez el conversor.

Preguntas Frecuentes
¿Cómo activar el conversor? El conversor se puede activar (activar o disparar se refiere al mismo término, en este caso, disparar, en inglés corresponde a trigger) mediante Software y Hardware. Por Hardware habilitando el disparo por Hardware y empleando el pin ADTRIG o los timers internos del microcontrolador, o por software ajustando en '1' el bit de START del registro ADC_CR.

¿Se puede emplear el conversor con interrupciones? Sí. Sin embargo, las interrupciones del conversor Análogo-Digital se manejan con el Control Avanzado de Interrupciones (AIC). Por ende, cuando vayamos a emplear el conversor análogo-digital con interrupciones, debemos primero configurar el control avanzado de interrupciones (AIC) antes de configurar el conversor.

¿Dónde se almacena el resultado de la conversión? Existen dos registros, donde se guardan los resultados de las conversiones. El ADC_CDR y el ADC_LCDR. El ADC_CDR corresponde a el último dato convertido. El ADC_LCDR corresponde al penúltimo dato convertido.

En la aplicación que hemos empleado, se ha configurado el conversor análogo-digital en modo normal, con 10 bits de resolución, sin activación por hardware y se emplea el canal 0, de los canales dedicados a conversión.

Descripción de pines básicos
VDDANA: Corresponde al pin de alimentación del conversor Análogo Digital. Si se desea emplear el conversor análogo – digital, hemos de aplicarle un voltaje respecto de la tierra del microcontrolador de 3.3V.

ADVREF: Es el voltaje de referencia del microcontrolador. En otras palabras, es el voltaje máximo reconocido por el conversor, entregando una salida binaria de “11111111” para el caso de 8 bits y “1111111111” para el caso de 10 bits. Cuando se habla de salida, se refiere al registro ADC_CDR, donde se guarda el resultado de la conversión. Hay que recordar, que el voltaje mínimo es de 0V DC. Si desea conocer más acerca del significado del voltaje de referencia, remítase a Sedra & Smith, Circuitos microelectrónicos, 3rd Ed. Para la mayoría de aplicaciones, un ADVREF de 3.3 V es adecuado. Si desea emplear otro voltaje, es necesario remitirse a la hoja de datos del microcontrolador, en la cual se especifican las características y límites que han de emplearse en caso de variar este voltaje. Voltajes fuera de este rango no garantizan una conversión lineal.

AD0-AD3: AD0, AD1, AD2 y AD3 corresponden a los pines de entrada del conversor. Estos pines son dedicados, es decir, que sólo serán empleados por el conversor análogo digital. Ningún otro circuito de todo el microcontrolador puede acceder a ellos con otros fines más allá de la conversión. En estos pines, hemos de conectar una señal análoga  que se tiene que encontrar en el rango de 0V a ADVREF. Como se explicó antes, ADVREF corresponde al valor máximo de voltaje del conversor. Valores por encima de ADVREF pueden repercutir en el daño físico del microcontrolador. Es necesario revisar la multiplexación del microcontrolador, puesto qeu estos pines no aparecen como tal en el pinout. En este caso, hemos empleado el pin PC0, correspondiente al canal 0 CH0.

ADTRG: Pin de conexión de disparo externo (Extern Trigger). Si bien sabemos, la conversión puede ser iniciada por medio de la programación. Sin embargo, en alguna aplicación puede llegar a ser necesario activar (disparar) el conversor mediante una señal externa. En este pin, debe ser conectada la señal digital externa que queremos active el conversor. Hay que tener en cuenta que este pin puede ser usado por el microcontrolador para otros fines. Es necesario tener cuidado con la programación, especialmente en la configuración de los registros.

Descripción de registros
ADC_CR: ADC Control Register

BIT ajustados:

- SWRST= '0'  Con esta asignación, no tenemos efectos de reset. Si le dieramos un valor de '1', reseteraíamos el conversor, simulando un reset por Hardware.

- START = '1'     Con esta asignación, comenzamos el proceso de conversión. Como se está trabajando en modo normal, la conversión comienza y se realiza indefinidamente.

En éste registro, como se puede apreciar, tan sólo se realizó un ajuste de los 2 anteriores bits.

ADC_MR: ADC Mode Register

TRGEN = '0'    Con esta asignación, deshabilitamos los disparos por HW.

TRGSEL  Se deja por defecto.

LOWRES = '0'   Con esta asignación, habilitamos la resolución de 10 bits del conversor.

SLEEP = '0'  Con esta asignación, el conversor trabajará en modo normal.

Los demás parámetros del registro se dejan tal y como están.

ADC_CHER: ADC channel Enable Register

CH0 = '1'   Con esta asignación, habilitamos el canal cero. (CH0)

Como no se necesitan más conversiones, dejamos el resto del registro como está.

ADC_CHDR: ADC Channel Disable Register

Al no existir la necesidad de deshabilitar el canal, no fue modificado.

ADC_CHSR: ADC Channel Status Register

Este registro nos indica el estado de ls canales, es decir, si se encuentran activados o si por el contrario no lo están.

ADC_SR: ADC Status Register 

Este registro nos indica el estado general del conversor. Entre los datos que se pueden leer de este registro, se encuentra el EOx: que nos indica si finalizó la última conversión o no. También existe el DRDY el cual nos indica si se ha convertido un dato o no desde la última lectura del ADC_LCDR. Existen también bits que indican errores. Para más información, revisar la Pág. 783 de la hoja de datos del microcontrolador.

ADC_LCDR: ADC Last Converted Data Register

Éste registro será del cual se tome el valor digital correspondiente al valor análogo a la entrada. Es decir, la salida del circuito.

ADC_IER: ADC Interrupt Enable Register

Mediante la habilitación de cada bit, se habilita la respectiva interrupción. Recordar que hay que configurar el Control avanzado de interrupciones antes de utilizar las interrupciones generadas por el ADC.

= Código fuente = Para la implementación de este proyecto se programo un solo archivo en lenguaje C con todas las funciones necesarias.


 * Archivo condorboard.c del bootstrap con las modificaciones necesarias para que corriera el codigo que se programo.

= Resultados = El resultado del sistema completo funcionan, puede verse en el siguiente video. En general, se logro hacer que el sistema funcionara de acuerdo a las especificaciones dadas exceptuando el hecho de que se aprecia un pequeño efecto de Blinking cada vez que se actualiza el display con una nueva medida del conversor analogo digital.

y9eB7e9Tt4E

Análisis de resultados
En general, los resultados fueron los que se esperaban pues se logró generar en la pantalla LCD una barra de estado que varía linealmente en función de un voltaje medido en el canal 0 del conversor análogo/digital del microcontrolador que compone la CondorBoard v1.5. Aunque hubiese sido ideal obtener un resultado cercano a la perfección, no se logró controlar fácilmente el efecto de "blinking" que se da en la pantalla pues se debe introducir una pausa relativamente larga antes de actualizar la pantalla con los datos. Esto es debido a la elevadísima frecuencia de reloj de la CondorBoard que es mayor, en varios ordenes de magnitud, a la velocidad requerida por la LCD para funcionar correctamente.

Trabajos futuros
Aunque parece sencillo, controlar un LCD alfanúmerico tiene una cierta dificultad, pues se debe seguir un proceso estructurado para inicializar, configurar y mostrar texto en el mismo. Para trabajos futuros, se pueden tomar las funciones de inicialización, configuración y presentación de texto, y ponerlas en una libreria que facilite el uso del display para aplicaciones futuras.

Por otro lado, la implementación del conversor analogo/digital que se hizo en esta practica puede resultar util cuando se requiera controlar un actuador mediante el potenciometro. Por ejemplo, se podria usar esta implementacion del ADC para realizar un control de posición sobre un servomotor, o se podria variar, de manera eficiente mediante PWM, la velocidad de un motor DC.

= Bibliografía =


 * Datasheet del controlador de LCD alfanúmerico HD44780U - Hitachi


 * Datasheet del Microcontrolador AT91SAM9XE256 - Atmel