hora errada com DS1307 + CCS[resolvido]

Enviado:
05 Set 2009 21:42
por cristian
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

Enviado:
05 Set 2009 22:06
por Sergio38br
de uma olhada
http://ww1.microchip.com/downloads/en/A ... 00974A.pdf
tambem tem uma arquivo zip com o software
[ ]`s
Sergio

Enviado:
05 Set 2009 22:17
por cristian
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

Enviado:
05 Set 2009 23:08
por andre_luis
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 ) ) ;
}
////////////////////////////////////////////////////////////////

Enviado:
05 Set 2009 23:13
por cristian
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);
}

Enviado:
06 Set 2009 18:15
por cristian
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