viernes, 6 de diciembre de 2019

MICROCONTROLADORES

Laboratorio Nº 13

(Lecturas de entradas analógicas)



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:
  • Lecturas analógicas de un canal del PIC
  • Configuración de un Sensor de Temperatura
  • Lectura analógica en una pantalla LCD
3. CONTENIDOS A TRATAR: 
  • Entradas analógicas
  • Sensor de Temperatura
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

El pic 16f877a, entre sus varios periféricos, posee un conversor análogo a digital con una resolución de 10 bits que puede leer los voltajes presentes en los pines marcados como AN0 hasta AN7

La lectura de estos se hace de forma multiplexada, una a la vez. Como buen sistema digital, las lecturas son tratadas como muestras tomadas a intervalos regulares de tiempo, las que son retenidas por un capacitor interno. La cantidad de muestras por segundo o velocidad de lectura son un submultiplo de la velocidad de oscilación del PIC por lo cual se debe cuidar que esta no resulte ser mayor que el tiempo que el capacitor interno demora en cargarse.
Una mala elección de velocidad de lectura, puede resultar en mediciones erróneas, por debajo de las magnitudes que se pretenden medir. Según Microchip, el tiempo de adquisición de los datos debe ser mayor a 19.72us.
Registros Involucrados en la conversión A/D

La conversión analogo-digital, se configura y controla con los registros ADCON0 y ADCON1, donde es posible configurar aspectos como el canal (pin del PIC) en que se hará la lectura, velocidad de muestreo, estado de la conversión, pines análogos o digitales, entre otros. Por otro lado la conversión resultante se alberga en los registros ADRESH y ADRESL La gráfica lo explica de mejor manera.



Velocidad de Conversión:

La velocidad de muestreo con que se tomarán lecturas en el pin indicado, viene dada por el binario formado por los bits ADCS2-ADCS1-ADCS0, donde cada combinación corresponderá a lo mostrado en la tabla. (extraída del datasheet).

Canal del lectura

El binario formado por CHS2-CHS1-CH0 corresponde al equivalente decimal del canal a leer. Por ejemplo 0b111 corresponde a leer el acanal AN7, mientras que el binario 0b011 corresponderá a AN3.
Bit de Estado de la Conversión

Este bit permanecerá en 1 mientras se esté ejecutando la conversión análogo-digital. Obviamente se debe esperar a que este esté en 0 antes de poder leer el resultado de la conversión.
Canales usados como entrada analógica.

En el binario formado por los bits PGF3-PGF2-PGF1-PGF0, se debe ingersar la combinación correspondiente a los canales digitales o analógicos que se quieran usar, vease la siguiente tabla para más detalle.


REPORT THIS AD


En este caso cabe notar la simplicidad de utlizar 0000 para tener todos los pines analógicos de 0 a 5 volts o 0110 para desactivar la conversión AD y usar esos pines como digitales.
El bit ADFM y como leer el resultado.

El resultado de la conversión, finalmente será un numero de 0 a 1023 correspondiente a los 0 a 5 volts, tal como se muestra en la primera Imagen bajo el título principal. Este número al ser de 10 bits no cabe en un solo registro y es por eso que se utilizan dos (ADRESH y ADRESL) en binario puede parecer dificil de entender pero en en el lenguaje C de XC8 basta con sumar ambos registros y almacenar el reslutado en un INT para tener el número entre 0 y 1023 correspondiente a la conversión.
Función para Leer un Canal en Especifico.

A continuación, con el fin de simplificar la lectura de un canal en particular, se presenta una función tomada del sitio electrosome.com, que puede ser libremente copiada e incluida en el código y llamada desde el main(). En este caso, la función esta preseteada con todo los pines AN habilitados para lectura analógica y ya se han considerado los tiempos mínimos requeridos en la lectura.void ADC_Init() { ADCON0 = 0b10000001; // ADCON1 = 0b10000000; } //Función que lee el voltaje unsigned int ADC_Read(unsigned char channel) { if(channel > 7) return 0; ADCON0 &= 0xC5; ADCON0 |= channel<<3; __delay_ms(2); GO_nDONE = 1; while(GO_nDONE); return ((ADRESH<<8)+ADRESL); }



REPORT THIS AD


La función retorna como un número entero el número entre 0 y 1023 resultante de la medición. Por ejemplo, la siguiente instrucción guardará en la variable medición el resultado de la conversión en el pin AN1. (medición es un INT)medicion=ADC_Read(0);
Mostrando la medición en una pantalla LCD

El código a continuación, muestra el resultado de la medición en un pantalla LCD, es decir un número de 0 a 1024, tal como se muestra en la imagen.

  • Lectura de un puerto analógico
  • Sensor de temperatura LM35
  • Sensor de temperatura DS18B20

PROTEUS


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:

    //Desactivar dip switch de DISPLAYS para correcto funcionamiento.
    //Entrada analógica en el puerto A3.

    #include <16f877a.h>             // Incluimos archivo con PIC a utilizar
    #device adc=8                    // Utilizamos 8 bits de RESOLUCION 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 lectura=0;

    void main ()
    {
       lcd_init () ;                       // Inicializamos pantalla LCD
       printf (lcd_putc, "\fLECTURA ANALOGICA") ;  // Mandamos mensaje por única vez

       //Configuración del puerto analógico
       setup_adc_ports (AN0_AN1_AN3);
       setup_adc (ADC_CLOCK_INTERNAL);
       set_adc_channel (3); //lectura del canal analogico 3
       delay_us (20);
       
       WHILE (true)
       {
          lectura = read_adc ();        // Leemos Canal A0
          delay_ms (20) ;               // esperamos para una correcta lectura
          lcd_gotoxy(1,2);              // ubicamos cursos en LCD
          printf (lcd_putc, "Puerto A3: %4u", lectura); // imprimimos valor
          delay_ms(100);                // esperamos
          
        }
    }
8. TAREAS A SER EVALUADAS:


  1. Realice los cambios sugeridos a continuación y muestre sus resultados

  1. Donde dice “#device adc=8” cambie por “#device adc=10”; convierta la variable “lectura” en entero de 16 bits y la línea printf cambie “%4u” por “%4lu”. ¿Cuál es el cambio mostrado en la pantalla LCD? ¿por qué?.

    1. Convierta el valor leído en valor de voltaje de 0 a 5 voltios. Para esto cambie la variable “lectura” a variable tipo float y configure su forma de mostrarse en el LCD. Luego, en la función While(true),  añada la instrucción “lectura = lectura / 204.6”. Cambie las instrucciones para que en la pantalla del LCD aparezca algo así “Tension: 3.456 v”.

    1. Finalmente agregue una condición IF para que si el valor de voltaje supera 4.5 voltios, mostrar el mensaje “WARNING” en la primera línea del LCD.
TERMOSTATO DIGITAL CON CONTROL ON-OFF:
Se trata de un circuito que deberá controlar el encendido y apagado de un relé (el cual se supone que conecta/desconecta un elemento calefactor) dependiendo de la temperatura leída en el sensor y de la temperatura seteada por los pulsadores respectivos. La pantalla LCD y los leds muestran el estado del termostato.

Este proyecto deberá contar con las siguientes partes:

 

Textos a mostrar en la pantalla LCD:
Condiciones de funcionamiento:
-        La pantalla inicial deberá mostrarse al principio durante 2 segundos, luego deberá mostrarse la pantalla normal.
-        Para aumentar o disminuir la temperatura SET, deberá presionarse los pulsadores respectivos, pero aún no debe controlar la salida de relé, sino hasta presionar “aceptar”. El botón “cancelar” ejerce la función de RESET y detiene todo el proceso.
-        El sensor de Temperatura será emulado mediante un potenciómetro (RA3) y su rango será de 0 a 100 grados centígrados.
-        El rango de temperatura OK será de 10 grados. Ejemplo: si SET=80, el led verde debe encender si Temp varía entre 75 y 85 grados. (Opcional).
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.

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.