Práctica 7-Microcontroladores
Práctica 7-Microcontroladores
Práctica 7-Microcontroladores
7
LABORATORIO DE MECATRÓNICA
Ingeniería Mecatrónica
Microcontroladores
No. Duración
Nombre de la Unidad de Aprendizaje Nombre de la Práctica
Práctica (horas)
LCD, adquisición de parámetros y
7 Programación de periféricos del microcontrolador 2
sensor de temperatura
Calificación:
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 2 de 28
No. Duración
Nombre de la Unidad de Aprendizaje Nombre de la Práctica
Práctica (horas)
LCD, adquisición de parámetros y
7 Programación de periféricos del microcontrolador 2
sensor de temperatura
1.- INTRODUCCIÓN
Las siglas LCD significan “Liquid Cristal Display” ó pantalla de cristal líquido. Es una pantalla plana basada en el
uso de una sustancia liquida atrapada entre dos placas de vidrio, haciendo pasar por este una corriente eléctrica a
una zona específica, para que así esta se vuelva opaca, y además cuenta (generalmente) con iluminación trasera.
Las pantallas LCD de color, cada pixel individual se divide en tres cédulas o sub pixeles con los colores RGB
(Rojo, Verde y Azul) respectivamente. Y así cada pixel puede controlarse para producir una gran variedad de
colores distintos.
El uso de las LCD se ha visto muy requerido tanto en la industria como en los proyectos escolares o de medianas
empresas, ya que su uso es bastante agradable a la vista, aunque muchos de nosotros estamos acostumbrados a
escuchar dichas siglas y pensar en una pantalla para TV o el display de un ordenador, mientras que los display LCD
tienen una gama más abierta de aplicaciones, desde relojes, calculadoras, electrodomésticos, impresoras, etc.
Cuando se trabaja en diseño de circuitos electrónicos, es frecuente encontrarse con la necesidad de visualizar un
mensaje, que tiene que ver con el estado de la máquina a controlar, con instrucciones para el operario, o si es un
instrumento de medida, mostrar el valor registrado. En la mayoría de los casos, recurrimos a los displays de siete
segmentos, pero estos además de no mostrar caracteres alfanuméricos ni ASCII, tienen un elevado consumo de
corriente y son un poco dispendiosos de manejar, cuando se requiere hacer multiplexaje.
Los módulos de cristal líquido o LCD, solucionan estos inconvenientes y presentan algunas ventajas, como un
menor consumo de corriente, no hay que preocuparse por hacer multiplexaje, no hay que hacer tablas especiales
con los caracteres que se desea mostrar, se pueden conectar fácilmente con microprocesadores o
microcontroladores y además, los proyectos adquieren una óptima presentación y funcionalidad.
El alumno deberá contar previamente con un conocimiento sobre programación mediante la simulación y la
práctica el uso de una LCD de un microcontrolador para la realización de tareas.
Explicar al alumno las principales herramientas para la programación del microcontrolador para ver los resultados
en una LCD mediante el uso de microcontroladores, es vital su implementación y su simulación.
Ejercicio 1
Inicie el software Codevision AVR. Cree un nuevo proyecto dando click en el menú New>Project.
Cuando el software pregunte si queremos usar el asistente CodeWizardAVR le indicamos que Si.
Mucho del código generado por el asistente no se utiliza en esta práctica. Modifique el código borrando
algunas líneas para que solo quede lo necesario para usar el ADC y la pantalla LCD. El código resultante
se muestra a continuación:
Compile el proyecto eligiendo desde el menú Project>Build All. Una compilación correcta arrojará la
información No errors, No warnings
DIDR0 =(0 << ADC5D ) | (0<< ADC4D ) | (0<< ADC3D ) | (0<< ADC2D ) | (0<<
ADC1D ) | (0<< ADC0D );
ADMUX = ADC_VREF_TYPE ;
ADCSRA =(1<< ADEN ) | (0<< ADSC ) | (0<< ADATE ) | (0<< ADIF ) | (0<<
ADIE ) | (0<< ADPS2 ) | (0<< ADPS1 ) | (1<< ADPS0 );
ADCSRB =(0<< ADTS2 ) | (0<< ADTS1 ) | (0<< ADTS0 );
// Alphanumeric LCD initialization
// Connections are specified in the
// Project | Configure |C Compiler | Libraries | Alphanumeric LCD menu
:
// RS - PORTD Bit 0
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 11 de 28
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters / line : 16
lcd_init (16) ;
while (1)
{
lcd_gotoxy (0 ,0);
lcd_putsf (" TESH Mecatronica ");
lcd_gotoxy (6 ,1);
lcd_putsf (" Hola Mundo");
}
}
Compile el proyecto eligiendo desde el men_u Project>Build All. Una compilación correcta arrojará la
información No errors, No warnings
Descargue el archivo que resulto de la compilación prac07.hex en la memoria Flash del microcontrolador.
Muestre el circuito funcionando al profesor, para que le sea tomado en cuenta.
En la pantalla LCD se debe de mostrar las palabras TESH Mecatronica y Hola Mundo.
Pruebe cambiar el texto en lcd putsf() y las coordenadas en lcd gotoxy() y responda ¿Para qué sirven las
dos instrucciones anteriormente citadas?
lcd putsf() = Es una function que permite mostrar strings en una pantalla LCD.
Es una librería estándar que permite imprimir string almacenado en la memoria RAM en una pantalla LCD.
lcd gotoxy() = Si deseamos escribir en las 16 celdas del LCD, usamos la función GotoXY( ), para el compilador
HiTech ó cursorXY( ) para el compilador CCS para posicionar el cursor en el renglón deseado, antes de enviar los
caracteres.
Ejercicio 2.
Modifique de nuevo el código como se muestra a continuación:
PORTD = 0x00;
// Analog Comparator initialization
// Analog Comparator : Off
// The Analog Comparator 's positive input is
// connected to the AIN0 pin
// The Analog Comparator 's negative input is
// connected to the AIN1 pin
ACSR =(1<< ACD ) | (0<< ACBG ) | (0<< ACO ) | (0<< ACI ) | (0<< ACIE ) |
(0<< ACIC ) | (0<< ACIS1 ) | (0<< ACIS0 );
// Digital input buffer on AIN0 : On
// Digital input buffer on AIN1 : On
DIDR1 =(0 << AIN0D ) | (0<< AIN1D );
// ADC initialization
// ADC Clock frequency : 500.000 kHz
// ADC Voltage Reference : AREF pin
// ADC Auto Trigger Source : ADC Stopped
// Digital input buffers on ADC0 : On , ADC1 : On , ADC2 : On , ADC3
: On
// ADC4 : On , ADC5 : On
DIDR0 =(0 << ADC5D ) | (0<< ADC4D ) | (0<< ADC3D ) | (0<< ADC2D ) | (0<<ADC1D ) | (0<< ADC0D );
ADMUX = ADC_VREF_TYPE ;
ADCSRA =(1<< ADEN ) | (0<< ADSC ) | (0<< ADATE ) | (0<< ADIF ) | (0<<ADIE ) | (0<< ADPS2 ) | (0<< ADPS1 ) | (1<<
ADPS0 );
ADCSRB =(0<< ADTS2 ) | (0<< ADTS1 ) | (0<< ADTS0 );
// Alphanumeric LCD initialization
// Connections are specified in the
// Project | Configure |C Compiler | Libraries | Alphanumeric LCD
menu :
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters / line : 16
lcd_init (16) ;
while (1)
{
temp = texto [0];
for (i = 0; i < 15; i++)
{
texto [i] = texto [i +1];
}
texto [15] = temp ;
lcd_gotoxy (0 ,0);
lcd_puts ( texto );
for (i=0;i <16; i++)
{
lcd_gotoxy (i ,1);
lcd_putchar (0);
}
delay_ms (500) ;
}
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 14 de 28
Compile el proyecto eligiendo desde el men_u Project>Build All. Una compilacion correcta arrojar_a la
informaci_on No errors, No warnings
En la pantalla LCD se debe de mostrar las palabras Hola todos UTFV y un caracter creado por el usuario
de forma animada.
Pruebe cambiar los pixeles en flash byte char0[8]={} y vea el resultado. Genere su propio caracter pixel
por pixel e imprímalo en la pantalla LCD. Escriba la creación de su propio caracter.
R= imprime el texto pero cuando no hay un carácter entre las apostrofes ya no imprime los demás
caracteres. Este código es distinto al anterior, debido a que se imprime carácter por carácter con su
respectiva sección.
El tipo char se utiliza para representar caracteres individuales. Por tanto, el tipo char requiere sólo un byte de
memoria. Cada tipo char tiene una interpretación como entero equivalente, de esta forma un char es una clase
especial de entero pequeño. En la mayoría de los compiladores el entero tipo char puede tomar valores entre 0 y
255. También se puede utilizar datos unsigned char (con valores de 0 a 255) o datos signed char (con valores de
-128 a 127).
Ejercicio 3.
Con el multímetro o con el osciloscopio (de preferencia) sintonice a 1.10V la señal AREF modificando el
valor de la resistencia en el potenciómetro R2. Esto para calibrar el valor correcto de la señal del sensor
LM35.
Modifique de nuevo el código como se muestra a continuación:
Compile el proyecto eligiendo desde el men_u Project>Build All. Una compilación correcta arrojará la
información No errors, No warnings
Descargue el archivo que resulto de la compilación prac07.hex en la memoria Flash del microcontrolador.
En la pantalla LCD se debe de mostrar la temperatura actual del laboratorio. De la misma manera muestre
la simulación.
¿Para qué sirven las instrucciones tempC = read adc(0); y tempC =(1.1 *tempC * 100.0)/1024.0;
respectivamente?
R= con tempC = read adc(0); lee el voltaje en PC0 y con tempC =(1.1 *tempC * 100.0)/1024.0; realiza
el cálculo del voltaje leído.
Ejercicio 4.
Realizar un programa que muestre una barra de progreso al incrementarse la temperatura, como se
muestra en la siguiente Figura:
PORTC = 0x00;
DDRD = 0xF7 ;
PORTD = 0x00;
// Analog Comparator initialization
// Analog Comparator : Off
// The Analog Comparator 's positive input is
// connected to the AIN0 pin
// The Analog Comparator 's negative input is
// connected to the AIN1 pin
ACSR =(1<< ACD ) | (0<< ACBG ) | (0<< ACO ) | (0<< ACI ) | (0<< ACIE ) |(0<< ACIC ) | (0<< ACIS1 ) | (0<< ACIS0 );
// Digital input buffer on AIN0 : On
// Digital input buffer on AIN1 : On
DIDR1 =(0 << AIN0D ) | (0<< AIN1D );
// ADC initialization
// ADC Clock frequency : 500.000 kHz
// ADC Voltage Reference : AREF pin
// ADC Auto Trigger Source : ADC Stopped
// Digital input buffers on ADC0 : On , ADC1 : On , ADC2 : On , ADC3
: On
// ADC4 : On , ADC5 : On
DIDR0 =(0 << ADC5D ) | (0<< ADC4D ) | (0<< ADC3D ) | (0<< ADC2D ) | (0<<ADC1D ) | (0<< ADC0D );
ADMUX = ADC_VREF_TYPE ;
ADCSRA =(1<< ADEN ) | (0<< ADSC ) | (0<< ADATE ) | (0<< ADIF ) | (0<<ADIE ) | (0<< ADPS2 ) | (0<< ADPS1 ) | (1<<
ADPS0 );
ADCSRB =(0<< ADTS2 ) | (0<< ADTS1 ) | (0<< ADTS0 );
// Alphanumeric LCD initialization
// Connections are specified in the
// Project | Configure |C Compiler | Libraries | Alphanumeric LCD
menu :
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters / line : 16
lcd_init (16) ;
while (1)
{
// Lee el voltaje en PC0
tempC = read_adc (0);
// Ajusta la conversi_on a un rango 0.0 a 1.1 V
// Conversi_on de 10- bit
tempC =(1.1 * tempC * 100.0) /1024.0;
sprintf (texto ," Temp = %d ", tempC );
lcd_gotoxy (0 ,0);
lcd_puts ( texto );
delay_ms (500) ;
// Rutina para pintar la barra de progreso
nCuadros = tempC /5;
for(i=0;i< nCuadros ;i++)
{
lcd_gotoxy (i ,1);
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 20 de 28
Compile el proyecto eligiendo desde el menú Project>Build All. Una compilación correcta arrojará la
información No errors, No warnings
Descargue el archivo que resulto de la compilación prac07.hex en la memoria Flash del microcontrolador.
Muestre el circuito funcionando al profesor, para que le sea tomado en cuenta.
En la pantalla LCD se debe de mostrar una barra de progreso que debe aumentar si la temperatura sube.
De la misma manera muestre la simulación en Proteus.
La sentencia for
Esta sentencia se encuentra en la mayoría de los lenguajes de programación. El bucle for se empleará cuando
conocemos el número de veces que se ejecutará una sentencia o un bloque de sentencias.
El primer término inicialización, se usa para inicializar una variable índice, que controla el número de veces que se
ejecutará el bucle. La condición representa la condición que ha de ser satisfecha para que el bucle continúe su
ejecución. El incremento representa la cantidad que se incrementa la variable índice en cada repetición.
Ejemplo: Escribir un programa que imprima los primeros 10 primeros números enteros empezando por el cero
El resultado será: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Ejemplo: Escribir un programa que imprima los números pares positivos menores o iguales que 20
Ejemplo: Escribir un programa que imprima los números pares positivos menores o iguales que 20 en orden
decreciente
Ejemplo: Escribir un programa que calcule el factorial de un número empleando la sentencia iterativa for. Guardar
el resultado en un número entero de tipo long .
No aplica
Ejercicio 1
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 23 de 28
Ejercicio 2
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 24 de 28
Ejercicio 3
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 25 de 28
Ejercicio 4
Código: MP-IM-01
No. de Revisión: 0
MANUAL DE PRACTICAS
Fecha de Emisión: 21 Septiembre, 2015
Hoja 26 de 28
8.- CONCLUSIONES
Para el tercer ejercicio ya se ara el uso del sensor de temperatura paro lo cual, y que se muestre el resultado de la
temperatura que dicho sensor está captando, se le agrega la fórmula de conversión y en la LCD muestra el
resultado de la temperatura captada por el sensor.
Por último, el 4 ejercicio es lo mismo del 3 solo se le agrego “ flash byte char0 [8]” para agregar un carácter del
contorno un rectángulo, el cual dependiendo la temperatura captada en el sensor dicho carácter se rellenaba e iban
prendiendo cundo la temperatura captada iba en incremento de 5.
9.- ANEXOS
11.- REFERENCIAS
The AVR Microcontroller and Embedded System, using assembly and C / Muhamad Ali Mazidi, Sarmad Naimi,
Sepehr Naimi; United States of America: Prentice Hall, 2011. ISBN-10: 0-13-800331-9.
Make: AVR Programming / Elliot Williams, 2014, Printed in the United States of America. Published by Maker
Media, ISBN: 978-1-449-35578-4
Palacios, Enrique. (2006) Microcontrolador PIC16F84. Desarrollo de proyectos. 2ª Edición. Ed. Alfaomega