viernes, 8 de noviembre de 2019

LABORATORIO NRO. 11

MICROCONTROLADORES

Laboratorio Nº 11

Programación de una 

Pantalla LCD

1. CAPACIDAD TERMINAL:
● Utilizar al microcontrolador en aplicaciones de control electrónico.
● Desarrollar y ejecutar programas en un microcontrolador PIC
● Programar y configurar interfaces básicas del microcontrolador.


2. COMPETENCIA ESPECÍFICA DE LA SESIÓN:
Conocer el Display LCD y su funcionamiento
Programar eficientemente el LCD 
Programar HMI para proyecto actual.

3. CONTENIDOS A TRATAR: 
Display LCD
Manejo de teclado matricial

4. RESULTADOS:

●Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.

5. MATERIALES Y EQUIPO:
Pantalla LCD:

Es una pantalla de cristal líquido o LCD (Liquid Crystal Display) es una pantalla delgada y plana formada por un número de píxeles en color o monocromos colocados delante de una fuente de luz o reflectora. En este caso vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas de 16 caracteres cada una. 



Conexiones:



Pines de alimentación:



Vss: Gnd

Vdd: +5 voltios

Vee: corresponde al pin de contraste, lo regularemos con un potenciómetro de 10K

Pines de control:

RS: Corresponde al pin de selección de registro de control de datos (0) o registro de datos(1). Es decir el pin RS funciona paralelamente a los pines del bus de datos. Cuando RS es 0 el dato presente en el bus pertenece a un registro de control/instrucción. y cuando RS es 1 el dato presente en el bus de datos pertenece a un registro de datos o un carácter.
RW: Corresponde al pin de Escritura(0) o de Lectura(1). Nos permite escribir un dato en la pantalla o leer un dato desde la pantalla.
E: Corresponde al pin Enable o de habilitación. Si E(0) esto quiere decir que el LCD no esta activado para recibir datos, pero si E(1) se encuentra activo y podemos escribir o leer desde el LCD.

Pines de Bus de datos:

El Bus de datos bidireccional comprende desde los pines D0 a D7. Para realizar la comunicación con el LCD podemos hacerlo utilizando los 8 bits del bus de datos(D0 a D7) o empleando los 4 bits mas significativos del bus de datos(D4 a D7).

En cuanto al bus de datos, haremos uso de los cuatro últimos como podrán verlo a continuación en la programación (D4, D5, D6 y D7)

6. TAREA GUIADA DENTRO DEL LABORATORIO:
1. Simule y pruebe en el entrenador el programa del LCD de acuerdo al circuito y código siguiente:

   #include <16f877a.h>
   #use delay (clock=20M)
   #fuses HS, NOPROTECT, NOWDT

   #define LCD_ENABLE_PIN        PIN_D3   //Definimos los pines a ser 
   #define LCD_RS_PIN            PIN_D2   //pantalla LCD
   #define LCD_RW_PIN            PIN_A0
   #define LCD_DATA4             PIN_D4
   #define LCD_DATA5             PIN_D5
   #define LCD_DATA6             PIN_D6
   #define LCD_DATA7             PIN_D7  

   #include <lcd.c>                 // Incluimos librería para manejar     Pantalla LCD

   int16 dato;

   void main ()
   {
     lcd_init () ;                       // Inicializamos pantalla LCD
     dato = 50;                          // Damos valor inicial para empezar la cuenta
     printf (lcd_putc, "   CONTADOR") ;  // Mandamos mensaje por única vez
     lcd_gotoxy(1,2);
     printf (lcd_putc, "Valor: %4lu", dato) ;

     WHILE (true)
     {
      IF (!input(PIN_D0))              // Rutina para INCREMENTAR dato
         {
            dato++;
            lcd_gotoxy(1,2);
            printf (lcd_putc, "Valor: %4lu", dato) ;
            while (!input(PIN_D0))     // Rutina ANTIRREBOTE por software
            {}                         
         }
      IF (!input(PIN_D1))
         {
            dato--;
            lcd_gotoxy(1,2);
            printf (lcd_putc, "Valor: %4lu", dato) ;
            while (!input(PIN_D1))     // Rutina ANTIRREBOTE por software
            {} 
         }   
     }
  }



7. TAREA A SER EVALUADA:
1. En base al programa anterior, realice un PROGRAMA con los siguientes REQUERIMIENTOS:

Se dispone de una pantalla LCD. Elaborar un programa que INCREMENTE un número en 50 unidades cada vez que se presione un pulsador y DECREMENTE dicho número en 15 unidades cada vez que se presione otro pulsador.
Si el valor del número supera 500 unidades, mostrar en la pantalla LCD en la primera línea: “FULL”, además debe sonar un BIP por tres veces . Si el valor llega a ser menor o igual a -100, mostrar “VALOR MINIMO” y debe sonar BIP indefinidamente. En ambos casos el valor del número no debe incrementarse ni decrementarse.

Agregar un tercer pulsador para habilitar o deshabilitar la cuenta. En caso que esté desahabilitado, deberá mostrar en la pantalla LCD “DESHABILITADO”.


#include <16f877a.h>
#use delay (clock=20M)
#fuses HS, NOPROTECT, NOWDT

#define LCD_ENABLE_PIN        PIN_D3   //Definimos los pines a ser
#define LCD_RS_PIN            PIN_D2   //pantalla LCD
#define LCD_RW_PIN            PIN_A0
#define LCD_DATA4             PIN_D4
#define LCD_DATA5             PIN_D5
#define LCD_DATA6             PIN_D6
#define LCD_DATA7             PIN_D7 

