Ir ao conteúdo
  • Cadastre-se

Comunicação entre dois PIC usando I2C


Ítalo Rodrigues

Posts recomendados

Bom já venho quebrando cabeça a bom tempo tentando utilizar o protocolo i2c no pic.. minha ideia é simular um pic (escravo) como sensor mandando uma informação para outro pic (mestre), uma informação básica como um numero em hexadecimal (0x10 por exemplo) e mostrar atraves da comunicação serial rs232 tal informação por um printf("resultado: %i",result);. Mas já tentei de muitas formas aplicar tal protocolo e não consegui muitos resultados.. algumas referencias de circuitos me ajudaram a esclarecer bastante coisas:

http://hades.mech.northwestern.edu/index.php/I2C_communication_between_PICs

http://www.todopic.com.ar/foros/index.php?topic=34581.0

todos apresentam características muito semelhantes e tal, mas não consegui interpretar 100% o código inteiro, como por exemplo a interrupção #INT_SSP no escravo mesmo estando comentada.

Aqui vai meu codigo do mestre:

 

#include <18f4520.h> #fuses HS,NOLVP,NOPROTECT #use delay(clock=20000000) #use I2C(FAST, SCL=PIN_C3, SDA=PIN_C4, FORCE_HW) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) int result=0; void main(void){ while(TRUE){ i2c_start(); i2c_write(0x14); i2c_write(0x02); i2c_stop(); i2c_start(); i2c_write(0x15);result=i2c_read(0); i2c_stop(); output_d(result); printf("resultado: %i",result); } }
E aqui o codigo do escravo:

#include <18f4520.h> #fuses HS,NOLVP,NOPROTECT #use delay(clock=20000000) #use i2c(SLAVE, FAST, SCL=PIN_C3, SDA=PIN_C4, address=0x14, FORCE_HW) int state; // I2C var int address, buffer[0x03]; #INT_SSP void ssp_interupt (){ state = i2c_isr_state(); if(state < 0x80){ if(state == 0){ } if(state == 1){ address = i2c_read(); } if(state == 2){ buffer[address] = i2c_read(); } if(state == 0x80){ i2c_write (buffer[address]); } } } void main(){ setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); while(TRUE){ set_adc_channel(0); delay_us(10); buffer[0x02] = read_adc(); output_d(buffer[0]); } } 
Os códigos já estão mexidos um poucos, mas a segue o principio da minha ideia, o escravo ficar enviando uma tal informação quando o mestre pedir, futuramente minha ideia era utilizar o escravo como um voltimetro de 5V e ficar enviando o valor da tensão a medida que for alterando a resistencia para o mestre. Eu utilizo o Proteus 8.0 para simulação, a vez que cheguei mais perto, foi quando tentei implementar minha propria biblioteca i2c, me baseando pelo livro do fabio pereira, "PIC, programação em C". Utilizo o CSS 4.084 para compilar meus codigos. segue imagem do meu circuito de simulação no Proteus.

http://imageshack.us/a/img826/684/fh0k.png

Se alguem já fez algo parecido ou que tenha encontrado tal falha, agradeço desde já pessoal, sei que vocês são show! =D

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...