Proyecto dos (libre)

MICROCONTROLADORES

Título del Proyecto

RELOJ DIGITAL DE 24 HORAS CON PIC 16F877A

Objetivo General

RECONOCER LA APLICACIÓN Y UTILIZACIÓN DEL PIC  16F877A A TRAVÉS DE LA APLICACIÓN DEL RELOJ DIGITAL UTILIZANDO EL LENGUAJE C APLICADO A MICRO CONTROLADORES.

Objetivo Específico

- Aprender la programación en este pic en el uso del reloj digital
- Hacer uso del lenguaje c para la programación del pic 16f877A
- Aprender a usar entradas y salidas analógicas del pic 16f877A

 Justificación

Este proyecto tiene  por finalidad mejorar a programar, y poner en práctica a través de un reloj digital, haciendo uso de lo aprendido y utilizando el pic 16F877A.
también este proyecto es viable porque no utilizamos una lógica cableada sino una lógica de programación que nos permite modificar su estructura fácilmente acorde al avance tecnológico.
esta dirigido aquellas áreas como molles,bibliotecas,estadios,centros históricos y en general lugares donde concurrentes donde se necesita saber la hora 


Diagrama de Bloques


          Hardware propuesto utilizando Proteus.

PARTE 1
PARTE 2


Temas de investigación.

¿Timers?


Un timer no es más que un contador cuya entrada está conectada al reloj del sistema. De hecho, la mayoría de los timers pueden reconfigurarse como contadores. En ese caso, en lugar de contar pulsos de reloj cuentan los pulsos que llegan a un determinado pin.


Por defecto la señal que van a contabilizar los timers corresponde a la frecuencia del oscilador dividida por cuatro. Por lo tanto en realidad cuentan ciclos máquina, no ciclos de reloj. Con un reloj de 20 Mhz tendríamos una frecuencia de ciclos máquina de 20/4 = 5 MHz, por lo que un ciclo máquina corresponde a 0.2 usec. En principio, el contador del timer se incrementará cada 0.2 microsegundos o 5 veces en 1 usec


¿Qué ventajas tiene usar las Interrupciones y los Timers?



Una interrupción es un aviso provocado por un módulo del PIC, por un cambio en el estado de un pin o un recordatorio de que ha pasado un cierto tiempo. Como su nombre indica este aviso interrumpirá la tarea que se este haciendo en ese momento y pasaremos a ejecutar una rutina de servicio o gestión de la interrupción.

CIRCUITO DS 1307


El DS1307  de Maxim/Dallas es un circuito integrado reloj en tiempo real (RTC) capaz de almacenar y llevar la cuenta de la fecha y hora de manera autónoma, además disponemos de unos cuantos bytes de memoria RAM no volátil (NVRAM)para almacenar datos arbitrarios. En esta entrada, exploraremos las ventajas y operaciones básicas del circuitoDS1307 instalado en el módulo TinyRTC, también explicaremos su funcionamiento en conjunto con una placa arduino para aquellas aplicaciones que requieren un control preciso del tiempo.
El módulo Tiny RTC, además de todo el circuito de soporte para el DS1307, incluye también una memoria EEPROM I2C para almacenar datos en ella y un zócalo para soldar de manera opcional un sensor de temperatura DS18B20 (one-wire),  sin embargo en esta ocasión trataremos únicamente el uso del DS1307; el uso de la memoria EEPROM y el sensor quedarán de tarea para el lector.

AVANCE DEL PROYECTO

Exlicacion del programa
 https://www.youtube.com/watch?v=xJOrmtBj-Jk&feature=youtu.be


>>Programación del proyecto en CCS Compiler:

________________________________________________________________________


#include <16f877A.h>
#fuses hs
#use delay(clock=20M)
#include <DS1307.c>
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d3
#define lcd_rs_pin pin_d2
#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>

void estadoUno(); 
void seleccion(); 
void mostrarSeleccion();
void programacion();
void cambioEstado();

int sec=50,min=59,hora=23,dia=2, mes=10,anio=17,dow=0,estado,eleccion;
char fecha[5];

void main(){
   estado=1;
   port_b_pullups(true);
   lcd_init();
   //ds1307_init(DS1307_OUT_1_HZ);
   ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
   ds1307_get_date(dia,mes,anio,dow);        /// se obtiene la fecha  
    ds1307_get_time(hora,min,sec);             /// se obtiene la hora
    ds1307_get_day_of_week(fecha);

   while(true)
   {     
      while(estado==1){//ejecución
         estadoUno();
         cambioEstado();
      }
      while(estado==2){//Seleccion
         seleccion();
         mostrarSeleccion();
         cambioEstado();
      }
      while(estado==3){//Ajuste
         programacion();
         ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
         mostrarSeleccion();
         cambioEstado();
      }
   }
}

