Autor Tema: Reloj con display de 7 segmentos  (Leído 5588 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Reloj con display de 7 segmentos
« en: 27 de Enero de 2013, 00:49:36 »
Hola amigos estoy realizando un circuito de reloj alarma con un pic 18f4550, ds1307 y mostrarlos en un display la coa es que yo he visto muchos circuitos pero todos osn en lcd y de paso los que son con display de 7 segmentos me dicen que debo usar la multiplexacion cosa que es lo que estoy implementando, estoy usando la libreria ds1307 que contiene como poner hora, como leerla y cosas asi. Mi duda es que ya tengo mi codigo pero no se porque el valor de segundos me va tan lento no se si es por mi codigo o por mi circuito hecho proteus. Adjunto mi codigo y la simulacion en proteus y no entiendo el cristal que le pongo al ds1307 no me hace efecto. En proteus no tengo el uso de los transitores yo se que al ponerlo en practica lo necesito pero mientras tanto lo he dejado sin transitores. Agradeceria su ayuda porque no entiendoo porque lo minutos estan tan lentos

#include "C:\Users\VictorXZ\Documents\Microprocesadores\paper2\reloj.h"
#include "C:\Program Files (x86)\PICC\Drivers\tones.c"
#include "C:\Program Files (x86)\PICC\Drivers\ds1307.c"
//#define RTC_SDA  PIN_B0
//#define RTC_SCL  PIN_B1
#define USE_INTERRUPTS 1
#define DIG_1 PIN_B2
#define DIG_2 PIN_B3
#define DIG_3 PIN_B4
#define DIG_4 PIN_B5
#define DIG_5 PIN_E0
#define DIG_6 PIN_E1
#define DIG_7 PIN_B6
#define DIG_8 PIN_B7
#define DIG_9 PIN_C0
#define DIG_10 PIN_B7
#define DIG_11 PIN_C0
#define DIG_12 PIN_C1
#define DIG_13 PIN_C2
#define DIG_14 PIN_E2
#define DIG_15 PIN_D7

INT digitos[16]={0b00111111,0b00000110,0b001011011,0b01001111 ,0b01100110,0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111,0b01110111 ,0b01111100,0b00111001, 0b01011110, 0b01111001, 0b01110001 };

Long int delay_1=10;
int1 dump;
int1 kdump;
int alta=0;
int baja=0;
int minuto;
byte sec,min, hrs, day ,month, year, dow;

void leer_hora_fecha(void){

     byte temp;
     byte retval;

     ds1307_get_date(day,month,year,dow);
     ds1307_get_time(hrs,min,sec);

     sec=ds1307_bin2bcd(sec);alta = (sec & 0xF0) >> 4;baja = sec & 0x0F; //Convierto el numero en bcd y luego lo divido en 2 partes de 4 bits para cada par display

    output_high(DIG_1);output_high(DIG_2);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5); //Con esto logro que se apaguen todos los display que pienso usa
    output_high(DIG_6);output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);
    output_high(DIG_11);output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);


    output_d(digitos[alta]);
    output_low(DIG_1);
    output_high(DIG_2);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5);output_high(DIG_6);
    output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);;output_high(DIG_10);output_high(DIG_11);
    output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);

    delay_ms(delay_1);

    output_high(DIG_1);output_high(DIG_2);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5);
    output_high(DIG_6);output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);
    output_high(DIG_11);output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);


    output_d(digitos[baja]);
    output_low(DIG_2);
    output_high(DIG_1);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5);output_high(DIG_6);
    output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);output_high(DIG_11);
    output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);


    delay_ms(delay_1);

    output_high(DIG_1);output_high(DIG_2);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5);
    output_high(DIG_6);output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);
    output_high(DIG_11);output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);
    min=ds1307_bin2bcd(min);alta = (min & 0xF0) >> 4;baja = min & 0x0F; //Convierto el numero en bcd y luego lo divido en 2 partes de 4 bits para cada par display


    output_d(digitos[alta]);
    output_low(DIG_3);
    output_high(DIG_1);output_high(DIG_2);output_high(DIG_4);output_high(DIG_5);output_high(DIG_6);
    output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);output_high(DIG_11);
    output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);


    delay_ms(delay_1);

    output_high(DIG_1);output_high(DIG_2);output_high(DIG_3);output_high(DIG_4);output_high(DIG_5);
    output_high(DIG_6);output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);
    output_high(DIG_11);output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);


    output_d(digitos[baja]);
    output_low(DIG_4);
    output_high(DIG_1);output_high(DIG_2);output_high(DIG_3);output_high(DIG_5);output_high(DIG_6);
    output_high(DIG_7);output_high(DIG_8);output_high(DIG_9);output_high(DIG_10);output_high(DIG_11);
    output_high(DIG_12);output_high(DIG_13);output_high(DIG_14);output_high(DIG_15);

}


