[Resolvido] DS1307-DS1621 e comunicação I2C

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor juarezbazzo » 13 Out 2010 00:26

Ola caro Daniel, depois de quase perder a metade dos meus cabelos “grisalhos”, consegui ler e gravar o RTC DS1307 no pic16F873, 16f84, 16f676, esse micro já contem um IC2, usei o exemplo 8 do Livro “Conectando o Pic”, troquei o endereço da eeprom pelo do rtc e alguns trechos do código, perdi muito tempo nesse circuito, pois não sabia que o rtc não funciona sem a bateria .
Mas se eu quisesse usar um pic menor ou mais barato sem o I2C? um colega me indicou o NA da Maxim que usa o pic16f628 com o DS1307 com a comunicação serial, deixei de lado o trecho do programa de como ia ser mostrado os dados e me “atei” ao trecho do I2C criado na unha, pois eu poderia usar com qualquer pic só mudando as portas SDA e SCL , montei uma placa, pois eu acho muito trabalhoso simular num programa, em vez de simular, vai montando o código e testando aos pouco, quando terminar, o projetou ou circuito estará pronto (talvez eu ache trabalhoso por não ter pratica nos programas simulador) Montei o circuito com um pic16f873, 74164, lcd e chaves pra a certos dos minutos, horas segundos e pra escrever no rtc, o programa é tanto com o uso do I2C do próprio pic ou o criado na “unha”, ou seja dois codigo diferente pro mesmo circuito. Sobre esse tema, tem pouca matéria na net em asm, já montei um relógio “meio gigante” com mostrador a led com rtc DS1307 e termômetro usando o LM35 que o amigo MOR_AL me ensinou a configurar, se o amigo quiser, te mando por e-mail ou coloco no fórum o esquema e placa com o os dois codigo do programa pra ver se serve de base.
100+, um abraço Juarez Bazzo - Novo Hamburgo - RS
juarezbazzo
Bit
 
Mensagens: 25
Registrado em: 25 Nov 2006 21:58

Mensagempor [Daniel] » 13 Out 2010 09:20

Olá juarez, que bacana, é o que estou a fazer, a relação de termômetro eu ja resolvi, talvez tenhas visto minha participação em outro tópico aqui.

Também estou usando um LM35, sei que meu pic tem interface I2C porém não aprendi a usar assim ainda, porém eu tenho ele em asm funcionando na "unha" como você diz, isso me faz feliz, posso usar em qualquer pic como tinhas citado também.

Se quiser postar alguma coisa aqui como base eu te agradeço muito, pelo menos só da parte que vc grava de volta as informações. Ah, muito boa a ideia de fazer na prática eu tenho montado o circuito na proto, porém eu testo mais vezes no pc antes de testar la....enfim....

Muito Obrigado
Avatar do usuário
[Daniel]
Byte
 
Mensagens: 106
Registrado em: 18 Nov 2009 09:14

Mensagempor vtrx » 13 Out 2010 11:30

funcionando na "unha"

O termo certo é 'por software',que dependendo do caso é extremamente útil,pois vc não fica limitado aos pinos que o Hardware exige,além do mais no caso do I2C,voce pode montar uma rotina de leitura e escrita sequencialmente em velocidade máxima(principalmente em ASM),sem limitações.
Neste exemplo do link foi usado esta técnica;
http://www.youtube.com/watch?v=P1IaRyQ3oMM
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor juarezbazzo » 13 Out 2010 12:53

"O termo certo é 'por software'", sim, eu sei, usei o termo que o autor do livro usou pra se referir ao "software" criado na "unha". Rtc trabalha com números BCD bin, transformar em Decimal é fácil, o problema é decimal para BCD bin, montei uma rotina pra isso mas ficou muito grande, o amigo tem algum "exemplo" de como fazer isso? 100+
juarezbazzo
Bit
 
Mensagens: 25
Registrado em: 25 Nov 2006 21:58

Mensagempor vtrx » 13 Out 2010 14:29

Sim,tenho uma usado com o pic 16F84,mas neste exato momento estou no serviço.
A noite te passo.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor [Daniel] » 13 Out 2010 15:21

Então como vocês fariam isso?

Eu leio transformo para DEC e mostro nos displays, certo...ate ai tudo bem, mas ai querer ajustar o horário, como acham que deveria proceder?

Eu recebo o valor em BCD, ai transformo em dois registradores de 8bit, unidade e dezena, que seria o decimal, mas agora, como eu faria para incrementar uma unidade ou decrementar uma unidade?

Tem que transformar em um único byte? incrementar, e depois converter em BCD?? bah isso que ta complicado para mim....
Avatar do usuário
[Daniel]
Byte
 
Mensagens: 106
Registrado em: 18 Nov 2009 09:14

Mensagempor vtrx » 13 Out 2010 18:41

