Configurar o DS1307

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Configurar o DS1307

Mensagempor lpagano » 11 Jun 2008 13:27

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Maurício » 11 Jun 2008 21:55

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
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor lpagano » 11 Jun 2008 22:32

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 )?
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor lpagano » 12 Jun 2008 11:31

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 12 Jun 2008 13:28

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 12 Jun 2008 15:01

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Maurício » 12 Jun 2008 15:17

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
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Sergio38br » 12 Jun 2008 15:48

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 13 Jun 2008 13:34

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.
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor ze » 13 Jun 2008 16:08

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!!!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor lpagano » 16 Jun 2008 08:58

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!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 16 Jun 2008 09:32

bom dia Ipagano, qual o C que vc esta usando???

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

Mensagempor ze » 16 Jun 2008 12:13

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor lpagano » 16 Jun 2008 13:35

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!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 16 Jun 2008 14:31

Voce esta usando alguma placa da Mikroelektronika???

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

Próximo

Voltar para PIC

Quem está online

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

x