void programacion(){
    if(input(PIN_A1)){
      switch(eleccion){
      case 0:
         if(hora < 23 ){
            hora +=1;
            delay_ms(200);
         }
         else{
            hora =0;
            delay_ms(200);
         }
         break;   
      case 1:
          if(min < 59 ){
            min +=1;
            delay_ms(200);
         }
         else{
            min =0;
            delay_ms(200);
         }
         break;   
      case 2:
         if(sec < 59 ){
            sec +=1;
            delay_ms(200);
         }
         else{
            sec =0;
            delay_ms(200);
         }
         break;
      case 3:
         if(dia <31 ){
            dia +=1;
            delay_ms(200);
         }
         else{
            dia =1;
            delay_ms(200);
         }
         break; 
      case 4:
         if(mes <12 ){
            mes +=1;
            delay_ms(200);
         }
         else{
            mes =1;
            delay_ms(200);
         }
         break; 
      case 5:
         anio+=1;
         delay_ms(200);
         break; 
      }      
    }
    if(input(PIN_A2)){
    
      switch(eleccion){
      case 0:
         if(hora > 0 ){
            hora -=1;
            delay_ms(200);
         }
         else{
            hora =23;
            delay_ms(200);
         }
         break;   
      case 1:
          if(min > 0 ){
            min -=1;
            delay_ms(200);
         }
         else{
            min =59;
            delay_ms(200);
         }
         break;   
      case 2:
         if(sec >0 ){
            sec -=1;
            delay_ms(200);
         }
         else{
            sec =59;
            delay_ms(200);
         }
         break;   
      case 3:
         if(dia >1 ){
            dia -=1;
            delay_ms(200);
         }
         else{
            dia =31;
            delay_ms(200);
         }
         break; 
      case 4:
         if(mes >1 ){
            mes -=1;
            delay_ms(200);
         }
         else{
            mes =12;
            delay_ms(200);
         }
         break; 
      case 5:
         if(anio >1 ){
            anio-=1;
            delay_ms(200);
         }
         break; 
      } 
    }  
}
void cambioEstado(){

    if(input(PIN_A3)){
      estado+=1;
      delay_ms(500);
      printf(lcd_putc,"\f");
      if(estado == 4){
         estado=1;  
      }
    }
}
void estadoUno(){
    ds1307_get_date(dia,mes,anio,dow);        /// se obtiene la fecha  
    ds1307_get_time(hora,min,sec);             /// se obtiene la hora
    ds1307_get_day_of_week(fecha);
    lcd_gotoxy(1,1);
    printf(lcd_putc,"%s %02u/%02u/20%02u",fecha,dia,mes,anio);
    lcd_gotoxy(5,2);
    printf(lcd_putc, "%02u:%02u:%02u",hora, min, sec);
   //delay_ms();
}
void seleccion(){
    if(input(PIN_A1)){
      delay_ms(200);
      if(eleccion<5)
         eleccion+=1;
    }
    if(input(PIN_A2)){
      delay_ms(200);
      if(eleccion>0)
         eleccion-=1;
    }
}

void mostrarSeleccion(){
   if(estado==2)
      printf(lcd_putc," ");
   lcd_gotoxy(1,1);
   switch(eleccion){
      case 0:
         printf(lcd_putc,"*           ");
         break;   
      case 1:
         printf(lcd_putc,"   *       ");
         break;   
      case 2:
         printf(lcd_putc,"      *    ");
         break;   
      case 3:
         printf(lcd_putc,"*           ");
         break;   
      case 4:
         printf(lcd_putc,"   *       ");
         break;   
      case 5:
         printf(lcd_putc,"      *    ");
         break;   
   }
   lcd_gotoxy(1,2);
   if(eleccion<=2)
      printf(lcd_putc,"%02d:%02d:%02d\n",hora,min,sec);
   else
      printf(lcd_putc,"%02d/%02d/%02d\n",dia,mes,anio);
}



>>simulación en proteus:




  • armado del circuito en protoboard. 

  • probando el programa en el entrenador. 

  • Video de la prueba en el entrenador UFK-010U.


https://youtu.be/B_pzlXCgrJg

  • Armado del circuito en físico.



Observaciones y conclusiones. 
  • Tras realizar este proyecto pudimos entender y comprender mucho mejor el lenguaje C aplicado a la electrónica.
  • Luego de haber desarrollado este proyecto podemos concluir que el pic 16f877A nos permite obtener salida y entradas tanto analógica y digitales.
  • se uso formatos como el cero a la izquierdacuando el digito de las fechas es solo uno de los días y meses ademas de las horas,minutos y segundos para mostrar por lcd.
  • Se puede concluir que el circuito ds1307 almacena y lleva la cuenta de la fecha y hora de manera autómata.
  • Se utilizo el pic 16f877A
  • en el programa utilizamos resistencias internas para nuestra función principal.
  • se uso la librería ds 1307, la cual nos provee de funciones de fecha y hora.
  • se utilizo una batería externa de 3v para no perder la información de cuando el circuito se apague.


  Integrantes (incluir foto de los mismos)
Integrantes:

Tolentino Samar Gustavo .
Chara Velazco Juan .
Achinquipa Jefferson .
Ventura Apaza Jonathan

Comentarios