Página 1 de 2

Configurar o DS1307

MensagemEnviado: 11 Jun 2008 13:27
por lpagano
Pessoal,

No registrador de horas do DS1307 tem o bit 5 que diz se o horário será apresentado em formato 12 ou 24h. No caso do Mikroc, como seria a instrução para o DS1307 identificar se é configuração para 12 ou 24 horas?
O que eu tenho atualmente é: I2C_Wr (0x00), ou seja, as horas começam em 00:00.

Valeu!

MensagemEnviado: 11 Jun 2008 21:55
por Maurício
Salve, lpagano.

O BIT5 exibe AM/PM se o BIT6 (12/24H) estiver setado, alto.

Se o BIT6 estiver em nível alto, e o BIT5 estiver em nível baixo, indica AM.
Se o BIT5 estiver em nível alto, indica PM.

Se o BIT6 estiver em nível baixo, então, BIT5 indica 20 horas.

Pra saber se é 12/24, vc precisa ler o endereço 02H, e testar pra ver se o BIT6 do dado, está setado ou não.

Primeiro se lê o endereço 02H, depois se faz uma operação no dado e então, vc escreve no endereço 02H.

[]'s

MensagemEnviado: 11 Jun 2008 22:32
por lpagano
Só para confirmar: esse dado que a gente escreve no DS1307 (no meu exemplo, 0x00) é só para os 4 primeiros bits?
Nesse caso como faço para setar o BIT6 em nível baixo? Dá certo se eu mandar escrever o o BIT6 direto através do comando I2C_Wr( xxx )?

MensagemEnviado: 12 Jun 2008 11:31
por lpagano
Voltando à discussão, o nosso amigo SoMeWhErE postou um código nesse fórum que dá para mostrar melhor essa minha dúvida. Veja abaixo:

Código: Selecionar todos
void programa_i2c(){
I2C_Init(100000); // iniciliza I2C com frequencia de 100KHz
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0);  //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Wr(0x25);  //inicializa a contagem dos segundos apartir de 25.
I2C_Wr(0x44);  //inicializa a contagem a partir de 44 minutos.
I2C_Wr(0x08);  //inicializa a contagem das 08:00hs (formato 24 horas).
I2C_Wr(0x06);  //inicializa a contagem da sexta feira da semana
I2C_Wr(0x14);  //inicializa a contagem do dia 14 do mes
I2C_Wr(0x10);  //inicializa a contagem do mês de setembro
I2C_Wr(0x07);  //inicializa a contagem do ano 07.
I2C_Stop();    //condição de finalização da comunicação I2C
}


No caso acima, na linha onde é definida a hora inicial I2C_Wr(0x08), como a gente sabe que o formato das horas será de 24h e não de 12h?

Valeu!

MensagemEnviado: 12 Jun 2008 13:28
por Sergio38br
boas ipagano, quando foi escrito no end. 0x02h o valor de 0x08, foi setado o bit 6 deste registro para zero , assumindo a contagem em modo de 24 hrs. digamos que fosse assumido o modo de 12hrs então o valor a ser escrito seria de 0x48h, setando o bit 6.

Sergio

MensagemEnviado: 12 Jun 2008 15:01
por lpagano
Fala Sergio38br,

Brigadão, agora entendi.

Só aproveitando a oportunidade ontem eu implementei esse DS1307 num
PIC só para ver se estava funcionando bem. Liguei 1 led em cada pino do PORTB do 18F4520 e então liguei os 5 volts no circuito. Ele funcionou normalmente, sendos que esses leds da contagem dos segundos. Nesse caso é mostra-se uma contagem binária (led aceso = 1 e led apagado = 0). Normal até aí.

Só que quando os segundos vão de 9 (1001) para 10 (1010) os leds de 0 a 3 são apagadados acende o led 5, o que dá 100000. Será que eu configurei o DS1307 de forma incorreta? Como eu disse no meu post anterior eu configurei início do relógio como sendo 0x00, ou seja, começa a contar a partir de 0 segundos.

Não sei se deu para entender a minha dúvida.

Valeu!

MensagemEnviado: 12 Jun 2008 15:17
por Maurício
SETAR, quer dizer, por em 1.
RESETAR é por em zero.

lpagano.

Se vc quer setar/resetar um bit qualquer, vc pode fazer operações lógicas em cima de uma variável de 8 bits, e transmitir a variável.

Por exemplo, para setar o bit 6 da variável "horas", abaixo:

Código: Selecionar todos
#define BIT6    6

void main ( void )
{
    unsigned char horas = 0, address = 0x00;
   
    horas = 0x21;       // 21h em BCD
    address = 0x02;
    horas = horas | (1<<BIT6);    // seta o bit 6 de horas
    DS1307_escrever (address, horas);

    horas = horas & ~(1<<BIT6);    // reseta o bit 6 de horas
    DS1307_escrever (address, horas);

    while ( 1 );
}


Vê se ajuda.

[]'s

MensagemEnviado: 12 Jun 2008 15:48
por Sergio38br
Maurício,vc esta correto temos de usar as palavras certas

Ipagano, como é o codigo para escrever no port? naum se esqueça que o valor nos registros do ds estão em BCD

Sergio

MensagemEnviado: 13 Jun 2008 13:34
por lpagano
Sérgio,

O código para escrever no PORTB é o mais simples possível:

Código: Selecionar todos
PORTB = segundos;     //a variável "segundos" recebe dados do endereço 0x00 do DS1307


Ou seja, no PORTB eu vou ter o próprio BCD que vem do DS1307, só para acender os leds.

Vou tentar utilizar um display de 7 segmentos para gerar os números corretamente.

MensagemEnviado: 13 Jun 2008 16:08
por ze
ipagano a esta altura já deve ter entendido, mas o cod BDC apresentado no seu PORTB está correto. 9=0000 1001 10=0001 0000. ou seja mesmo se colocar um dsp7seg não vai resolver (leia-se melhorar seu entendimento). pra mostrar o binário no port tente algo como PORTB=(segundo&0x0f)+(segundo>>4)*10. nunca fiz isso, mas pode funcionar. Esta conversão (bcd->hex) poderá lhe ser útil em alguma função de indexação ou de mostrar em display p.ex.
abrç e boa sexta feira 13!!!!

MensagemEnviado: 16 Jun 2008 08:58
por lpagano
Pessoal,

Fiz mais um teste e vi que no caso dos minutos, quando jogo essa variável nos PORTs do PIC é gerado o BCD corretamente, diferente da variável segundos, como falado anteriormente. Fiz alguns testes e tive os seguintes resultados:

10 minutos corridos: 0000 1010
20 minutos corridos: 0001 0100
30 minutos corridos: 0001 1110
59 minutos corridos: 0011 1011

Dá até para jogar esses valores num CI para converter BCD em display de 7 segmentos numa boa (CD4511 ou CD4056).


lellis,
O meu código BCD na saída do PORTB para os segundos está com as seguintes características. Veja nos exemplos abaixo:

9 segundos corridos: 0000 1001 (até aí está correto)
10 segundos corridos: 0000 0000 (volta tudo ao zero)
20 segundos corridos: 0010 0000 (32 em decimal)
30 segundos corridos: 0010 0000 (32 em decimal)
40 segundos corridos: 0000 0000 (volta tudo ao zero)
50 segundos corridos: 0000 0000 (volta tudo ao zero)

Nesse caso acho que aquelas operações lógicas para fazer a correção não seria má idéia.
Fiz uma tabela em Excel com os resultados. Se quiser te passo via e-mail.

Valeu!

MensagemEnviado: 16 Jun 2008 09:32
por Sergio38br
bom dia Ipagano, qual o C que vc esta usando???

Sergio

MensagemEnviado: 16 Jun 2008 12:13
por ze
os bits RC4 e RC6 podem estar em curto com gnd ou o os pinos do portc não está configurado como io (não me lembro se estes são compartilhados)
verifique num simulador suas variáveis. ou até mesmo no mplab
abrç

MensagemEnviado: 16 Jun 2008 13:35
por lpagano
Estou usando o compilador MikroC versão 8.2.

No caso dos ports RC4 e RC6 (que na verdade são RB4 e RB6) estão funcionando corretamente. Inclusive em outros programas que foram simulados na placa funcionaram corretamente.

Valeu!!!

MensagemEnviado: 16 Jun 2008 14:31
por Sergio38br
Voce esta usando alguma placa da Mikroelektronika???

Sergio