domingo, 28 de abril de 2019

LABORATORIO NRO 7

laboratorio 7



MANAEJO DEL TIMER  Y LAS INTERRUPCIONES 


Competencia especifica de las sesion.
  • conocer el funcionamiento y la configuración de los interruptores.
  • conocer el funcionamiento de los timer en cero.
  • aplicar los conocimientos en la realizacion de un cronometro 
contenido a tratar 
  • interruptores
  • timer en cero 
materiales y equipos 
  • CCS compiler instalado 
  • entrenador PICS
  • pantalla LCD
  • PIC 16F8077A
  • PC  con software de simulación 
Marco teorico.

¿que es un temporizador?

El temporizador contador PIC es utilizado para obtener medidas de tiempos muy precisas, de ahí que se le da el nombre de temporizador, en este caso el temporizador contador PIC funciona con el reloj del sistema; pero también puede ser utilizado para realizar conteos, por lo que también se le llama contador, en este caso el temporizador contador PIC ya no aumenta su valor de uno en uno en cada ciclo de trabajo, sino que lo hará mediante el flanco de subida o el flanco de bajada de alguna señal que llegue a un pin del PIC, estos pines son identificados como TxCKI donde x es el número temporizador contador PIC que será usado como contador.



Display LCD 16 x 2 .

fácilmente con una placa Arduino o un PIC en este caso con el PIC 16F877A y con muy pocas líneas de código. Para ello veamos sus pines para saber como se conectan:
-Pin 1 - Vss: GND o tierra.

-Pin 2 - Vdd: Alimentación Vcc o + 5V.
(Algunos pueden alimentarse a 3 Vcc)

-Pin 3 - V0: Control del contraste del display, conectamos este pin al terminal variable de un potenciómetro conectado a Vcc y Masa en sus terminales extremos.

-Pin 4 - RS: Selección de Registro.
0 lógico: Registro de comandos (escritura),
1 lógico: Registro de datos (escritura, lectura)

-Pin 5 - R / W:
0 lógico: Escritura del LCD.
1 Lógico: Lectura del LCD.

-Pin 6 - Habilitar: El famoso Habilitar de casi todos los componentes de la electrónica digital. Un 1 lógico señala el inicio de la escritura o lectura del LCD, un 0 lógico, desactiva todas las funciones.

-Pin 7-10 - D0 / D3: Pines correspondientes al bus de datos.
D0 corresponde al bit menos significativo.
Estos pines no se utilizan para realizar operaciones sobre el LCD de 4 bits.

-Pin 11-14 - D4 / D7: Pines correspondientes al bus de datos.
D7 corresponde al bit más significativo y se puede utilizar como “Busy Flag”,
Si lees sobre este pin, un archivo lógico nos indica que el LCD está ocupado, no está permitido realizar ninguna operación hasta que se deshabilita.

En la tabla no aparecen, ya que no todas las pantallas disponen de los pinos 15 y 16, se ha modificado la imagen para añadirlos, y son simplemente:

-Pin 15 - Ánodo de la retroiluminación: R + 5V.

-Pin 16 - Cátodo de la retroiluminación: GND.

En el código es necesario incluir la librería del LCD para una correcta programación

Evidencia realizado en el laboratorio 

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.







el codigo en CCS compiler 




guardado del archivo comf para su ejecucion en proteus.







explicacion del funcionamiento en proteus 

funcionamiento 



observaciones 



conclusiones 



foto





bibliografia y pagina web recomendada

  • Marin, Francisco (2007) Diseño basado en microcontroladores . Malaga : Universidad de          Malaga(004.16/M26D)
  • Pereira; Fabio (2007) Microcontroladores PIC.Sao Paulo:s.n.(005.13/P43)




sábado, 6 de abril de 2019

LABORATORIO NRO 6


laboratorio 6


LECTURA DE ENTRADA ANALÓGICAS Y SENSOR DE TEMPERATURA 

competencia especifica de la sesion 
  • lectura analogica en un canal del PIC.
  • configuracion de un sensor de temperatura .
  • lectura analogica eb una pantalla LCD,
contenido a tratar
  • entradas analogicas
  • sensor de temperatura
materiales y equipos 
  • CCS compiler instalado
  • entrenador de PICS
  • pantalla LCD
  • PIC 16F877A
  • PC con software instalado
maco teorico.

¿ que son las señales analogicas?

una señal analógica es un tipo de señal generada por algún tipo de fenómeno electromagnético ;que es representable por una función matemática continua en la que es variable su amplitud y periodo en función del tiempo .




sensor de temperatura LM 35.


- el LM 35 es un sensor de temperatura de buenas prestaciones a un bajo precio .Posee un rango de trabajo desde -55 grados hasta 150 grados .su salida es de tipo analogica y lineal con una pendiente de 10 mV/c .el sensor es calibrado de fabrica a una precison de 0.5 grados.

- como el sensor en analógico, podemos medir con un voltimetro el voltaje de salidad del sensor .





características.
  • consumo de corriente :60 micro amperios
  • esta calibrado para medir en grados 
  • tiene una precison de +-1/4 grados 
  • numero de pines : 3 pines GND,VCC, y Voltaje de salida 
  • resolucion;10mV por cada grado centrigrado 
  • tipo de medicion: salida analogica

sensor de temperatura DS18B20

- El sensor digital de Temperatura DS18B20 , te permite conocer la temperatura utilizando solo 1 cable para datos (1-Wire), puedes utilizar simultáneamente varios sensores en el mismo bus, ya que cada sensor tiene un identificador de fábrica distinto.


- Entre sus aplicaciones más comunes está el sensado de ambientes en edificios, aire acondicionado, maquinaria, control y monitoreo de procesos industriales, etc.




características.


  • Voltaje de Operación: 3.0V – 5.5
  • Rango de Trabajo: -55℃ hasta +125℃ (-67°F to +257°F)
  • Precisión en el rango de -10°C hasta +85°C: ±0.5°C
  • Resolución seleccionable de 9-12 bits
  • No necesita componentes adicionales.
  • Longitud de cable: 1m
  • Cables: Rojo (+VCC), Blanco (DATA), Negro (GND
  • Identificación única de 64 bits.

diferencia entre los  encapsulado 

La única diferencia entre ellos es la forma o encapsulado. Todos tienen tres pines útiles VDD, GND y DQ.



- VDD: es la tensión de alimentación es decir, que voltaje necesita para que el sensor de temperatura DS18B20 funcione correctamente. Podemos alimentar desde 3V a 5,5V. Ojo con este dato ya que es muy interesante cuando queremos trabajar con placas como Arduino MKR1000 y NodeMCU que trabajan a 3,3V.



- GND: es la toma de tierra. A este pin conectaremos la referencia 0V de nuestro circuito.



- DQ: es el pin de datos. Por este pin es por donde se recibirán todos los datos en el protocolo 1-Wire. Este protocolo tiene una ventaja. Como su propio nombre indica (1-Wire significa un cable en español) solo es necesario utilizar un cable para conectar varios sensores de temperatura DS18B20. Por lo tanto, solo utilizaremos 1 pin de nuestro entrenador para conectar múltiples sensores.





Evidencia de la tarea en el laboratorio 

 código del problema

//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=10                    // 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

float lectura=0;
float voltaje=0;
void main ()
{
   lcd_init () ;                       // Inicializamos pantalla LCD
   //printf (lcd_putc, "\fCalefactor") ;  // 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);
   output_c(0b00000000);
 
   WHILE (true)
   {
      lectura = read_adc ();        // Leemos Canal A0
      delay_ms (20) ;               // esperamos para una correcta lectura
      lcd_gotoxy(1,1);              // ubicamos cursos en LCD
      lectura = lectura / 10.23;
      printf (lcd_putc, "Temp: %4.1f °C    ", lectura); // imprimimos valor
      delay_ms(100);                // esperamos
      lcd_gotoxy(1,2);
      voltaje = read_adc ();
      delay_ms (20) ;
      lcd_gotoxy(1,2);              // ubicamos cursos en LCD
      voltaje = voltaje / 204.6;
      printf (lcd_putc, "Voltaje: %4.1f V    ", voltaje);
      if (lectura > 90)
      {
      output_high(Pin_C0);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
         output_low(Pin_C1);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
         output_low(Pin_C2);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
      }
      else if (lectura > 15 && lectura < 90)
      {
      output_high(Pin_C1);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20); 
           output_low(Pin_C2);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
         output_low(Pin_C0);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
      }
      if (lectura < 15)
      {
         output_high(Pin_C2);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
         output_low(Pin_C1);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
         output_low  (Pin_C0);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(20);
      }
   }
}

preguntas sobre el codigo .

 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é?.

-lo que hace es pasar de una lectura de un entero de 8 bits a un nuevo de 16 bits y asi el conteo cambia automáticamente que sera de 0 a 1023.

-Cambiar de "int" a "int16" es para convertir el entero a 16 bits y "%4u" a "%4lu" es para que realice la lectura del entero de 16 bits .


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”.

-Cambiamos de "Puerto A3: % 4u" a "Tension: % 3.1f V", esto lo hacemos para que en el LCD apareza por ejemplo  "voltaje : 5V", variando de 0-5V por eso ponemos  el "%"

- se Modificamos de "lectura=lectura" a "lectura=lectura/204.6" esto lo hacemos para colocar como máximo a 5 V, así el rango será de 0-5V.


el codigo en CCS compiler .





Guardamos el archivo (COMF) para si ejecución en proteus 



Explicacion de su funcionamiento en proteus 

cuando nuestro voltaje sea mayor que 90 grados se enciende el led C0.


cuando nuestro voltaje esta conplendido entre 15 grados  y 90 grados  se enciende el led C1.




cuando nuestro voltaje es menor que 15 grados  se enciende el led C2



Funcionamiento 

https://www.youtube.com/watch?v=UzoDYPF51lM&feature=youtu.be











Observaciones 

  • observamos que es importante saber cuales son las entradas y salida de nuestro PIC 16F877A, específicamente para este laboratorio ya que trabajos señales analógicas .
  • observamos que teniamos que cambiar la lectura de 8 bits ha uno de 16 bit para poder apreciar mejor en el lcd."
  • observamos que cuando hemos puesto lo siguiente "%4 lu" nos salia error(porque habia una ligaro espacio ) en la programación ya que la manera correcta era ponerlo sin ningún espacio, 
  • se observo que que en nuestra programacion teniamos  que entender la función trabajas anteriormente en los laboratorios pasados 
  • observamos que para mover la temperatura usamos un potenciometro para poder hacer la variación 

Conclusiones 

  • se concluyo que las entradas analógicas pueden ser voltaje ,corriente ,etc .
  • concluimos que en nuestro lcd podemos utilizar para mostrar diversos mensajes como voltaje,grados ,temperatura,advertencia así sucesivamente  nostras textos personalizados .
  • se concluyo que para hacer la programación que llevamos con el PIC F877A ,tiene funciones y componentes que necesitamos saber como condiciones,bucles,etc para su correcto funcionamiento

foto


bibliografia y paginas web recomendada
  • Marin, Francisco (2007) Diseño basado en microcontroladores . Malaga : Universidad de          Malaga(004.16/M26D)
  •  Pereira; Fabio (2007) Microcontroladores PIC.Sao Paulo:s.n.(005.13/P43)







LABORATORIO NRO 5

laboratorio 5

PROGRAMACIÓN EN UNA PANTALLA LCD.

  • conocer el display LCD y su funcionamiento.
  • programar eficientemente el LCD
  • programar HMI para proyecto actual.
materiales y equipos .
  • CCS compiler 
  • entrenador de pics
  • pantalla LCD
  • PIC 16F877A
  • PC  de sotfware de simulacion 
marco teorico.

¿Que es un  display LCD ?

es un display alafa numerico de matrix de puntos formado por una pantalla de cristal liquido ,sobre la cual se pueden mostrar mensajes formado por distintos caracteres.

conexiones  LCD.



fácilmente con una placa Arduino o un PIC en este caso con el PIC 16F877A y con muy pocas líneas de código. Para ello veamos sus pines para saber como se conectan:
-Pin 1 - Vss: GND o tierra.

-Pin 2 - Vdd: Alimentación Vcc o + 5V.
(Algunos pueden alimentarse a 3 Vcc)

-Pin 3 - V0: Control del contraste del display, conectamos este pin al terminal variable de un potenciómetro conectado a Vcc y Masa en sus terminales extremos.

-Pin 4 - RS: Selección de Registro.
0 lógico: Registro de comandos (escritura),
1 lógico: Registro de datos (escritura, lectura)

-Pin 5 - R / W:
0 lógico: Escritura del LCD.
1 Lógico: Lectura del LCD.

-Pin 6 - Habilitar: El famoso Habilitar de casi todos los componentes de la electrónica digital. Un 1 lógico señala el inicio de la escritura o lectura del LCD, un 0 lógico, desactiva todas las funciones.

-Pin 7-10 - D0 / D3: Pines correspondientes al bus de datos.
D0 corresponde al bit menos significativo.
Estos pines no se utilizan para realizar operaciones sobre el LCD de 4 bits.

-Pin 11-14 - D4 / D7: Pines correspondientes al bus de datos.
D7 corresponde al bit más significativo y se puede utilizar como “Busy Flag”,
Si lees sobre este pin, un archivo lógico nos indica que el LCD está ocupado, no está permitido realizar ninguna operación hasta que se deshabilita.

En la tabla no aparecen, ya que no todas las pantallas disponen de los pinos 15 y 16, se ha modificado la imagen para añadirlos, y son simplemente:

-Pin 15 - Ánodo de la retroiluminación: R + 5V.

-Pin 16 - Cátodo de la retroiluminación: GND.

En el código es necesario incluir la librería del LCD para una correcta programación

Evidencia de la tarea en el laboratorio .

problema planteado por el profesor .

Se dispone de una pantalla LCD. Elaborar un programa que INCREMENTE un número en 150 unidades cada vez que se presione un pulsador y DECREMENTE dicho número en 25 unidades cada vez que se presione otro pulsador.
Si el valor del número supera 1000 unidades, mostrar en la pantalla LCD en la primera línea: “FULL”. Si el valor llega a ser menor o igual a 10, mostrar “VALOR MINIMO”. En ambos casos el valor del número no debe incrementarse ni decrementarse.

el nuevo código realizado 



#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 = 60; // 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 = dato + 150;
         lcd_gotoxy (1, 1) ;
         printf (lcd_putc, "    CONTADOR    ") ;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;
     
         IF (dato>=1000) {
         lcd_gotoxy (1, 1) ;
         printf (lcd_putc, "     FULL     ") ;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;
     
         WHILE (true)
         {
         IF (!input (PIN_D1))
         {
         dato=dato - 25;
         lcd_gotoxy (1, 1) ;
         printf (lcd_putc, "    CONTADOR    ") ;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;
         WHILE (!input (PIN_D1)) // Rutina ANTIRREBOTE por software
         {}
         }
         if (dato<1000)
         {
         break;
         }
         }
     
         }

         WHILE (!input (PIN_D0)) // Rutina ANTIRREBOTE por software
         {}
      }

      IF (!input (PIN_D1))
      {
     
         dato = dato - 25;
         lcd_gotoxy (1, 1) ;
         printf (lcd_putc, "    CONTADOR    ") ;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;
     
         IF (dato<=10) {
         lcd_gotoxy (1, 1) ;
         printf (lcd_putc, "     VALOR MINIMO      ") ;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;
     
         WHILE (true)
         {dato = 0;
         IF (!input (PIN_D0))
         {
         dato = 0;
         break;
         }
         }
         }

         WHILE (!input (PIN_D1)) // Rutina ANTIRREBOTE por software
         {}
      }
   }

   }

el codigo en ccs c compoler.










Guardado del archivo programado (comf) para su ejecucion en proteus 



explicacion de su funcionamiento en proteus 

 nuestro contador  empieza con el valor de 60.



al presionar presionar una vez  D0 nuestro contador debe aumentar en 150.



al presionar nuevamente D0 nuestro contador debe aumenta en 150.




cuando nuestro contador supere los 1000 debe paracer FULL en la pantalla LCD




cuando presionamos D1 nuestro contador debe disminuir en 25.iniciamos con el contador en 60


cuando es igual o menor que 10 en nuestra pantalla LCD de aparecer valor minimo



FUNCIONAMIENTO.











OBSERVACIONES .
  • observamos que para el correcto funcionamiento de la programador teníamos que incluir la librería del LCD para poder evitar errores en el programa.
  • se observo que en el LCD podemos visulizar y mostrar numero ,textos ,etc .Pero estos son limitados por el caracteres del LCD (16 caracteres horizontales y 2 lineal verticales ).
  • observamos que la funcion PRITF nos permite ver o visualizar los caracteres del LCD como por ejemplo numeros ,textos ,etc.
  • observamos para que hayga un orden en el LDC usamos  lo siguente "lcd_gotoxy(1,1) nos numero que se encuentran dentro no sirve para seleccionar la posocion.


CONCLUSIONES .
  • se concluyo que para hacer las programaciones nosotros tenemos que saber el funcionamiento de cada uno de los funciones como ejemplo IF, ELSE,WHILE.
  • concluimos que en el presente trabajo realizado usamos bastante las condiciones y bucles dentro de una misma condicion.
  •  concluimos que para programar teníamos que sacar una nueva la carpeta del LCD, y asi programar  en nuestro lcd. y así lograr los objetivos planteado en el laboratorio.

Foto


  

 Bibliografia y paginas web recomendada
  • Marin, Francisco (2007) Diseño basado en microcontroladores . Malaga : Universidad de          Malaga(004.16/M26D)
  •  Pereira; Fabio (2007) Microcontroladores PIC.Sao Paulo:s.n.(005.13/P43)