jueves, 25 de abril de 2019

MICRO CONTROLADORES

LABORATORIO NR°7
 Manejo del Timer y las Interrupciones 


I. COMPETENCIAS ESPECIFICAS: 
  • 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 cronometro.
II.MARCO TEÓRICO:

  TIMER: 

El timer es un objeto de programación tiene como funcionalidad ejecutar una función o bloque de código cada cierto tiempo. Esto tiene muchas aplicaciones ya que no depende de la acción por parte de usuario para ejecutar cierto código. Por ejemplo podemos hacer que nuestro programa cheque una tabla de una base de datos y muestre la información actualizada en pantalla cada minuto. También se puede hacer que cuente tiempo.

También es un dispositivo, con frecuencia programable, que permite medir el tiempo. Cuando trascurre el tiempo configurado se hace saltar una alarma o alguna otra función a modo de advertencia, al igual es un elemento que ofrece la posibilidad de usar cualquier dispositivo eléctrico de forma programada, activarlo y desactivarlo a las horas que queremos, sin necesidad de estar presentes. Es una buena forma de ahorrar con un aparato como un termo eléctrico, por ejemplo.
TAREA A RESOLVER :
  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 D1, iniciar CUENTA REGRESIVA desde los minutos previamente configurados.
  3. Si la cuenta llega a 00:00, congelar la cuenta y sonar BIP 3 veces.

PROGRAMACIÓN :

#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=0;
void BIP();
int encendido =0;

#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==-1)
      {
      --minutos;                 // si llegamos a 60, incrementar un minuto
      segundos=59;
      }
   if (segundos==0)              // si llegamos a 3 minutos, hacer alguna acción
      {
      segundos=0;
      disable_interrupts (GLOBAL);          //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
   disable_interrupts (GLOBAL);                 
   
   printf (lcd_putc, "\f***CRONOMETRO***") ;              // Mandamos mensaje por única vez
   
   WHILE (true)
   {
      lcd_gotoxy(2,2);
      Printf(lcd_putc,"Tiempo %02u:%02u",minutos, segundos);
      
     IF (!input(PIN_D0))        
      {
         delay_ms(500); 
         minutos= ++ minutos;
         segundos=0;
         disable_interrupts (GLOBAL);
      }
       IF (!input(PIN_D1))       
      {
         delay_ms(500); 
         segundos= --segundos;
         enable_interrupts (GLOBAL);
         segundos=0;    
         encendido =1;
      }
     
       IF (minutos==0 && segundos==0 && encendido==1 )
   { 
      minutos=0;
      segundos=0;
      encendido=0;
      disable_interrupts (GLOBAL);
      }
      
    }
}

VÍDEO 

CONCLUSIONES 


  • Se concluye que los Timer para los PICs tiene una amplia gama de aplicaciones en la práctica. Sólo unos pocos programas no lo utilizan de alguna forma. Es muy conveniente y fácil de utilizar en programas o subrutinas para generar pulsos de duración arbitraria, en medir tiempo o en contar los pulsos externos (eventos) casi sin limitaciones.
  • El registro TMR0 del timer0 en el PIC está formado por 8 bits por lo que se puede contar desde 0 hasta 255.
  • El circuito utilizado para el ejemplo del uso del Timer como contador.



1 comentario: