Comunicação I²C - 1 Mestre, 2 Escravos

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Comunicação I²C - 1 Mestre, 2 Escravos

Mensagempor vinny » 01 Dez 2009 15:15

Olá pessoal estou fazendo um trabalho para faculdade onde usarei comunicação i2c entre 1 pic 16F877A mestre 2 escravos (também 16F877A).
Seguinte estou usando compilador ccs no mplab, e estou testando entre 1 pic mestre e 1 escravo... quando envio apenas 1 BYTE funciona perfeitamente mostrando no display lCD. td ok, se no escravo crio uma string de char para enviar por interrupcao nao recebo nem o primeiro byte no mestre.

Segue codigo dos 2

MESTRE
Código: Selecionar todos
#include <16F877A.h>
#include <regs_16f87x.h>
#include <main.h>
#include <Lcd_remota.c>


unsigned char buffer[17];
unsigned char posicao=0;
/*************INTERRUPCAO*************/

/*************LEITURA ESCRAVO*************/
void leitura_i2c(void)   //rotina de leitura do escravo
{   
unsigned char i=0;
   while(i<17) buffer[i++]="0";

   i2c_start();  //inicializa comunicação i2c
   i2c_write(0xA1); //endereço do escravo e leitura (1)
   posicao = 0;
   while(posicao<17){
      buffer[posicao] = i2c_read(0);   
      posicao++;
   }
   i2c_stop();   //finaliza comunicação I2C
   delay_ms(10);
}

/*************PROGRAMA*************/
void uC_inicia(void)
{
   enable_interrupts(global);
   set_tris_c (0b00011000); // configura pino C3 e C4 como entrada
    set_tris_D (0x00);  // configura todo o port_D como saida
   
    output_low(pin_C1);  // zera  R/W
    output_low(pin_C0); // zera o RS
    lcd_ini();
   
    delay_ms(100);
    output_high(pin_C0); // seta o RS
    lcd_pos_xy(1,1);
    printf(lcd_escreve,"Eng. Eletrica");
    lcd_pos_xy(1,2);
    printf(lcd_escreve,"Inicializando...");

}

void main()
{
   uC_inicia();
   delay_ms(1500);
   lcd_pos_xy(1,1);
   printf(lcd_escreve,"Conectando...");
   delay_ms(800);
   while(1){
    delay_ms(100);
   lcd_pos_xy(1,2);
   leitura_i2c();
    printf(lcd_escreve,"%s", buffer);     
  }
}




ESCRAVO
Código: Selecionar todos
#include <16F877A.h>
#include <regs_16f87x.h>
#include <main.h>


unsigned char buffer[]="AAA íCSJATMLMPYAA";
unsigned char state=0, i=0;
/*************INTERRUPCAO*************/
#int_SSP
void isr_I2C()
{
   clear_interrupt(int_SSP);
   state = i2c_isr_state();
   if(state == 0x80){
      output_d(buffer[i]);
      i2c_write(buffer[i++]);  //envia dado requerido
      if(i==17) i=0;   
   }
}


/*************FUNCAO*************/
void uC_inicia(void)
{
   set_tris_c(0b00011000); // configura pino C3 e C4 como entrada

   enable_interrupts(INT_SSP);  //interrupção do i2c no escravo
   enable_interrupts(global);
}

/*************PROGRAMA*************/
void main()
{
   uC_inicia();
   while(1);   
}


Alguém pode me ajudar a resolver isso? É meio urgente =/[/quote]
vinny
Bit
 
Mensagens: 16
Registrado em: 02 Set 2009 14:59
Localização: Curitiba-PR

Mensagempor tcpipchip » 01 Dez 2009 17:21

ola, procura no FORUM, este assunto foi discutido 10 dias atras
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para PIC

Quem está online

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

x