TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: b.stronger en 26 de Septiembre de 2011, 01:57:17
-
Que tal amigos! saludos nuevamente!! Estoy aqui con nuevas dudas.... ahora con comunicación la i2c.
En fin, ahora estoy intentando realizar la comunicación entre 2 pics, un master 16f877a y un slave 16f88. La idea de primer prueba es mandar 1 dato desde el master al slave.. cosa que ya he logrado realizar GRACIAS a un código que me encontré aqui mismo en TodoPic. PERO dicha comunicación solo puedo realizarla cada 1 segundo. Sé que estoy haciendo muchas cosas mal... y solo necesito que guien mis pasos... q alguno me diga q estoy haciendo mal?? Porque repito... si hace la comunición, simplemente que no puedo realizarla más rapida!!...
El propósito del siguiente programa es q el master envie datos cambiantes cada 1 segundo (tiempo que quiero reducir), y el slave debe de mostrar por el puerto A... pero si cambio el tiempo del master, es decir, cambio de "1000" a "500", los datos no son recibidos correctamente.. y no sé porq??
MASTER::
#include <16F877a.h>
#fuses xt,nowdt
#use delay (clock=4M)
#use rs232(baud=9600, xmit=pin_c6,rcv=pin_c7)
#use i2c(master, sda=pin_c4, scl=pin_c3, fast)
void main()
{
int8 i;
while (true)
{
for (i=0;i<=20;i++)
{
delay_ms(1000); // valor a CAMBIAR ... si es menor a 1000, el slave no responde correctamente
printf("Outputting: %x\n\r", i);
i2c_start();
i2c_write(0xa0);
i2c_write(i);
i2c_stop();
}
}
}
SLAVE::
#include <16F88.h>
#fuses xt,nowdt
#use delay (clock=4M)
#use rs232(baud=9600, xmit=pin_b5,rcv=pin_b2)
#use i2c(slave, sda=pin_b1, scl=pin_b4, address=0xa0, fast, force_hw)
#byte TrisA=0x85
#byte TrisB=0x86
#byte PortA=0x05
#byte PortB=0x06
byte datoA=0,datoB=0;
#INT_SSP
void ssp_interupt ()
{
datoA = i2c_read();
datoB = i2c_read();
printf("Read byte 2: %x\n\r\n\r", datoB);
}
void main()
{
TrisA=0x00;
PortA=0;
delay_ms(1000);
printf("Running");
enable_interrupts(global);
enable_interrupts(int_ssp);
while (true)
{
PortA=datoB;
}
}
El código tal cual como está funciona!!.. Sin embargo... me gustaría saber .. qeu debo de hacer para q pueda recibir los datos más rapido...Por cierto el RS232, lo utilizo unicamente para monitoriar q reciba los datos!!
PD:: Y si no puedo disipar mis dudas.. espero que a alguien les sirva mis avances!! Saludos y gracias!!
-
Hola B.Stronger,
Mira, esta misma circunstancia estoy resoviéndola para un proyecto donde voy a comunicar un maestro con 3 esclavos por medio del bus I2C.
El primero punto a considerar es que tienes un maestro que deberá correr a una velocidad de 20Mhz y un esclavo que corre a una velocidad de 4Mhz, entonces estas diferencias las debemos compensar con retardos entre las instrucciones de escritura o lectura del master.
Te anexo una copia de la rutina de lectura que tengo yo en el master y que lee correctamente los datos desde el esclavo.
void lectura (byte direccion,byte posicion,byte dato_leido)
{
i2c_start(); // Comienzo de la comunicación
delay_ms(1);
i2c_write(direccion); // Dirección del esclavo en el bus I2C
delay_ms(1);
i2c_write(posicion); // Posición de donde se leerá el dato en el esclavo
delay_ms(1);
i2c_start(); // Reinicio
delay_ms(1);
i2c_write(direccion+1); // Dirección del esclavo en modo lectura
delay_ms(1);
dato_leido=i2c_read(0); // Lectura del dato
delay_ms(1);
data2=dato_leido;
i2c_stop(); // Fin comunicación
if (flag==0)
{ //Muestra lectura del primer pic esclavo
lcd_gotoxy(1,2);
//lcd_putc(%c data2);
printf (lcd_putc, "Pos.%d Dato= %X" posicion,data2);
flag=++flag;
}
}
Los retardos de 1ms entre instrucciones, permiten al esclavo estar listo para responder a la siguiente instrucción dentro de la atención a interrupcion.
Espero que te sirva este ejemplo, saludos
-
Hola compañeros
hace unos meses logre comunicar varios pic por i2c
eran 1 maestro y dos esclavos,
la velocidad me dijeros no es la del clock del micro
sino la del bus,de comunicacion.
mira este hilo:
http://www.todopic.com.ar/foros/index.php?topic=38547.msg320771#msg320771