sábado, 16 de noviembre de 2019

L12-Manejo de Timer y las Interrupciones

LABORATORIO 12


Manejo de Timer y las Interrupciones


1. OBJETIVOS
  • 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.
2. MARCO TEÓRICO

TIMER0  PIC 16F877A

El timer0 PIC es un temporizador contador de 8 bits, el registro TMR0 es el temporizador, 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.

3. TAREAS REALIZADAS

a) Problema planteado:

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:

    1. Al presionar pulsador en D0, incrementar SEGUNDOS,  el temporizador aún no debe estar contando el tiempo. (sirve para configurar tiempo de cuenta).
    2. Al presionar pulsador en E0, incrementar  MINUTOS, el temporizador aún no debe estar contando el tiempo. (sirve para configurar tiempo de cuenta).
    3. Al presionar pulsador en D1, iniciar CUENTA REGRESIVA desde los minutos previamente configurados.
    4. Si la cuenta llega a 00:00, congelar la cuenta y sonar BIP 3 veces.


4.VIDEO







5. OBSERVACIONES
  • Durante el presente laboratorio se aprendió el correcto funcionamiento del Timer0 en el PIC 16F877A, así como los algoritmos necesarios en relación a la programación para su adecuado manejo.
  • Tanto en un temporizador ascendente como descendente la variable centena debe estar siempre incrementándose y no decrementándose, ya que esta variable realiza la operación de funcionamiento del temporizador ya sea para aumentar tiempo o quitar tiempo.
  • Se utilizó una “variable contador”, el cual me permite saber si el temporizador ya realizó la cuenta regresiva programada y de esa manera recién hacer sonar los bips correspondientes.
  • Se utilizó la función Bip en la programación, esto con la finalidad del funcionamiento de la bocina, ya que esta trabaja no con señal continua sino con alterna; y para simularlo se utilizó un bucle for que activa y desactiva el mismo.
6. CONCLUSIONES

  • En conclusión, para el desarrollo del problema propuesto en el laboratorio, se hizo uso de 3 pulsadores D0, E0, D1. Con el D0 y E0 podemos incrementar el cronometro en segundos y minutos respectivamente, y con el D1 podemos iniciar la cuenta regresiva de dicho temporizador.
  • Se concluye que se realizó un algoritmo de programación utilizando condicionales “if”, para poder limitar la subida ascendente de los segundos, ya que, al no realizarlo, aparecería en nuestro LCD 60, 61 a más segundos, lo cual sería incorrecto.
  • Se logró congelar el temporizador en cero minutos y ceros segundos se utilizó la relación condicional de que si minutos es igual a -1, se detenga el temporizador, ya que de lo contrario empezaría la cuenta otra vez en 255.
  • También se concluyó que se debe usar un delay después de presionar cada pulsador, esto con la finalidad de evitar falsos disparos y hacer que nuestra configuración de segundos y minutos sea lo más precisa posible ya que de lo contrario, al presionar un pulsador, este aumentaría desproporcionalmente.

jueves, 7 de noviembre de 2019

L11-Programación de una Pantalla LCD

LABORATORIO 11


Programación de una Pantalla  LCD


1. OBJETIVOS
  • Conocer el Display LCD y su funcionamiento
  • Programar eficientemente el LCD
  • Programar HMI para proyecto actual.

2. MARCO TEÓRICO

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 el presente laboratorio se usó 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.

Conexión del LCD:


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).
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 empleamos la librería "lcd.c”, en la cual 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.



3. TAREAS REALIZADAS

a) Problema planteado:

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


4.VIDEO






5. OBSERVACIONES

  • El entrenador brindado en el laboratorio inicialmente no funcionaba, por lo que se tuvo que volver a colocar los jumpers adecuadamente tomando como guía otro entrenador en óptimas condiciones.
  • Al momento de compilar el código de programa en el CCS C compiler nos daba un error, para lo cual se optó  por copiar el archivo 16F877A ubicado dentro de la ruta del programa instalado hacia la carpeta en donde se estaba trabajando el proyecto.
  • En el programa CCS Compiler se debe incluir la librería “lcd.c” para poder trabajar con dicho display de “16x2”, también es muy importante copiar dicho archivo a la carpeta en la cual estamos trabajando para no obtener errores al momento de la compilación.
  • Al momento de simular el código de programación en el Proteus, se debe seleccionar el archivo “.cof”, ya que de lo contrario la simulación no sería la correcta debido a la presencia de fallas y errores.
  • Es muy importante que después de cada instrucción en el CCS COMPILER se coloque el punto y coma, para de esa manera evitar errores en el momento de la compilación.
  • Durante el código de programación una vez ya incluida la librería, se debe hacer uso de la función  “lcd_init ()”, con el cual inicializamos el lcd, ya que de lo contrario no podríamos trabajar con el mismo.
  • Es muy importante trabajar con un bucle while para evitar los anti rebotes ocasionados al presionar el pulsador, el contenido dentro de este bucle while debe ser vacío.
  • Se tuvo que crear una función bip, con el cual lograremos el funcionamiento de la bocina, ya que este funciona  con corriente alterna, y para ello debemos activar y desactivar el PIN correspondiente.
6. CONCLUSIONES

  • En conclusión, se realizó adecuadamente la programación para el funcionamiento de una pantalla LCD con el PIC 16F877A, y para esto es muy importante conocer el data sheet del LCD para una adecuada conexión de sus terminales con el  micro-controlador.
  • Se concluye que en el código de programación se debe usar el comando “lcd_gotoxy”, para poder establecer la posición de escritura del LCD, ya sea este en la primera fila (1,1) o en la segunda fila (1,2).
  • Se logró para la resolución del ejercicio planteado, se usó comandos condicionales, esto con la finalidad de limitar el conteo tanto cuando llegue a su máximo valor, como cuando llegue a su mínimo valor
  • También se concluyó que para poder lograr que el parlante suene indefinidamente al llegar a su valor mínimo, se usó un bucle for, el cual sólo se detenía si presionábamos el pulsador que aumentaba la suma del contador.