Two-wire interface x RTC

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Two-wire interface x RTC

Mensagempor brasilma » 11 Set 2008 20:57

Amigos,

Meu "embate" de momento é com isso, tenho os exemplos do data-sheet, exemplos da net, e gostaria de saber se mais alguém pode me dar alguma dica ou exemplo de como comunicar o AVR com um RTC pela interface Two-wire.

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Maurício » 11 Set 2008 22:58

Salve, brasilma.

Não conheço esse protocolo, mas, pra variar, no CodeVision é tudo automático, ehehehehehe
Vc coloca seu dispositivo lá, configura os pinos de comunicação e xau, já era!

Mas.... Vc quer continuar usando essas coisas aí!! :lol:

I2C, 1-Wire, 2-Wire... Tudo automático, e funciona pra caramba!
Pro HT1380, migrei meus códigos do 8051 e tá tudo funfando redondo!

Tomei uma surra aqui com uns ponteiros, que até agora ainda não achei o rumo de casa! Ia até colocar um post sobre isso, mas, aproveitei a carona e tou comentando aqui. O resultado, foi abandonar os ponteiros e acessar a matriz direto.

Nunca ví isso! Minha matriz só não era acessada no elemento 1!
De oito elementos, somente o elemento 1 é que não era acessado.
Como eu não tou com tempo, e nem com tanto cabelo, desistí e passei a acessar direto! Bingo! :lol: 8) :wink:

Nesses casos, o AVRStudio é deficiente, porque pra vc acessar dados e endereços que não estão no escopo desse módulo, tú tem que fazer a maior ginástica. Mas não dá pra reclamar de uma ferramenta que funciona e é de greitis, né?

Desculpa desvirtuar seu tópico! eheheheheheh

[]'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 brasilma » 11 Set 2008 23:12

Fala aê Mauricio,

Fica esnobando não, como vou pagar meus pecados, rs, rs.

De um geito ou outro (por bem ou mal) vou ter de fazer mesmo e não custa perguntar, quem sabe alguém não dá uma ajudinha.

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor styg » 12 Set 2008 17:21

Brasilma, tem que ver se teu avr ja tem hardware pra I2C, dai fica mais tranquilo, apesar de eu ter apanhado pra entender o funcionamento, que é todo baseado em interrupção.

Se for com hardware interno, geralmente c escreve um reg pra dar o start, e depois a cada evento ele gera a int e na rotina da int c testa o valor de outro reg pra saber qual evento foi e fazer o que for preciso.

tipo..
int i2c()
{
switch(reg_da_i2c)
{
case 0x30:
// foi um start
case 0x38:
// foi um ack
case 0x48:
// foi um stop
}
}

e por assim vai.

senao tiver hardware dai é no bitbang :)
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor brasilma » 12 Set 2008 18:20

Belê Sty,

Tem o hardware sim, é o ATmega32.

Vc pode me enviar os exemplos completos da interação com a interface, tipo um exemplo da transmissão e recepção de um byte?

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor styg » 15 Set 2008 13:38

ISSO É COM LPC214x só pra c ter uma ideia, com avr num tenho.
essa eé a interrupção

void hp_i2c_int(void) __irq
{
switch(I2C0STAT) // le estado atual para definir proxima acao
{
// se START foi enviado,
case(0x08): // zera start bit, envia endereço do escravo + R/W
I2C0CONCLR = 0x20;
I2C0DAT = E2P_CTRL_CODE+E2P_I2C_ADRESS+E2P_WRITE;
break;
// se START repetido transmitido,
case(0x10): // envia endereço do escravo + R/W
I2C0CONCLR = 0x20;
if(e2p_le) I2C0DAT = E2P_CTRL_CODE+E2P_I2C_ADRESS+E2P_READ;
else I2C0DAT = E2P_CTRL_CODE+E2P_I2C_ADRESS+E2P_WRITE;
break;
// se SLA+W transmitido, ACK recebido,
case(0x18): // envia dado
I2C0DAT = end_e2p_h;
i2c_indice++;
break;
// se SLA+W transmitido, NACK recebido,
case(0x20):
I2C0CONSET = 0x20; // envia START
break;
// se DATA transmitido, ACK recebido,
case(0x28):
// se enviou todos os dados do buffer,
if(i2c_indice > i2c_ind_max)
{
// se é operação de leitura reenvia START, senao envia STOP
if(e2p_le) I2C0CONSET = 0x20; // envia START
else I2C0CONSET = 0x10; // envia STOP
if(e2p_le_page)
{
I2C0CONSET = 0x04; // ativa envio de ACK
i2c_ind_max = bytes_global + 1; // maximo é igual (bytes+endereço)-1
}
zera(flags2,_e2p_busy);
}
// senao, incrementa indice do buffer
else
{
if(i2c_indice == 1) I2C0DAT = end_e2p_l;
else I2C0DAT = i2c_buf[i2c_indice-2];
i2c_indice++;
}
break;
// se DATA transmitido, NACK recebido,
case(0x30): // nada faz
I2C0CONSET = 0x30;
i2c_indice = 0;
break;
// se SLA+R transmitido, ACK recebido,
case(0x40):
i2c_indice = 0; // zera indice
break;
// se SLA+R transmitido, NACK recebido,
case(0x48):
I2C0CONSET = 0x20; // envia START
break;
// se DATA recebido, ACK enviado
case(0x50):
// se enviou todos os dados do buffer, zera AA para nao responder com ACK
if(i2c_indice > i2c_ind_max-4) I2C0CONCLR = 0x04;
// senao, incrementa indice do buffer
i2c_buf[i2c_indice] = I2C0DAT;
i2c_indice++;
break;
// se DATA recebido, NACK enviado
case(0x58): // le o byte
if(e2p_le_page) i2c_buf[i2c_indice] = I2C0DAT;
else i2c_buf[0] = I2C0DAT;
I2C0CONSET = 0x10; // envia STOP
zera(flags2,_e2p_busy);
break;
// se outro, sai
default:
break;
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 15 Set 2008 13:41

nao é tao simples pra colocar um exemplo assim como c pediu, pq como tem q t toda essa joça dos eventos.
mas creio que ja é uma luz :)
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Djalma Toledo Rodrigues » 18 Set 2008 23:20

Brasilma

Seu RTC tem a interface Two-wire?
Editado pela última vez por Djalma Toledo Rodrigues em 19 Set 2008 00:13, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor brasilma » 18 Set 2008 23:35

Meu RTC é o DS1307.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x