#include <lcd.c>                 // Incluimos librería para manejar Pantalla LCD

signed int16 dato;
int i, z;
int habilitador=1;

void BIP()
{
   FOR (i=0;i<=100;++i)
      {
         output_high(PIN_E1);    // Pone a "1" el pin E1 (envía 5 voltios)
         delay_ms(1);            // "Congela el tiempo" durante 1ms
         output_low(PIN_E1);     // Pone a "0" el pin E1
         delay_ms(1);            // "Congela el tiempo" durante 1ms
      }
}

void main ()
{
   lcd_init ();                        // Inicializamos pantalla LCD
   dato = 50;                          // Damos valor inicial para empezar la cuenta
   printf (lcd_putc, "   CONTADOR") ;  // Mandamos mensaje por única vez
   lcd_gotoxy(1,2);
   printf (lcd_putc, "Valor: %4ld", dato) ; //Para imprimir variable %,el 4 reserva espacios, ld long signed

   WHILE (true)
   {
    IF(habilitador==1)
    {
      IF (!input(PIN_D0))              // Rutina para INCREMENTAR dato
         {
            dato = dato + 50;
            printf (lcd_putc, "\f   CONTADOR") ;
            lcd_gotoxy(1,2);
            printf (lcd_putc, "Valor: %4ld", dato);
            while (!input(PIN_D0))     // Rutina ANTIRREBOTE por software
            {}     
           
            IF ( dato >= 500)
            {
               printf (lcd_putc, "\f    FULL") ;
               lcd_gotoxy(1,2);
               printf (lcd_putc, "Valor: %4ld", dato);
               FOR (z=0;z<=2;z++)
               {
                   BIP();
                   delay_ms(500);
               }
               while (dato >=500)     // Rutina ANTIRREBOTE por software
               {}
            }
         }
      IF (!input(PIN_D1))
         {
            dato = dato - 15;
            printf (lcd_putc, "\f   CONTADOR") ;
            lcd_gotoxy(1,2);
            printf (lcd_putc, "Valor: %4ld", dato);
            while (!input(PIN_D1))     // Rutina ANTIRREBOTE por software
            {}
           
            IF ( dato <= -100)
            {
               printf (lcd_putc, "\f   VALOR MINIMO") ;
               lcd_gotoxy(1,2);
               printf (lcd_putc, "Valor: %4ld", dato);
               while (dato <= -100)     // Rutina ANTIRREBOTE por software
               {
               BIP();
               delay_ms(10);
               }
            }
         } 
    }

    ELSE  IF (habilitador==0)
          {
              lcd_putc("\f");
              printf (lcd_putc, "  DESHABILITADO") ;
              delay_ms(160);
          }


 IF (!input(PIN_E0))
      {
            habilitador = ! habilitador;
            delay_ms(500);          // "Congela el tiempo" durante 500 ms para evitar falsas pulsaciones
      }
  }
}

2. Investigue y responda lo siguiente: ¿Cómo hacer para mostrar números negativos?, ¿cómo hacer para mostrar números con decimales?.
a. Para mostrar números negativos se cita la instrucción signed (con signo).
b. Para mostrar números con decimales se cita la instrucción Long (ld o lu).



8. EVIDENCIA DE TRABAJO EN LABORATORIO:


Link del video: https://youtu.be/gGS7nRZkBL8

9. OBSERVACIONES:
  • Se logró ver la diferencia de la ejecución del programa, en el simulador Proteus y en el entrenador PIC siendo algunas como la emisión del sonido (entrecortado en Proteus) y las falsas pulsaciones (en el entrenador PIC).
  • Es necesario definir al inicio junto con las librerías, los pines que serán empleados en el desarrollo del programa (los de alimentación, control y de datos).
  • El delay_ms es una instrucción muy importante que aportará en toda la programación, ya que es brindarle o permitirle el tiempo mínimo necesario para qué se refresque los datos.
  • El código implementado representó la correcta programación elaborada, cumpliendo lo propuesto en este laboratorio.
10. CONCLUSIONES:
  • Se implementó la programación eficiente para el ejercicio propuesto, conociendo más instrucciones y su función ejercida, además de sus posibles alteraciones o modificaciones.
  • Para que no se ejecute falsas pulsaciones por medio de un pulsador, se empleó la función "while(entrada){}", significando que realizará la ejecución en vacío cuando esa entrada esté energizada de manera prolongada.
  • Para poder mostrar valores numéricos con signo, se debe colocar la instrucción "signed" antes del "int" y luego cuando se requiera leer ese valor y mostrarlo en la pantalla lcd, se utiliza la instrucción "ld" dentro de los parámetros de "printf..."; el símbolo % para un valor numérico siendo el número que le sigue los espacios que separará para la escritura.
  • Se logró jerarquizar las condiciones y funciones a programar, evaluando cuál es la que gobierna sobre las demás para que dentro de está se sitúen las demás y se cumplan luego de tenerse habilitado la función más grande.
  • La declaración de las condiciones para establecer los limites, se plantean dentro de la función correspondiente que llega a ese valor, tanto de incremento o decremento.
  • Se hizo uso del símbolo "!" delante de la variable, para cambiar su estado de similar modo que la función toggle; en cada pulso.

No hay comentarios:

Publicar un comentario