void main()
{


   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_spi2(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


// ext_int_edge(2,H_TO_L);
 //  flanco=0;

//   enable_interrupts(int_ext2);
  // enable_interrupts(int_rda);
   //enable_interrupts(global);



   // TODO: USER CODE!!
  ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);// inicializo el ds1307
  ds1307_set_date_time(12,12,1991,0,2,39,2);//poner la hora al reloj

dump = 0;
kdump= 1;

   do{

      if(dump==1){
         if((dump!=kdump)&&dump==1){
            kdump=dump;
         }
         delay_ms(1);
         leer_hora_fecha();
      }else{
         if((dump!=kdump)&&dump==0){
            dump= kdump;
         }
      }
   } while (TRUE);


}


Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Reloj con display de 7 segmentos
« Respuesta #1 en: 27 de Enero de 2013, 10:11:55 »
Es normal en Proteus. Proteus consume todos los recursos del PC dejandolo superlento. Observa abajo de la ventana de simulacion, que pone algo asi: "Uso de CPU" y veras que te pone 100 %.
Normalmente no se aprecia tanto en circuitos generales, pero en un reloj, que precisamente mide el tiempo, se ve clarito lo lento que es Proteus, a mi me ocurre con una prueba de otro reloj que ni siquiera usa el ds1307 sino que genera la hora directamente por software.
Por todo ello no te compliques con eso y para mayor seguridad, monta tu reloj en una placa de pruebas, (protoboard).

Saludos.

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Reloj con display de 7 segmentos
« Respuesta #2 en: 27 de Enero de 2013, 18:43:03 »
chuta amigo gracias por tu enorme aclaracion ya voy a probar en proto haber como sale, tengo una pregunta usando el ds1307 puedo grabar horas x ejemplo de 21:00 22:00 23:00 o se graban como 09:00 10:00 porque yo relamente quiero setear la hora con el formato 21:00 puedes aclarame eso y como deberia hacerlo?

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: Reloj con display de 7 segmentos
« Respuesta #3 en: 28 de Enero de 2013, 19:03:31 »
El DS1307 puede trabajar tanto en modo 12 horas con indicador de AM, PM, como en modo 24 horas.
Esta explicado en su hoja tecnica, echale un vistazo.

Saludos.

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Reloj con display de 7 segmentos
« Respuesta #4 en: 29 de Enero de 2013, 16:22:45 »
yo se pero lo que me baso es que x ejemplo si el bit 6 esta encendido es formato 12 y si estaba apagado es formado 0 pero la cosa esq aunque ponga 1 o 0 en el cuadrito que aparece cuando uno le hace click al ds1307 me sigue monstrando horas de 24 y segun yo si yo le seteo un valor de 23 siendo el formato de 12 me deberia aparecer un error o algo pero nada yo le seteo con valores mayores a 12 e igual aparece en el ds1307

Desconectado victorzx

  • PIC10
  • *
  • Mensajes: 19
Re: Reloj con display de 7 segmentos
« Respuesta #5 en: 01 de Febrero de 2013, 03:35:57 »
 printf("Test de la NVRAM interna (Write and read) ...\r\n\n");
   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
      ds1307_write_nvram_byte(i,i);
   }
   n=0;
   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
      c=ds1307_read_nvram_byte(i);
      printf("%X ",c);
      if(++n==0x0f){
         n=0;
         printf("\r\n");
      }
   }
   printf("\r\n");

Segun este codgio es para escribir y grabar en la nvram pero no entiendo algo de la escritura
ds1307_write_nvram_byte(i,i);
dice que se graba en tal direccion y graba ese mismo valor y en la lectura lo lee pero segun este codigo se graba los valores que yo haya steado anteriormente...pero no entiendo como