Autor Tema: DS1307 y PIC18F4550  (Leído 1876 veces)

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

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
DS1307 y PIC18F4550
« en: 27 de Mayo de 2015, 04:13:44 »
Hola,
No consigo que muestro la fecha en la que se encuentra, la hora funciona correctamente, pero si pongo la fecha dentro del while aparece la fecha pero el tiempo. He probado de varias maneras pero no hay manera, aquí os dejo el código.

Código: [Seleccionar]
#include <18F4550.h>
#fuses XT               //Cristal de cuarzo de 8 MHz
#fuses NOWDT            //Perro guardian deshabilitado
#fuses NOPROTECT        //Inhabilitado la proteccion contra la lectura
#fuses NOLVP
#fuses MCLR             //Reset
#use delay(clock=20000000)
#use i2c(master,SDA=PIN_B5,SCL=PIN_A3,FORCE_SW)    //I2C
#include "C:\Users\LIBRERIAS_CCS\ds1307.c"                  //Reloj
#include "C:\Users\\PROGRAMA_DEFINITIVO\flex_lcd420.c"       //LCD
unsigned int8 sec;
unsigned int8 min;
unsigned int8 hrs;
unsigned int8 day;
unsigned int8 mth;
unsigned int8 year;
unsigned int8 dow;
char time;
unsigned int1 am_pm;
unsigned int8 sec_cache=0;
void main(){
ds1307_init();
 
  // Set date for -> 15 Mayo 2015 Viernes
  // Set time for -> 11:20:55
ds1307_set_date_time(22,5,15,1,11,0,53,20);

 
  while(True)
  {
     ds1307_get_time(hrs,am_pm,min,sec);
     
      if(am_pm){time='P';}
      else{ time='M';}
      if(sec_cache!=sec){
         sec_cache=sec;
         lcd_init();
         lcd_putc('\f');
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\f\%02d:\%02d:\%02d \%cM\n", hrs,min,sec,time);
      }
         
      }
ds1307_get_date(day,mth,year,dow);
lcd_gotoxy(1,2);
         printf(lcd_putc,"\f\%02d:\%02d:\%02d", day,mth,year);
}


Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: DS1307 y PIC18F4550
« Respuesta #1 en: 27 de Mayo de 2015, 04:40:24 »
El clock que tengo es de 32KHz.

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re: DS1307 y PIC18F4550
« Respuesta #2 en: 27 de Mayo de 2015, 13:54:21 »
Hola y saludo desde mexico :) tal ves deberias a probar y modificar incluye esto en tu programa

#INCLUDE  <18F4550.h>
#FUSES     PLL3, CPUDIV1, USBDIV, HSPLL, NOFCMEN, NOWDT, NOPROTECT, NOIESO, PUT
#FUSES     NOBROWNOUT, VREGEN, NOWDT, NOSTVREN, NOLVP, NODEBUG, NOPROTECT, NOCPB
#FUSES     NOXINST, NOWRT, NOEBTRB, MCLR, NOLPT1OSC, NOPBADEN, STVREN, NODEBUG
#USE         DELAY(CLOCK = 48MHZ)
#USE         RS232(BAUD = 9600, XMIT = PIN_A0,RCV = PIN_A1)
#DEFINE    DEBUG

//REGISTROS UTILIZADOS PARA LA COMUNICACION CON EL DS1307
//-------------------------------------------------------
BYTE SEC,MIN,HRS,DAY,MONTH,YEAR,DOW; 

Ahora en el main


DS1307_INIT();                            // INICIALIZAR DS1307
DS1307_SET_DATE_TIME(01,01,13,1,12,00,00);  // AJUSTA LA FECHA A -> 11 DE JULIO DEL 2013 JUEVES
                                           // AJUSTA LA HORA A -> 12:0:0
 WHILE(TRUE)
 {
  DS1307_GET_DATE(DAY,MONTH,YEAR,DOW);     // LEE EL DIA, EL MES, EL AÑO Y DOW
  DS1307_GET_TIME(HRS,MIN,SEC);            // LEE LA HORA, LOS MINUTOS Y LOS SEGUNDOS
  ESCRIBE_HORA();                          // VISUALIZA LA HORA EN LCD
  IF(!INPUT(PIN_D0)) {
     AJUSTA_HORA();
    }
  DELAY_MS(100);
 }



///
Lo siguiente es tomado de la libreria que viene default en ccs compiler

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
 {
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x03);            // Start at REG 3 - Day of week
   i2c_start();
   i2c_write(0xD1);
   dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
   day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
   mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
   year = bcd2bin(i2c_read(0));            // REG 6
   i2c_stop();
 }

 void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
 {
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x00);            // Start at REG 0 - Seconds
   i2c_start();
   i2c_write(0xD1);
   sec = bcd2bin(i2c_read() & 0x7f);
   min = bcd2bin(i2c_read() & 0x7f);
   hr  = bcd2bin(i2c_read(0) & 0x3f);
   i2c_stop();

 }


 

anything