Bah,da uma lida aqui;
http://www.icea.gov.br/ead/anexo/21401.htm
PS:Daniel,te enviei um exemplo completo lembra?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor [Daniel] » 19 Out 2010 15:04

É verdade cara, olhei la algumas dezenas de vezes e consegui compreender!
Creio que agora eu consigo me virar aqui. Quando terminar o projeto ou próximo disso, posto alguma coisa pra compartilhar minha felicidade. hehe...

abraço a todos e muito obrigado pela colaboração por mais uma vez, espero um dia poder retribuir o favor aos srs.
Avatar do usuário
[Daniel]
Byte
 
Mensagens: 106
Registrado em: 18 Nov 2009 09:14

Re: [Resolvido] DS1307-DS1621 e comunicação I2C

Mensagempor educarbnog » 04 Set 2016 17:54

Prezado Daniel

Estou querendo aprender a mexer no ds1307 e até estou utilizando o mesmo 16f877, em assembley. mas não estou conseguindo fazer a comunicação I2C. Se você poderia postar ou me enviar alguma coisa para poder entender.
Desde já agradeço

Eduardo
educarbnog
 
Mensagens: 3
Registrado em: 13 Out 2014 21:53

Re: [Resolvido] DS1307-DS1621 e comunicação I2C

Mensagempor Vonnilmam » 15 Set 2016 11:08

Olá a todos,

Vi esse post e gostaria de colaborar com vocês,

Há um tempo atrás fiz um projetinho de alarme que utilizava o DS1307.

Essa rotina foi escrita em ASM para o pic877A, o clock é de 4mhz.

Junto estou enviando o conversor BCD/HEX.

Obrigado

asm code
;  ****************************************************
; * Rotina para escrita/leitura de hora/data no DS1307 *
; * essa rotina funciona em conjunto com TableBcd.Inc *
; * que é um conversor Decimal/Bcd/Decimal *
; * Status: APROVADO <> Xtal MCU = 4mhz *
; ****************************************************
;-----------
SendMinutoHora:
Bcf Intcon, Gie
Movf Seg, w
Call Conversor_Dec_Bcd
Movwf Secs
Movf Minuto, w
Call Conversor_Dec_Bcd
Movwf Mins
Movf Hora, w
Call Conversor_Dec_Bcd
Movwf Hrs
Call RTC_brst_wr
Bsf Intcon, Gie
Return
ReadMinutoHora:
Bcf Intcon, Gie
Call RTC_brst_rd
Movf Mins, w
Call Conversor_Bcd_Dec
Movwf Minuto
Movf Hrs, w
Call Conversor_Bcd_Dec
Movwf Hora
Bsf Intcon, Gie
Return
;-----------------------------------------
;-- RTC routines --
;-----------------------------------------
RTC_brst_rd:
DsI2C_START
movlw 0D0h ; slave address + write
call write_RTC
movlw .0 ; set word address to seconds register
call write_RTC
DsI2C_START
movlw 0D1h ; slave address + read
call write_RTC
call read_RTC ; read the seconds data
movwf SECS ; save it
call ack;
call read_RTC ; and so on
movwf MINS
call ack;
call read_RTC
movwf HRS
call ack;
call read_RTC
movwf DOW
call ack;
call read_RTC
movwf DAYS
call ack;
call read_RTC
movwf MON
call ack;
call read_RTC
movwf YRS
call nack;
DsI2C_STOP
return
;-----------
RTC_brst_wr:
DsI2C_START
movlw 0D0h ; slave address + write
call write_RTC
movlw .0 ; set word address to seconds register
call write_RTC
movf SECS, W
call write_RTC
movf MINS, W
call write_RTC
movf HRS, W
call write_RTC
movf DOW, W
call write_RTC
movf DAYS, W
call write_RTC
movf MON, W
call write_RTC
movf YRS, W
call write_RTC
DsI2C_STOP
return

;---- Read RTC into W ----
read_RTC:
BANK1
bsf TRISC,4 ; set SDA for input
BANK0

movlw 08h ; send 8 bits
movwf COUNT

bcf SCL ; clock data out
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0

clrf TMP ; clear var
rlf TMP, F ; rotate carry in
clrf TMP ; clear var again

I2C_read_loop:
rlf TMP, F

BANK1
bsf TRISC, 3 ; SCL high (input)
BANK0

btfsc SDA
bsf TMP, 0 ; if data out = 1, set bit

bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0
decfsz COUNT, F
goto I2C_read_loop

movf TMP, W

return

;---- ACK read (assumes SCL=0 on entry) ----
ack:
bcf SDA

BANK1
bcf TRISC, 4 ; set SDA for output
BANK0

BANK1
bsf TRISC, 3 ; SCL high (input)
BANK0
nop
bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0

return

;---- NACK read (assumes SCL = 0 on entry) ----
nack:
bsf SDA

