hora errada com DS1307 + CCS[resolvido]

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

hora errada com DS1307 + CCS[resolvido]

Mensagempor cristian » 05 Set 2009 21:42

estou fazendo um projeto e preciso de data e hora estou usando um DS1307

mas a data e hora sai assim 45/25/165 45:85:85

logo ao ligar o pic mando gravar 05/09/09 12:00:00 e ao ler sai aquela data errada
Editado pela última vez por cristian em 06 Set 2009 18:14, em um total de 1 vez.
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Sergio38br » 05 Set 2009 22:06

de uma olhada

http://ww1.microchip.com/downloads/en/A ... 00974A.pdf

tambem tem uma arquivo zip com o software

[ ]`s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor cristian » 05 Set 2009 22:17

nao entendi como acho o erro no meu codigo

o intrigante é que no proteus funcina normal tanto a memoria quanto o rtc

mas na pratica nao
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor andre_luis » 05 Set 2009 23:08

Segue trecho do meu programa, que funcionou.
Foi feito em CCS.
Também aconteceu algo estranho. Quando tentei usar o I2C por HW não funcionou. Tive que forçar a diretiva para compilar por FW.


Código: Selecionar todos

#use i2c ( MASTER , SLOW /*, NOFLOAT_HIGH , FORCE_HW */ , SDA=I2C_SDA , SCL=I2C_SCL )

////////////////////////////////////////////////////////////////////////
void init_I2C ( void )
{
   output_float( I2C_SCL )     ;
   output_float( I2C_SDA )     ;
}
////////////////////////////////////////////////////////////////////////
int1 i2c_ready ( unsigned int8 address )
{
   int1 ack                    ;
   i2c_start()                 ;  // If the write command is acknowledged,
   ack = i2c_write( address )  ;  // then the device is ready.
   i2c_stop()                  ;
   return ( !ack )             ;
}
////////////////////////////////////////////////////////////////////////
void ds1307_send_time( void )
{
   delay_us   ( 10 )                      ;     /* Solucao Empirica       */
   i2c_start()                            ;     /* START CONDITION        */
   i2c_write( SELECT_DS1307 | ESCRITA )   ;     /* SLAVE ADDRESS -> WRITE */
   i2c_write( MINUTES )                   ;     /* WORD ADDRESS           */
   i2c_write( Minuto_ds1307_digitos )     ;     /* WRITE DATA             */
   i2c_write( Hora_ds1307_digitos   )     ;     /* WRITE DATA             */
   i2c_write( Semana_ds1307_digitos )     ;     /* WRITE DATA             */
   i2c_write( Dia_ds1307_digitos )        ;     /* WRITE DATA             */
   i2c_write( Mes_ds1307_digitos )        ;     /* WRITE DATA             */
   i2c_write( Ano_ds1307_digitos )        ;     /* WRITE DATA             */
   i2c_stop()                             ;     /* STOP CONDITION         */
   delay_ms  ( 50 )                       ;     /* Solucao Empirica       */
}
////////////////////////////////////////////////////////////////////////
void ds1307_get_time( void )
{
i2c_start()                          ;
i2c_write( SELECT_DS1307 | ESCRITA ) ;
i2c_write( MINUTES )                 ;
i2c_start()                          ;
i2c_write( SELECT_DS1307 | LEITURA ) ;
Minuto_ds1307_digitos = i2c_read()   ;
Hora_ds1307_digitos   = i2c_read()   ;
Semana_ds1307_digitos = i2c_read()   ;
Dia_ds1307_digitos    = i2c_read()   ;
Mes_ds1307_digitos    = i2c_read()   ;
Ano_ds1307_digitos    = i2c_read()   ;
i2c_stop()                           ;
}
////////////////////////////////////////////////////////////////////////
void clock_initiate( void )
{
unsigned int8 Time[] =  __time__         ;
unsigned int8 HoraDecimal                ;
unsigned int8 MinutoDecimal              ;
unsigned int8 HoraDezena                 ;
unsigned int8 HoraUnidade                ;
unsigned int8 MinutoDezena               ;
unsigned int8 MinutoUnidade              ;
unsigned int8 Data[] =  __date__         ;
unsigned int8 DiaDecimal                 ;
unsigned int8 MesDecimal                 ;
unsigned int8 AnoDecimal                 ;
unsigned int8 DiaDezena                  ;
unsigned int8 DiaUnidade                 ;
unsigned int8 MesDezena                  ;
unsigned int8 MesUnidade                 ;
unsigned int8 AnoDezena                  ;
unsigned int8 AnoUnidade                 ;
HoraDecimal   = ( ( ( Time[0]-'0' ) * 10 ) + ( Time[1]-'0' ) ) ;
MinutoDecimal = ( ( ( Time[3]-'0' ) * 10 ) + ( Time[4]-'0' ) ) ;
HoraDezena    = ( HoraDecimal / 10 ) ;
HoraUnidade   = ( HoraDecimal % 10 )  ;
MinutoDezena  = ( MinutoDecimal / 10 ) ;
MinutoUnidade = ( MinutoDecimal % 10 )  ;

DiaDecimal    = ( ( ( Data[0]-'0' ) * 10 ) + ( Data[1]-'0' ) ) ;
AnoDecimal    = ( ( ( Data[7]-'0' ) * 10 ) + ( Data[8]-'0' ) ) ;
DiaDezena     = ( DiaDecimal / 10 ) ;
DiaUnidade    = ( DiaDecimal % 10 )  ;
AnoDezena     = ( AnoDecimal / 10 ) ;
AnoUnidade    = ( AnoDecimal % 10 )  ;

switch ( Data[3] )
   {
   case 'J' :
   case 'j' :
      if ( ( Data[4] == 'A' ) || ( Data[4] == 'a' ) )
         {
         MesDezena  = 0 ;
         MesUnidade = 1 ;
         }
         else
            {
            if ( ( Data[5] == 'N' ) || ( Data[5] == 'n' ) )
               {
               MesDezena  = 0 ;
               MesUnidade = 6 ;
               }
               else
               {
               MesDezena  = 0 ;
               MesUnidade = 7 ;
               }
            }
   break ;
   ///////////////////
   case 'F' :
   case 'f' :
      MesDezena  = 0 ;
      MesUnidade = 2 ;
   break ;
   ///////////////////
   case 'M' :
   case 'm' :
      switch ( Data[5] )
         {
         case 'R' :
         case 'r' :
            MesDezena  = 0 ;
            MesUnidade = 3 ;
         break ;
         case 'I' :
         case 'i' :
            MesDezena  = 0 ;
            MesUnidade = 5 ;
         break ;
         }
   break ;
   ///////////////////
   case 'A' :
   case 'a' :
      switch ( Data[4] )
         {
         case 'B' :
         case 'b' :
            MesDezena  = 0 ;
            MesUnidade = 4 ;
         break ;
         case 'G' :
         case 'g' :
            MesDezena  = 0 ;
            MesUnidade = 8 ;
         break ;
         }
   break ;
   ///////////////////
   case 'S' :
   case 's' :
      MesDezena  = 0 ;
      MesUnidade = 9 ;
   break ;
   ///////////////////
   case 'O' :
   case 'o' :
      MesDezena  = 1 ;
      MesUnidade = 0 ;
   break ;
   ///////////////////
   case 'N' :
   case 'n' :
      MesDezena  = 1 ;
      MesUnidade = 1 ;
   break ;
   ///////////////////
   case 'D' :
   case 'd' :
      MesDezena  = 1 ;
      MesUnidade = 2 ;
   break ;
   }

  ds1307_send_byte( CONTROL, CONTROL_WORD );
  ds1307_send_byte( SECONDS ,        ( CH | 0 )                              ) ;
  ds1307_send_byte( MINUTES ,        ( ( MinutoDezena << 4 ) | MinutoUnidade ) ) ;
  ds1307_send_byte( HOURS   ,        ( ( HoraDezena   << 4 ) | HoraUnidade   ) ) ;
  ds1307_send_byte( DAY     ,                         INIT_DAY               ) ;
  ds1307_send_byte( DATE    ,        ( ( DiaDezena   << 4 )  |  DiaUnidade   ) ) ;
  ds1307_send_byte( MONTH   ,        ( ( MesDezena   << 4 )  |  MesUnidade   ) ) ;
  ds1307_send_byte( YEAR    ,        ( ( AnoDezena   << 4 )  |  AnoUnidade   ) ) ;
}
////////////////////////////////////////////////////////////////
Editado pela última vez por andre_luis em 05 Set 2009 23:24, em um total de 2 vezes.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor cristian » 05 Set 2009 23:13

este é meu codigo ..biblioteca do ccs


como configurar o I2C para 100khz no CCS ??
e o ID do ds1307 e 24c256 qual é ??


void ds1307_init(void)
{
BYTE seconds = 0;

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307

i2c_stop();
seconds &= 0x7F;

delay_Ms(10);

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0) ; // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x80); // Disable squarewave output pin
i2c_stop();
delay_Ms(7);
}


void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;

i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2c_stop();
delay_Ms(7);
}


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();
delay_Ms(7);
}

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() & 0x3f);

i2c_stop();
delay_Ms(7);

}
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor cristian » 06 Set 2009 18:15

era tensao alta no pino da bateria tinha um diodo do +5v para bateria e dava 4,3v foi tirar o diodo o relogio funcionar
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x