COMUNICAÇÃO I2C NO MIKRO C

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

COMUNICAÇÃO I2C NO MIKRO C

Mensagempor Pask » 08 Jul 2015 11:58

Amigos, código abaixo foi extraído do help do compilador MikroC. Este é um pequeno código escrito para demonstrar a funcionalidade da comunicação serial I2C entre o MCU PIC16F877 e uma memória eeprom 24C02 conectada a ele. Também tem como objetivo demonstrar a funcionalidade da biblioteca interna deste compilador para este tipo de comunicação serial.
Porém, há alguns pontos que eu não consegui entender direito. Segue o código:

cpp code
void main(){
PORTB = 0;
TRISB = 0; // PORTB CONFIGURADO COMO SAIDAS E SAÍDAS ZERADAS

I2C1_Init(100000); // INICIALIZAÇÃO DA COMUNICAÇÃO I2C EM 100kHz
I2C1_Start(); // SINAL DE START I2C
I2C1_Wr(0xA2); // ENVIA BYTE VIA I2C (ENDEREÇO DO COMPONENTE + W)
I2C1_Wr(2); // ENVIA BYTE (ENDEREÇO DE LOCALIZAÇÃO DA EEPROM)
I2C1_Wr(0xAA); //ENVIA DADO (DADO A SER ESCRITO)
I2C1_Stop(); //PÁRA COMUNICAÇÃO I2C

Delay_100ms(); //AGUARDA 100ms

I2C1_Start(); // SINAL DE START I2C
I2C1_Wr(0xA2); // ENVIA BYTE VIA I2C (ENDEREÇO DO COMPONENTE + W)
I2C1_Wr(2); // ENVIA BYTE (ENDEREÇO DO DADO)
I2C1_Repeated_Start(); // REPETE SINAL DE START I2C
I2C1_Wr(0xA3); // ENVIA BYTE (ENDEREÇO DO COMPONENTE + R)
PORTB = I2C1_Rd(0u); // LÊ O DADO (NO acknowledge)
I2C1_Stop(); // SINAL DE PARADA NA COMUNICAÇÃO I2C
}

Se alguém entendeu completamente o código acima, poderia me explicá-lo por favor? Por que foi enviado o dado 0xAA na primeira parte do código e depois, ao ler o dado, o valor que aparece no PORTB do MCU é 0xA3?
O que significam exatamente as instruções (ENDEREÇO DO COMPONENTE + W) e (ENDEREÇO DO COMPONENTE + R) ?

P.S: Quem tiver o MikroC instalado em sua máquina, pode abrir o help e digitar I2C Library que verá este código e o esquema de conexão do MCU à memória eeprom citada.

Aguardo vocês e obrigado.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor KrafT » 08 Jul 2015 12:35

Não uso o Mikro C, mas W = Write R = Read
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor EDSONCAN » 08 Jul 2015 12:55

Quando você le um dado no I2c voce segue o procedimento;

Envia comando de escrita I2C1_Wr(0xA2);
Aponta para o endereço I2C1_Wr(2);
Manda um start
Envia comando de leitura I2C1_Wr(0xA3);
e finalmente lê o dado

Isso tudo esta na definição do I2C basta voce dar uma pesquisada.
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor tcpipchip » 08 Jul 2015 14:47

Amigo...

O id da tua eeprom deve estar como
1010000X

Então, para escrita é A0 e leitura A1

tcpipchip
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor Pask » 08 Jul 2015 15:00

Se eu enviei o dado 0xAA para ser escrito, por que eu não consigo ler este dado? A sequência de escrita e leitura para a memória está correta de acordo com as instruções do fabricante.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor Pask » 08 Jul 2015 15:20

O código abaixo está funcionando incorretamente porque o valor que está aparecendo no PORTB é 0xA1 e não 0xAA como deveria ser. Na verdade, 0xA1 é o comando de leitura da eeprom para ler o dado enviado anteriormente que é 0xAA. Isto não está acontecendo.

cpp code
void main(){
PORTB = 0;
TRISB = 0; // Configure PORTB as output
I2C1_Init(100000); // initialize I2C communication

I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + W)
I2C1_Wr(0x5C); // send byte (address of EEPROM location)
I2C1_Wr(0xAA); // send data (data to be written) => este byte deveria aparecer no portb
I2C1_Stop(); // issue I2C stop signal

Delay_ms(5);

I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA0); // send byte via I2C (device address + W)
I2C1_Wr(0X5C); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA1); // send byte (device address + R) => este é o byte que aparece no portb
PORTB = I2C1_Rd(0); // Read the data (NO acknowledge)
I2C1_Stop(); // issue I2C stop signal
}
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor xultz » 08 Jul 2015 15:35

Você lê o dado da I2C e guarda no registrador do PORTB? Pode isso, Arnaldo?
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor KrafT » 08 Jul 2015 16:02

xultz escreveu:Você lê o dado da I2C e guarda no registrador do PORTB? Pode isso, Arnaldo?


Pode, uai... Vai que ele ficou sem memória e o PORTB tá sobrando? Deve ser para visualizar o dado, Xú...
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor Pask » 08 Jul 2015 16:21

Este é um código exemplo do compilador MikroC. Ele foi escrito assim. Eu apenas estou tentando entender como funciona.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor tcpipchip » 08 Jul 2015 16:50

Tenta um delay depois do
I2C1_Init(100000);
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor tcpipchip » 08 Jul 2015 16:51

E aumente o tempo de escrita na eeprom para 16 ms
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor Pask » 08 Jul 2015 19:04

Realmente não dá para entender amigos. Mandei escrever o dado 0x05 no endereço 0x00 da eeprom 24C02 e todas as posições da memória estão em 0xFF. Não consigo fazer funcionar.
Além do mais, gostaria de avisar que não estou recebendo notificações de respostas deste fórum. Existe um bug aqui também....kkkkkk
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor ze » 09 Jul 2015 11:10

Seu problema é na real? ou na simulação? Esqueceu o pullup? Fala sério...
Mostre as funções I2C1_Wr() e I2C1_Rd(0) (se o compilador não esconder)
Certa feita me aconteceu algo semelhante. Tive que dar dois starti2c() ou dois repstarti2c() num lembro... Tenta pra ver...

edit ... tá perdoado...
Editado pela última vez por ze em 09 Jul 2015 11:22, em um total de 2 vezes.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor tcpipchip » 09 Jul 2015 11:18

Veja tambem o ID no Hardware (pinos da EEPROM), alguns casos podes ter até 8
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: COMUNICAÇÃO I2C NO MIKRO C

Mensagempor MOR_AL » 09 Jul 2015 11:57

Bom.
Eu fiz a comunicação I2C em assembler. Claro que você não deve usar, mas lá tem a definição do protocolo de comunicação e diversos exemplos. Todos funcionando corretamente.
Você não precisa entender o detalhe das sub-rotinas, apenas saber o que ela faz.
Talvez lá tenha alguma informação que lhe esclareça alguma coisa.
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

Próximo

Voltar para PIC

Quem está online

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

x