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]