BANK1
bcf TRISC, 4 ; set SDA for output
BANK0

BANK1
bsf TRISC, 3 ; SCL high (input)
BANK0

bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0

return

;--- Write the byte in W to RTC ---
;---- assumes CE is asserted ----
write_RTC:
movwf TMP ;Save the data
;
;--- Do a I2C bus write of byte in 'TMP' ---
;
I2C_write:

BANK1
bcf TRISC, 4 ; set SDA for output
BANK0

movlw 08h ; send 8 bits
movwf COUNT

bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0

I2C_w_loop:
bcf SDA ; assume data out is low
btfsc TMP, 7
bsf SDA ; if data out = 1, set bit
; nop

BANK1
bsf TRISC, 3 ; SCL high (input)
BANK0
rlf TMP, F
bcf SCL ; clock it in
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0
decfsz COUNT, F
goto I2C_w_loop

BANK1
bsf TRISC,4 ; set SDA for input
BANK0

bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0
; nop
BANK1
bsf TRISC, 3 ; SCL high (input)
BANK0
; if(sda) printf("Ack bit missing %02X\n",(unsigned int)d);
bcf SCL
BANK1
bcf TRISC, 3 ; SCL low (output)
BANK0
return


;********************************************************************

Conversor_Dec_Bcd:

Goto TableBCD
;-----------
Conversor_Bcd_Dec:

Movwf Conversor ; Carrega o valor BCD na variável "CONVERSOR"
Clrf ContadorBCD ; Reinicializa ponteiro do contador de ventos
LoopBCD:
Movf ContadorBCD, w ; Carrega o ponteiro da tabela
Call TableBCD ; Chama os dados contidos na tabela BCD
Subwf Conversor, w ; Verifica se "CONVERSOR" é igual ao dado da tabela BCD
Btfsc Status, z ; Faz a comparação!
Goto SaiLoopBcd ; Identificação do valor BCD
;
Incf ContadorBCD, f ; Contador de eventos (0 à 99 = 100 steps)"graus celcios"
Movf ContadorBCD, w ; Efetua a verificação de overflon
Sublw .102 ; Se for maior que 102 overflon
Btfsc Status, z ; Efetua comparação
Return ; Houve overflon, retornar sem nenhuma ação, mantendo o ultimo dado valido
Goto LoopBCD ; Não é igual continua verificando
SaiLoopBcd:
Movf ContadorBCD, w ; Fim da conversão o resultado esta no acumulador no formato Decimal
Return
;-----------

TableBCD:

Addwf Pcl, f

; DEZE UNID
; BCD 4bit ----|----

Retlw B'00000000' ; 00 BCD
Retlw B'00000001' ; 01 BCD
Retlw B'00000010' ; 02 BCD
Retlw B'00000011' ; 03 BCD
Retlw B'00000100' ; 04 BCD
Retlw B'00000101' ; 05 BCD
Retlw B'00000110' ; 06 BCD
Retlw B'00000111' ; 07 BCD
Retlw B'00001000' ; 08 BCD
Retlw B'00001001' ; 09 BCD
Retlw B'00010000' ; 10 BCD
Retlw B'00010001' ; 11 BCD
Retlw B'00010010' ; 12 BCD
Retlw B'00010011' ; 13 BCD
Retlw B'00010100' ; 14 BCD
Retlw B'00010101' ; 15 BCD
Retlw B'00010110' ; 16 BCD
Retlw B'00010111' ; 17 BCD
Retlw B'00011000' ; 18 BCD
Retlw B'00011001' ; 19 BCD
Retlw B'00100000' ; 20 BCD
Retlw B'00100001' ; 21 BCD
Retlw B'00100010' ; 22 BCD
Retlw B'00100011' ; 23 BCD
Retlw B'00100100' ; 24 BCD
Retlw B'00100101' ; 25 BCD
Retlw B'00100110' ; 26 BCD
Retlw B'00100111' ; 27 BCD
Retlw B'00101000' ; 28 BCD
Retlw B'00101001' ; 29 BCD
Retlw B'00110000' ; 30 BCD
Retlw B'00110001' ; 31 BCD
Retlw B'00110010' ; 32 BCD
Retlw B'00110011' ; 33 BCD
Retlw B'00110100' ; 34 BCD
Retlw B'00110101' ; 35 BCD
Retlw B'00110110' ; 36 BCD
Retlw B'00110111' ; 37 BCD
Retlw B'00111000' ; 38 BCD
Retlw B'00111001' ; 39 BCD
Retlw B'01000000' ; 40 BCD
Retlw B'01000001' ; 41 BCD
Retlw B'01000010' ; 42 BCD
Retlw B'01000011' ; 43 BCD
Retlw B'01000100' ; 44 BCD
Retlw B'01000101' ; 45 BCD
Retlw B'01000110' ; 46 BCD
Retlw B'01000111' ; 47 BCD
Retlw B'01001000' ; 48 BCD
Retlw B'01001001' ; 49 BCD
Retlw B'01010000' ; 50 BCD
Retlw B'01010001' ; 51 BCD
Retlw B'01010010' ; 52 BCD
Retlw B'01010011' ; 53 BCD
Retlw B'01010100' ; 54 BCD
Retlw B'01010101' ; 55 BCD
Retlw B'01010110' ; 56 BCD
Retlw B'01010111' ; 57 BCD
Retlw B'01011000' ; 58 BCD
Retlw B'01011001' ; 59 BCD

Retlw B'01100000' ; 60 BCD
Retlw B'01100001' ; 61 BCD
Retlw B'01100010' ; 62 BCD
Retlw B'01100011' ; 63 BCD
Retlw B'01100100' ; 64 BCD
Retlw B'01100101' ; 65 BCD
Retlw B'01100110' ; 66 BCD
Retlw B'01100111' ; 67 BCD
Retlw B'01101000' ; 68 BCD
Retlw B'01101001' ; 69 BCD
Retlw B'01110000' ; 70 BCD
Retlw B'01110001' ; 71 BCD
Retlw B'01110010' ; 72 BCD
Retlw B'01110011' ; 73 BCD
Retlw B'01110100' ; 74 BCD
Retlw B'01110101' ; 75 BCD
Retlw B'01110110' ; 76 BCD
Retlw B'01110111' ; 77 BCD
Retlw B'01111000' ; 78 BCD
Retlw B'01111001' ; 79 BCD
Retlw B'10000000' ; 80 BCD
Retlw B'10000001' ; 81 BCD
Retlw B'10000010' ; 82 BCD
Retlw B'10000011' ; 83 BCD
Retlw B'10000100' ; 84 BCD
Retlw B'10000101' ; 85 BCD
Retlw B'10000110' ; 86 BCD
Retlw B'10000111' ; 87 BCD
Retlw B'10001000' ; 88 BCD
Retlw B'10001001' ; 89 BCD
Retlw B'10010000' ; 90 BCD
Retlw B'10010001' ; 91 BCD
Retlw B'10010010' ; 92 BCD
Retlw B'10010011' ; 93 BCD
Retlw B'10010100' ; 94 BCD
Retlw B'10010101' ; 95 BCD
Retlw B'10010110' ; 96 BCD
Retlw B'10010111' ; 97 BCD
Retlw B'10011000' ; 98 BCD
Retlw B'10011001' ; 99 BCD
Retlw B'10100000' ; 100 BCD
Retlw B'10100001' ; 101 BCD
Retlw 0xFF ; OverFlon
Editado pela última vez por andre_luis em 15 Set 2016 11:56, em um total de 1 vez.
Razão: Inserido formatação ASSEMBLY
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: [Resolvido] DS1307-DS1621 e comunicação I2C

Mensagempor MOR_AL » 15 Set 2016 17:02

Não sei se ainda se interessam, mas fiz um programa que usa a comunicação I2C para gravar uma EEPROM. Mas incluí um arquivo pdf com todas as explicações do funcionamento deste tipo de comunicação. O arquivo ainda possui diversas rotinas, que abrangem todos os casos de transferência de dados entre um pic sem I2c e a EEPROM.

Incluí um segundo arquivo com a linguagem assembler do apresentado no arquivo pdf.
Para conferir estas rotinas montei o circuito e rodei todas as rotinas apresentadas. O programa mostrou que funcionava convenientemente.
Não reinventei a roda. Li o datasheet da eeprom 24C65 e a dissequei até entender tudo (ou quase hehehe). Inclusive fiz muitas anotações no arquivo pdf do manual para poder chegar às rotinas I2C.
Caso alguém se interesse na criação do projeto, timtim por timtim, posso fornecer todo o meu estudo.
Lembrando que no meu trabalho há rotinas de display LCD, de tempo, de I2C, de binário 8 para BCD 3, de BCD para ASCII. Tem também algumas macros que fiz. Tudo isso em assembler.
O trabalho não se restringe à EEPROM e sim à comunicação I2C.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: [Resolvido] DS1307-DS1621 e comunicação I2C

Mensagempor Vonnilmam » 16 Set 2016 16:53

Olá, mor_al

Mande pra mim, gostaria de apreciar o seu trabalho...

Mande nesse email: contato@grupoagi.com.br

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: [Resolvido] DS1307-DS1621 e comunicação I2C

Mensagempor MOR_AL » 16 Set 2016 18:25

Vonnilmam escreveu:Olá, mor_al

Mande pra mim, gostaria de apreciar o seu trabalho...

Mande nesse email: contato@grupoagi.com.br

Obrigado

OK.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Anterior

Voltar para PIC

Quem está online

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

x