Página 1 de 1

Como entender este AND!!

MensagemEnviado: 25 Mar 2012 05:44
por antonio
Pessoal tudo bem !!

Quero fazer uns testes com o Ds1307 para isso estou a estudar a driver do mesmo que vem com o CCS mas tenho uma duvida, não estou a entender bem o seguinte AND pintado a vermelho!
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);

Jà dei uma olhada no datasheet e não consigo entender porque è ao ler o DS1307 faz aquele AND?

Caso algem poder ajudar agradeço

Re: Como entender este AND!!

MensagemEnviado: 25 Mar 2012 08:00
por andre_luis
No caso dos segundos / minutos, o filtro é desnecessário, chegando a ser redundante, uma vez que a magnitude do valor lido não chega á preencher o 8o bit. Suponho que a razão seja meramente segurança, para o caso de algum erro de leitura.

Idem para o caso das horas.


+++

MensagemEnviado: 26 Mar 2012 01:30
por jorgeluiz
deve ser isso que andre falou, para mascarar o resultado. Lembre-se que AND, os valores em 0 forçam o resultado para 0 tambem.

Re: Como entender este AND!!

MensagemEnviado: 26 Mar 2012 09:57
por Rodrigo_P_A
antonio escreveu:Pessoal tudo bem !!

Quero fazer uns testes com o Ds1307 para isso estou a estudar a driver do mesmo que vem com o CCS mas tenho uma duvida, não estou a entender bem o seguinte AND pintado a vermelho!
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);

Jà dei uma olhada no datasheet e não consigo entender porque è ao ler o DS1307 faz aquele AND?

Caso algem poder ajudar agradeço


para você entender faça na mão o cálculo

0x7F = 0111 1111

vamos supor que o seu i2c_read() retorne o valor 0xCF

0x7F = 0111 1111
0xCF = 1100 1111

fazendo and = 0100 1111

entendeu?

Geralmente esta técnica de usar AND é usada para limitar valores como o André falou.

MensagemEnviado: 27 Mar 2012 11:23
por antonio
Grato Pessoal!

MensagemEnviado: 27 Mar 2012 23:20
por marcelo campos
antonio escreveu:Grato Pessoal!


Na verdade o bit 7 (que está sendo zerado com o AND feito) do registrador 0 é o CH de "Clock Halt" ou parada de clock, então se você ler ele e o clock estiver parado (estado inicial no power up) resultará que lerá como setado !!
vale lembrar que durante seu programa você também pode escrever neste bit assim como no horário, e parar / habilitar o clock

como é do reg 0 (segundos) nos outros não preicsa fazer isto

abraço

marcelo