Practica1 FENDER
Practica1 FENDER
Practica1 FENDER
Facultad de Ingeniera
Dispositivos de Control
Practica 1: Programacin Bsica con el LCD
Equipo: FENDER
Integrantes: Coln Amador, Diana Monserrat. May Tzuc, Oscar de Jess. Gngora Nio, Sergio.
Profesor: M en C. Mauricio Romero.
OBJETIVO: Usar una pantalla LCD para visualizar informacin y como medio de depuracin de aplicaciones, tanto en C como en Ensamblador. INTRODUCCIN. El LCD es una herramienta muy til y econmica, no solo para el despliegue de informacin, sino tambin para el proceso de depuracin durante el desarrollo, ya que nos permite desplegar resultados parciales o usarlo para monitorear los procesos y variables dentro de nuestra aplicacin.
Actualmente los displays de LCD ms usados se basan en el protocolo estndar del manejador de LCD Hitachi HD44780. Este driver puede manejar displays de hasta 8 lneas y 40
caracteres. Este manejador puede ser usado con dos interfaces diferentes de 4 y 8 bits, siendo la ultima ms rpida a costa de usar ms terminales de E/S. El PSoC Designer nos proporciona una API estndar para el manejo de LCDs basados en este chip, de 2 lneas y 16 caracteres; Sin embargo, es posible usarla con otros displays ms grandes, con la nica restriccin de que no podremos usar directamente las barras graficas. Para Conectar el LCD, el PSoC utiliza 7 bits de un puerto, ya que utiliza la interfaz de 4 bits del controlador para ahorrar pines. El octavo bit del puerto podemos usarlo para controlar el LED del panel trasero de nuestra pantalla en caso de tenerlo, usando mscaras en el bit 7 del puerto, o usando un mdulo de LED dentro del PSoC Designer. Conexiones. Para nuestra primera prctica conectaremos la pantalla al puerto 2 del PSoC de acuerdo al siguiente diagrama: El Potencimetro o Preset puede tener cualquier valor en el rango de 10KOhms a 100KOhms. Este valor no es crtico ya que su nica funcin es establecer el nivel de contraste deseado para la pantalla. Si no deseamos variarlo, podemos fijar su valor usando 2 resistencias fijas. En caso de que nuestro LCD tenga luz trasera, la conectaremos a la terminal 7 del puerto 2. EL PSoC se conecta al programador por medio de 5 terminales: Alimentacin (Vdd), Tierra (GND), Reset (XRES), SCLK (P1.0) y SDATA (P1.1). De estas 5 terminales el reset es opcional, y se suele utilizar cuando queremos programar un micro que tiene alimentacin aplicada. El Programador del PSoC puede proporcionarnos alimentacin de 5 volts para nuestro circuito, sin embargo se debe tener cuidado de que la corriente del circuito no exceda los 120mA, y desconectar las terminales de programacin SCLK y SDATA durante la operacin del circuito si las usamos dentro de nuestra aplicacin para alguna funcin, ya que de lo contrario podramos daar el programador.
DESARROLLO Se sigue el procedimiento descrito en el protocolo de prctica para la creacin de un primer programa usando la LCD, y se desarrollan los siguientes ejemplos para el lenguaje C:
1.a.- Escribe el cdigo que se muestra a continuacin, complalo, progrmalo en la tarjeta y contesta las preguntas:
// part specific constants and macros // PSoC API definitions for all User Modules
const char Cadena1[]="Cadena en ROM"; char Cadena2[]= "Cadena en RAM"; void main(void) { LCD_Start(); LED_Start(); LCD_Position(0,0); LCD_PrCString(Cadena1); LCD_Position(1,0); LCD_PrString(Cadena2); }
1.- Explica Que hace este programa. Este programa imprime en una pantalla LCD dos cadenas de textos, una guardada en la memoria RAM y la otra en la memoria ROM del microcontrolador. 2.- Que diferencia hay entre las lneas 16 y 18, y como se relacionan estas con las lneas 8 y 9? Funcionaran si se cambia la forma de declarar las cadenas? Explica tus Respuestas. Las instrucciones en las lneas 8 y 9 se utilizan para generar cadenas de textos. Las instrucciones en las lneas 16 y 18 se emplean para imprimir el texto en una pantalla LCD. La diferencia entre las lneas de impresin de texto (16 y 18), es que la primera se utiliza para imprimir datos provenientes de la memoria RAM (lnea 9), y la segunda imprime datos que se encuentran guardados en la memoria ROM (lnea 8). Si se llegara a cambiar el orden marcara un error de compilacin. 3.- En el Caso de que la Pantalla lleve un LED, Que tendra que poner para que se encendiera? Eso depende la configuracin que se le de al LED: Si en los parmetros el Drive del LED est en modo High, es necesario escribir LED_On. Si en los parmetros el Drive del LED est en modo Low, no es necesario escribir algn otro comando.
// part specific constants and macros // PSoC API definitions for all User Modules
char caracter= -64; unsigned char Ucaracter= 65; int entero= 1625; void main(void) { LCD_Start(); LED_Start(); LCD_Position(0,0); LCD_PrHexByte(caracter); LCD_WriteData(' '); LCD_PrHexByte(Ucaracter); LCD_WriteData(' '); LCD_PrHexInt(entero); }
4.- Escribe y Explica la salida del Programa. El programa visualiza por medio de una LCD valores en hexadecimal de tres tipos diversos de datos: una cadena de byte, una cadena de byte sin signo y un nmero entero. Tal y como se aprecia en la siguiente tabla:
Entrada Salida
-64 65 1625 FFFFFFC0 41 0659
5.- Explica con tus palabras para que sirven las funciones LCD_PrHexByte, LCD_PrHexInt y LCD_WriteData. LCD_PrHexByte: Imprime bytes (nmeros), en cadenas de texto en cdigo hexadecimal. LCD_PrHexInt: Imprime nmeros enteros en una pantalla LCD, en cdigo hexadecimal. LCD_WriteData: Imprime los caracteres guardados en la memoria ROM del LCD, generalmente valores en ASCII.
Hay que tomar en cuenta que LCD_PrHexByte, imprime nicamente dos caracteres, lo cual se puede corroborar observando que el valor de -64 imprimi nicamente los 2 digitos menos significativos. De la misma forma para la instruccin LCD_PrHexInt, esta imprime cuatro caracteres, por lo cual en nuestra pantalla se llena el cuarto carcter con un cero.
// part specific constants and macros // PSoC API definitions for all User Modules
char cadena[10]; int entero= -1625; long enterolargo=0x8DEEFFFF; void main(void) { LCD_Start(); LED_Start(); LCD_Position(0,0); LCD_PrString(itoa(cadena,entero,10)); LCD_WriteData(' '); LCD_PrString(ltoa(cadena,enterolargo,10)); LCD_Position(1,0); LCD_PrString(utoa(cadena,entero,10)); LCD_WriteData(' '); LCD_PrString(ultoa(cadena,enterolargo,10)); }
6.- Escribe y Explica la salida del Programa, y para que sirven las funciones itoa, ltoa, utoa y ultoa. Este cdigo nos muestra el procedimiento para cadenas de datos, visualizndolos en LCD. convertir cierto de tipo de valores numricos a
7.- Investiga en la documentacin en el archive C Language Compiler User Guide ms acerca de estas funciones, investiga cual es la funcin que me permite imprimir nmeros con punto decimal, y haz un programa ejemplo que me imprima una variable flotante llamada MyPI con valor 3.141592. Escribe el cdigo del Programa.
#include <m8c.h> #include "PSoCAPI.h" #include "stdlib.h" #include "string.h" #define _FTOA_TOO_LARGE #define _FTOA_TOO_SMALL char valor[]="MyPI = "; void main(void) { float MyPI; int estado; char*nuevo; MyPI= 3.141592;
// part specific constants and macros // PSoC API definitions for all User Modules -2 -1
Se procede a crear un nuevo proyecto llamada Practica1b, y seleccionamos la opcin de compilacin en ensamblador. Y se realizan los siguientes ejemplos:
1.b.- Escribe el cdigo que se muestra a continuacin, complalo, progrmalo en la tarjeta y contesta las preguntas:
include "m8c.inc" include "memory.inc" include "PSoCAPI.inc" ; part specific constants and macros ; Constants & macros for SMM/LMM and Compiler ; PSoC API definitions for all User Modules
export _main area bss(RAM) ;directiva usada cuando la variable tiene que ser declara en RAM VarStr: blk 17 ;separo 17 bytes para una cadena en RAM de 16 caracteres+el null area text(ROM,REL);es la directiva usada cuando el cdigo est escrito. Despus de ;usar el "rea bss (RAM)" y declaracin de variables " rea ;txt(rom)" tiene que ser utilizado antes de entrar en el cdigo. _main: call LCD_Start ;iniciamos la LCD call LED_Start ;iniciamos el LED call LED_On mov[VarStr],'H' ;iniciamos la cadena. mov[VarStr+1],'o' mov[VarStr+2],'l' mov[VarStr+3],'a' mov[VarStr+4],' ' mov[VarStr+5],'M' mov[VarStr+6],'u' mov[VarStr+7],'n' mov[VarStr+8],'d' mov[VarStr+9],'o' mov[VarStr+10],0x00 mov A,00h mov X,00h call LCD_Position mov A,>VarStr mov X,<VarStr call LCD_PrString ;imprimimos la cadena RAM mov A,01h ;indicamos fila 1 para la LCD mov X,00h call LCD_Position mov A,>TablaRom mov X,<TablaRom call LCD_PrCString .terminate: jmp .terminate .literal TablaRom: asciz "Cadena ROM" .endliteral
; ; ; ;
;indicamos col 0 para la LCD indicamos que son las coordenanadas en la LCD Parte alta de la direccin de la tabla en ROM Parte baja de la direccin de la tabla en ROM Imprime la cadena constante en ROM
8.- Que Hace este Cdigo? Cul es la diferencia entre LCD_PrString y LCD_PrCString? Imprime en la parte superior una cadena de caracteres guardados en la memoria RAM, mientras que en la parte inferior imprime texto ubicado en la memoria ROM del microcontrolador. La diferencia entre ambas instrucciones es la misma que en el lenguaje C, la primera se utiliza para datos en la memoria RAM, mientras que la segundo para los datos en la ROM. 9.- Porque es necesaria la lnea mov A,>VarStr y Cmo Afecta la funcin LCD_PrString a mi programa, en cuanto a posibles conflictos que puede generar? Es el mtodo que utiliza el compilador en lenguaje ensamblador para imprimir cadenas de caracteres, ya que es necesario dividir la parte alta y parte baja de lo contrario existira un error en la compilacin. El registro X y el acumulador pueden ser modificados debido a implementaciones actuales o implementaciones futuras de la funcin LCD_PrString. Lo mismo pasa para todas las variables o punteros en RAM registrados en el modelo de memoria larga. Cuando sea necesario, la funcin puede preservar los valores de los registros o variables en RAM a travs de llamadas a funciones fastcall16. 2.b.-Ahora crea el cdigo:
include "m8c.inc" include "memory.inc" include "PSoCAPI.inc" ; part specific constants and macros ; Constants & macros for SMM/LMM and Compiler ; PSoC API definitions for all User Modules
export _main area bss(RAM) MyVar: blk 1 area text(ROM,REL) _main: call LCD_Start call LED_Start call LED_On mov [MyVar],52 mov A,00h mov X,00h call LCD_Position mov A,>Tablarom mov X,<Tablarom call LCD_PrCString mov A,0 mov X,6 call LCD_Position mov A,[MyVar] call LCD_WriteData mov A,0 mov X,13 call LCD_Position mov A,[MyVar] call LCD_PrHexByte .terminate: jmp .terminate
10.- Es posible imprimir nmeros en formato decimal haciendo uso de LCD_PrHexByte? Explica tu respuesta. No, ya que este nicamente imprime los dos nmeros menos significativos en lenguaje hexadecimal. 11.- Que ventajas nos proporciona imprimir usando LCD_WriteData a usar LCD_PrString? La ventaja del LCD_WriteData es que nos permite imprimir un solo carcter proveniente de Ascii y asi poder ocupar menos espacio en la memoria. 3.b Ahora vamos a crear un pequeo programa que haga uso de los comandos internos del LCD. Consulta la Hoja de Datos del LCD para poder seguir el programa.
include "m8c.inc" ; part specific constants and macros include "memory.inc" ; Constants & macros for SMM/LMM and Compiler include "PSoCAPI.inc" ; PSoC API definitions for all User Modules BorrarLCD: equ 0b00000001 GoHome: equ 0b00000010 SetDDRAM_Addr: equ 0b10000000 ; Seleccionar direccin de la memoria de despliegue del LCD export _main area bss(RAM) MyVar: blk 1 ; Separo 1 byte para una Variable en ram area text(ROM, REL) _main: call LCD_Start call LED_Start call LED_On mov A, BorrarLCD call LCD_Control ; Borra el LCD mov A, SetDDRAM_Addr call LCD_Control ; Me pongo en la primera Posicin del LCD (Direccion 0x00) mov A,>TablaRom1 ; Parte alta de la direccin de la tabla en ROM mov X,<TablaRom1 ; Parte baja de la direccin de la tabla en ROM call LCD_PrCString ; Imprime la cadena constante en ROM mov A, SetDDRAM_Addr | 0x40 call LCD_Control ; Me pongo en la primera Posicin de la segunda linea del LCD (Direccion 0x40) mov A,>TablaRom2 ; Parte alta de la direccin de la tabla en ROM mov X,<TablaRom2 ; Parte baja de la direccin de la tabla en ROM call LCD_PrCString ; Imprime la cadena constante en ROM mov A, 0b00001111 call LCD_Control mov [MyVar],100 Ciclo: mov A,200 call LCD_Delay50uTimes dec [MyVar] jnz Ciclo mov A, GoHome call LCD_Control ; Mueve el Cursor a Home .terminate: jmp .terminate .literal TablaRom1: asciz "Linea1" ; Defino una cadena en rom con terminacin nula
TablaRom2: asciz "Linea2" ; Defino una cadena en rom con terminacin nula .endliteral
12.- A que cdigo en nuestros programas anteriores sustituyen las lneas: mov A, SetDDRAM_Addr | 0x40 y call LCD_Control? Sustituye a: Mov A,xxh Mov X,yyh Call LCD_Position 13.- A que estructura de alto nivel equivale el siguiente cdigo, y para que se utiliza en el programa? mov [MyVar],100 Ciclo: mov A,200 call LCD_Delay50uTimes dec [MyVar] jnz Ciclo es equivalente a un ciclo do-while. 14.- funcin realizan las instrucciones: mov A, 0b00001111 y call LCD_Control? Se encarga de posicionar el cursor, encender el parpadeo y encender la LCD. (DISPLAY ON/OFF Control). 15.- Que desventajas y ventajas encuentras en el uso de ensamblador para el Manejo del LCD, con respecto a C? En C es mucho mas fcil y rpido realizar la programacin de la LCD, ya que no es necesario escribir tantos cdigos. Aun as en ensamblador se puede configurar ciertas cosas que estn predefinidas en C ,adems de ocupar menos espacio de memoria.
4b. Crea un nuevo proyecto en Ensamblador, y llmalo Prctica1c. Haz un programa que genere y despliegue 8 caracteres propios en el LCD (como por ejmplo: etc.) Cada uno debe de ir apareciendo uno a uno con intervalos de un segundo entre cada despliegue. Para generar este tiempo de espera entre el despliegue de cada smbolo, crea una subrutina llamada Pausa1s haciendo uso de la funcin LCD_Delay50uTimes del LCD. De tal manera que cada vez que desees hacer una espera de 1 seg uses la instruccin call Pausa1s. Incluye en el reporte de la prctica el cdigo del programa.
;----------------------------------------------------------------------------; Assembly main line ;----------------------------------------------------------------------------include "m8c.inc" include "memory.inc" include "PSoCAPI.inc" CLEARLCD: CGRAM: DDRAM: ; part specific constants and macros ; Constants & macros for SMM/LMM and Compiler ; PSoC API definitions for all User Modules ;borrar la lcd ;indicamos la direccion del a cgram ;indicamos la direccion de la ddram
export _main area bss(RAM) var: blk 1 var1: blk 1 tiempo: blk 1 area text(ROM,REL) _main: call LCD_Start call LED_Start call LED_On mov A,CLEARLCD call LCD_Control mov A,CGRAM call LCD_Control de datos se realizaran en la CGRAM mov [var],65 mov [var1],0 loop: mov A,[var1] index Tabla1 call LCD_WriteData inc[var1] dec[var] jnz loop mov A, DDRAM call LCD_Control mov A,00h ;iniciamos la LCD ;iniciamos el LED ;encendemos el LED ;limpiamos el LCD ;indicamos que las transferencias
call LCD_WriteData mov [tiempo],100 call pausa mov A,01h call LCD_WriteData mov [tiempo],100 call pausa mov A,02h call LCD_WriteData mov [tiempo],100 call pausa mov A,03h call LCD_WriteData mov [tiempo],100 call pausa mov A,04h call LCD_WriteData mov [tiempo],100 call pausa mov A,05h call LCD_WriteData mov [tiempo],100 call pausa mov A,06h call LCD_WriteData mov [tiempo],100 call pausa mov A,07h call LCD_WriteData mov [tiempo],100 call pausa pausa: mov A,200 call LCD_Delay50uTimes dec[tiempo] jnz pausa ret mov A,3 index Tabla1 lcall LCD_WriteData
; ; ; ;
db 0b01110 db 0b11111 db 0b01110 db 0b00100 db 0b01110 db 0b01110 db 0b01110 ;segunda db 0b00010 db 0b00110 db 0b01010 db 0b01010 db 0b01010 db 0b00110 db 0b00010 db 0b00000 ;tercera db 0b10001 db 0b00100 db 0b01010 db 0b01010 db 0b00100 db 0b00100 db 0b00100 db 0b10101 ;cuarta db 0b00000 db 0b00100 db 0b01010 db 0b11111 db 0b10001 db 0b10001 db 0b11111 db 0b00000 ;quinta db 0b00000 db 0b00110 db 0b01111 db 0b11110 db 0b01111 db 0b00110 db 0b00000 db 0b00000 ;quinta db 0b01110 db 0b01110 db 0b01110 db 0b00100 db 0b11111 db 0b00100 db 0b01010 db 0b10001 ;sexta db 0b00000 db 0b01110 db 0b10001 db 0b00100
db 0b01010 db 0b00000 db 0b00100 db 0b00000 ;septima db 0b00100 db 0b00110 db 0b10101 db 0b01110 db 0b01101 db 0b10110 db 0b00100 db 0b00000 .endliteral
BIBLIOGRAFA.
Mauricio Romero. Gua de Practicas de Dispositivos de Control. Practica 1. - Programacin Bsica del LCD. Visualizacin de Nmeros en http://www.cypress.com/?id=4&rID=31078 Punto Flotante. Recuperado de:
Alexander Senz. Introduccin a la Programacin de los PsoCs. Recuperado de: http://es.scribd.com/doc/91635812/Introduccion-Programacion-de-Psoc-Cap1 Cypress. C lenguaje compiler user guide. Recuperado de la documentacin de PsoC. Cypress. Assembly lenguaje user guide. Recuperado de la documentacin de PsoC. Assembler Directives to Specify RAM http://www.cypress.com/?id=4&rID=28629 Area and Code Area. Recuperado de: