domingo, 24 de noviembre de 2019

laboratorio 12

MICROCONTROLADORES

Laboratorio Nº 12

(Manejo del timer y las interrupciones)



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 funcionamiento y la configuración de las Interrupciones
  • Conocer el funcionamiento y la configuración del Timer cero
  • Aplicar estos conocimientos en la realización de un cronómetro.
3. CONTENIDOS A TRATAR: 
  • Interrupciones
  • Timer cero.
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
  • CCS Compiler instalado.
  • Entrenador de PICS
  • PIC16F877A
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
  • PC con Software de simulación.
6. FUNDAMENTO TEÓRICO

  • Manejo de las interrupciones en un PIC
  • Manejo y configuración del Timer

Las interrupciones PIC son desviaciones de flujo de control del programa originadas asincrónicamente por diversos sucesos que no dependen del programador, es decir, ocurren en cualquier momento.
Las interrupciones PIC ocurren por sucesos externos como la generación de una interrupción por flanco PIC, una interrupción externa PIC cambiando el nivel en un PIN del microcontrolador o eventos internos tales como el desbordamiento de un contador, terminación del conversor análogo a digital, entre otras.


Interripciones PIC
El comportamiento del microcontrolador ante la interrupción es similar al procedimiento que se sigue al llamar una función desde el programa principal. En ambos casos se detiene la ejecución del programa en curso, se guarda la dirección a donde debe retornar cuando termine de ejecutar la interrupción, atiende o ejecuta el programa correspondiente a la interrupción y luego continua ejecutando el programa principal, desde donde lo dejo cuando fue interrumpido.

Tipos de Interrupciones PIC


Aqui nombramos 10 diferentes causas que producen una interrupción PIC, por lo tanto el primer paso de la rutina de interrupción será identificar la causa de la interrupción.
  • Interrupción externa PIC RB0/INT
  • Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
  • Interrupción por desborde del timer 0 (TMR0)
  • Interrupción por desborde del timer 1 (TMR1)
  • Interrupción por comparación exitosa exitosa en TMR2
  • Interrupción del comparador
  • Interrupción del transmisor del USART
  • Interrupción del receptor del USART
  • Interrupción del módulo CCP
  • Interrupción del EEPROM

Interrupciones PIC en CCS


Vamos a ver como podemos utilizar las interrupciones en un PIC utilizando el PIC C Compiler CCS. Lo que veremos aqui puedes aplicarlo en cualquier microcontrolador de Microchip, por ejemplo esto sirve para las interrupciones PIC 18F4550 CCS, Interrupciones PIC 16F877A, Interrupciones PIC 16F84 o cualquier otro. A modo de ejemplo lo mostraremos como usar las interrupciones PIC en el 18F887.
Los pasos que se deben seguir para atender una interrupción, son los siguientes
  • Digitar la función correspondiente a la interrupción. La función debe comenzar con # y la interrupción correspondiente, por ejemplo para la función de interrupción por RB0 se digita #int_EXT
  •  En el programa principal, habilitar las interrupciones en forma global, con la instrucción: enable_interrupts(GLOBAL);
  •  En el programa principal, habilitar la interrupción correspondiente, como ejemplo se muestra como habilitar la interrupción externa por RB0: enable_interrupts(INT_EXT);
Existen diferentes tipos de interrupción en el microcontrolador, algunas de ellas se mencionan a continuación:
#INT_EXT              INTERRUPCIÓN EXTERNA
#INT_RTCC            DESBORDAMIENTO DEL TIMER0(RTCC)
#INT_RB                  CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
#INT_AD                  CONVERSOR A/D
#INT_EEPROM   ESCRITURA EN LA EEPROM COMPLETADA
#INT_TIMER1      DESBORDAMIENTO DEL TIMER1
#INT_TIMER2     DESBORDAMIENTO DEL TIMER2

El timer0 PIC es un temporizador contador de 8 bits, el registro TMR0 es el temporizador contador timer0 en si, es donde se guardan los valores del timer0 PIC, cuando es utilizado como temporizador sus valores aumentaran de uno en uno entre 0 y 255 con cada 4 ciclos de reloj, no olvidar que cada ciclo de instrucción del microcontrolador PIC es realizado en 4 ciclos de reloj, por ejemplo si el oscilador con el que está funcionando el microcontrolador PIC es de 4MHz, entonces el registro TMR0 aumentará una unidad en cada 1us, si el registro TMR0 se incrementa en 100 unidades habrán transcurrido 100us; cuando el timer0 PIC es utilizado como contador el registro TMR0 ya no aumenta su valor de uno en uno en cada 4 ciclos de reloj, sino que lo hará mediante el flanco de subida o el flanco de bajada de alguna señal que llegue a un pin especial del PIC conectado al timer0 PIC, este pin es identificado como T0CKI que en el PIC16F877A es el pin6 o RA4, esto puede variar de acuerdo al microcontrolador PIC utilizado, pero siempre se llamará T0CKI.

timer0 pic pic16f877a

7. TAREAS GUIADAS DENTRO DEL LABORATORIO:

    1. Simule y pruebe en el entrenador el programa mostrado de acuerdo al circuito y código siguiente. Asegúrese que el LCD esté conectado al PUERTO D mediante interruptores rojos debajo del mismo:

    #include <16f877a.h>             // Incluimos archivo con PIC a utilizar
    #device adc=8                    // Utilizamos 8 bits de RESOLUCIÓN de lectura 
    #use delay (clock=20M)           // Indicamos al compilador que trabajaremos a 20Mhz
    #fuses HS, NOPROTECT, NOWDT      // Configuración básica de los fusibles

    #define LCD_ENABLE_PIN        PIN_D3 //Definimos los pines a ser utilizados por la
    #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

    int centesimas=0,segundos=0,minutos=2;

    #int_TIMER0                      // FUNCION DE INTERRUPCION POR
    void TIMER(VOID)                 // DESBORDAMIENTO DEL TIMER 0
    {
       ++centesimas;                 // incrementar una centésima
       if (centesimas>99)
          {
          ++segundos;                // si llegamos a 100, incrementar un segundo
          centesimas=0;
          }
       if (segundos>59)
          {
          ++minutos;                 // si llegamos a 60, incrementar un minuto
          segundos=0;
          }
       if (minutos==3)                // si llegamos a 3 minutos, hacer alguna acción
          {
          minutos=0;
          disable_interrupts (INT_TIMER0);          //habilita interrupcion de timer0
          // agregar cualquier otra acción necesaria.
          }
       
       set_timer0 (61);              //reinicar cuenta desde 61

    void main ()
    {
       lcd_init () ;                                // Inicializamos pantalla LCD
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);   //configuracion del timer0
       set_timer0 (61);                             // interrupción cada centésima
       enable_interrupts (INT_TIMER0);              //habilita interrupcion de timer0
       enable_interrupts (GLOBAL);                  //todas las interrupciones activadas
       
       printf (lcd_putc, "\f***CRONOMETRO***") ;    // Mandamos mensaje por única vez
       
       WHILE (true)
       {
          lcd_gotoxy(2,2);
          Printf(lcd_putc,"Tiempo %02u:%02u",minutos, segundos);
        }
    }
          

8. TAREAS A SER EVALUADAS:

A partir del código mostrado, realice los cambios necesarios para realizar un programa que CUENTE EN FORMA DESCENDENTE, (temporizador regresivo), bajo  las siguientes condiciones:
 
Al presionar pulsador en D0, incrementar SEGUNDOS. el temporizador aún no debe estar contando el tiempo. (sirve para configurar tiempo de cuenta).

Al presionar pulsador en D1, iniciar CUENTA REGRESIVA desde los minutos previamente configurados.

Si la cuenta llega a 00:00, congelar la cuenta y sonar BIP 3 veces.
Para verificar que una variable de tiempo (digamos “minutos”) llegó a cero, hacerlo con la instrucción “if (minutos==-1)”

9. Video explicativo:






10. OBSERVACIONES Y CONCLUSIONES:
  • OBSERVACIONES:
  1. Se observó que es importante declarar la librería correspondiente del LCD para poder realizar su programación.
  2. Se observó que es necesario declarar los pines del LCD para realizar la programación de cada uno de los datos almacenados en cada pin.
  3. Se utilizó un VOID BIP, para realizar el sonido de alarma al momento de que el dato llegaba a su valor máximo y su valor mínimo.
  4. Para realizar un bucle infinito no se utilizó el bucle for, pues este tiene un tope determinado, se utilizó un bucle while, pues a una determinada condición es mas fácil trabajar con él.
  • CONCLUSIONES:
  1. Se reconoció la pantalla LCD, su estructura y su funcionamiento.
  2. Se reconocieron funciones de bucles (for y while) para realizar un determinado paso por un determinado tiempo o si se desea por un bucle infinito de repeticiones.
  3. Se identificaron pines de programación correspondientes al LCD para poder enviar el dato a una determinada fila y una determinada columna.
  4. Se programaron y configuraron interfaces básicas del microcontrolador.

Laboratorio 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
  • CCS Compiler instalado.
  • Entrenador de PICS
  • PIC16F877A
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
  • PC con Software de simulación.
6. FUNDAMENTO TEÓRICO

  • Pantallas LCD de 16x2

¿Que es un LCD?


El LCD(Liquid Crystal Dysplay) o pantalla de cristal líquido es un dispositivo empleado para la visualización de contenidos o información de una forma gráfica, mediante caracteres, símbolos o pequeños dibujos dependiendo del modelo. Está gobernado por un microcontrolador el cual dirige todo su funcionamiento.
En este caso vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas de 16 caracteres cada una. Los píxeles de cada símbolo o carácter, varían en función de cada modelo.

¿Como es su conexionado?

En la siguiente imagen de Proteus se puede observar la estructura de sus pines.
Lo  podemos dividir en los Pines de alimentación, pines de control y los pines del bus de datos bidireccional. Por lo general podemos encontrar ademas en su estructura los pines de Anodo de led backlight y cátodo de led backlight.


Pines de alimentación:

Vss: Gnd
Vdd: +5 voltios
Vee: corresponde al pin de contraste, lo regularemos con un potenciómetro de 10K conectado a Vdd.

    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 este caso vamos a explicar la comunicación con el bus de 4 bits.

      ¿DDRAM y CGROM?

      Son las dos zonas de memoria del LCD.
      La memoria DDRAM(Data Display Ram): corresponde a una zona de memoria donde se almacenan los caracteres que se van a representar en pantalla. Es decir es la memoria donde se almacenan los caracteres a mostrar con su correspondiente posición.

      La memoria CGROM es una memoria interna donde se almacena una tabla con los caracteres que podemos visualizar en el lcd. En la imagen podemos ver un ejemplo de la tabla con un contenido de 192 caracteres.


      La memoria CGRAM(Character Generator Ram): en ella se pueden almacenar nuestros propios caracteres.

      La librería del LCD:

      Para poder visualizar los caracteres o símbolos en el LCD es necesario que en el programa de código fuente a emplear, incluyamos la librería de este. 
      En este caso empleamos la librería "lcd.c", la cual hemos modificado. Siempre que utilicemos una librería de este tipo tendremos que analizarla para saber cuales son los pines de control y los pines para el Bus de datos, en este caso podemos observar que están definidos al comienzo de la misma.


      #define LCD_ENABLE_PIN  PIN_D0
      #define LCD_RS_PIN      PIN_D1
      #define LCD_RW_PIN      PIN_D2
      #define LCD_DATA4       PIN_D4   
      #define LCD_DATA5       PIN_D5  
      #define LCD_DATA6       PIN_D6 
      #define LCD_DATA7       PIN_D7 

      En el resto de la librería se puede encontrar todas las estructuras necesarias así como las funciones que nos permiten utilizar nuestro LCD.
      Podemos encontrar funciones como :

      lcd_init: inicializa el lcd.
      lcd_gotoxy: establece la posicion de escritura en el lcd.
      lcd_putc: nos muestra un dato en la siguiente posición del lcd, podemos emplear funciones como \f para limpiar el display, \n cambio a la segunda línea, \b mueve una posición atrás.
      lcd_getc(x,y): devuelve caracteres a la posición x,y.
      Otras funciones: lcd_send_nibble(BYTE n), lcd_send_byte(BYTE address, BYTE n). 


      7. TAREAS GUIADAS DENTRO DEL LABORATORIO:

      • Transcriba el programa mostrado, compile dicho programa, simule en Proteus y compruebe funcionamiento en Tarjeta Entrenadora.

        #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
                  {} 
               }   
          }
      }



      8. TAREAS A SER EVALUADAS:

      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”

      Investigue y responda lo siguiente: 
      ¿Cómo hacer para mostrar números negativos?
      Al momento de designar el entero de 16 bits del dato le añadimos la extensión (SIGNED) al entero que deseamos inprimir en el LCD, por lo tanto la linea será:

      signed int16 dato;

      ¿cómo hacer para mostrar números con decimales?.

      Para mostrar estos se requiere colocar al entero una extensión FLOAT, y para ajustar el numero de decimales que queremos imprimir le camibiamos el valor del entero a un valor con decimal, por ejemplo : (1.2) si queremos dos decimales y un entero.

      printf (lcd_putc, "Valor: %1.2lu", dato) ;


      9. Video explicativo:





      10. OBSERVACIONES Y CONCLUSIONES:
      • OBSERVACIONES:
      1. Se observó que es importante declarar la librería correspondiente del LCD para poder realizar su programación.
      2. Se observó que es necesario declarar los pines del LCD para realizar la programación de cada uno de los datos almacenados en cada pin.
      3. Se utilizó un VOID BIP, para realizar el sonido de alarma al momento de que el dato llegaba a su valor máximo y su valor mínimo.
      4. Para realizar un bucle infinito no se utilizó el bucle for, pues este tiene un tope determinado, se utilizó un bucle while, pues a una determinada condición es mas fácil trabajar con él.
      • CONCLUSIONES:
      1. Se reconoció la pantalla LCD, su estructura y su funcionamiento.
      2. Se reconocieron funciones de bucles (for y while) para realizar un determinado paso por un determinado tiempo o si se desea por un bucle infinito de repeticiones.
      3. Se identificaron pines de programación correspondientes al LCD para poder enviar el dato a una determinada fila y una determinada columna.
      4. Se programaron y configuraron interfaces básicas del microcontrolador.