fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

2 pics I2C

3 Respuestas
2 Usuarios
0 Reactions
4,583 Visitas
ma_black
Respuestas: 282
Topic starter
(@ma_black)
Ardero
Registrado: hace 19 años

hola alguien puede hecharme una mano para comunicar 2 pics por I2C, he conseguido comunicarlos pero ahora quiero mandar una trama de bytes para controlar servos,como" S01P7500"
como se hace con el puerto serie, pero solo recibo el primero, alguien conoce algun programa donde haya comunicacion de bytes por I2C.

Responder
2 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

Pues así a vote pronto me me ocurre preguntarte mas cosas:

¿Que velocidad usas?
¿Lo haces por hardware o software?
¿Que entorno de desarrollo usas?
¿Que pic usas?
¿Modo master-slave o multimaster?

Responder
ma_black
Respuestas: 282
Topic starter
(@ma_black)
Ardero
Registrado: hace 19 años

Bueno sigo con mis problemas de comunicacion por si alguien me puede hechar una mano, basicamente lo que hago es mandar una cadena de bytes a cada pic con 2 direcciones distintas y verlas por lcd, pero solo me funciona con un pic como esclavo, y recibe datos que no le tocan, los datos del esclavo 8 los muestra y los del 7(seria la direccion del segundo esclavo) tambien pero mal,

el master:

#include <18f458.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=20000000)
//#include <lcd.c>
#use fast_io(B)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW)

int buffer;
void main(void)
{
set_tris_d(0b11111111);
set_tris_e(0b000);

//delay_ms(1000); //retardo, por si acaso no da tiempo al esclavo a "inicializarse" para
//poder esperar a la informacion que le puede enviar el master
output_high(PIN_E2);
delay_ms(1000);
output_low(PIN_E2);

while(TRUE)
{

i2c_start(); //condicion de inicio
i2c_write(0x08); //direccion del esclavo con el que haremos la comunicacion
i2c_write('S'); //enviamos un dato, p.e el entero 5
i2c_write('1'); //enviamos un dato, p.e el entero 5
i2c_write('P'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('3'); //enviamos un dato, p.e el entero 5
i2c_write('5'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_stop(); //finalizacion de la comunicacion

delay_ms(1000); //introducimos retardo para que no este constantemte escribiendo

i2c_start(); //condicion de inicio
i2c_write(0x07); //direccion del esclavo con el que haremos la comunicacion
i2c_write('S'); //enviamos un dato, p.e el entero 5
i2c_write('2'); //enviamos un dato, p.e el entero 5
i2c_write('P'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('7'); //enviamos un dato, p.e el entero 5
i2c_write('5'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_stop(); //finalizacion de la comunicacion
delay_ms(1000); //introducimos retardo para que no este constantemte escribiendo

i2c_start(); //condicion de inicio
i2c_write(0x08); //direccion del esclavo con el que haremos la comunicacion
i2c_write('S'); //enviamos un dato, p.e el entero 5
i2c_write('1'); //enviamos un dato, p.e el entero 5
i2c_write('P'); //enviamos un dato, p.e el entero 5
i2c_write('1'); //enviamos un dato, p.e el entero 5
i2c_write('1'); //enviamos un dato, p.e el entero 5
i2c_write('5'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_stop(); //finalizacion de la comunicacion
delay_ms(1000); //introducimos retardo para que no este constantemte escribiendo

i2c_start(); //condicion de inicio
i2c_write(0x07); //direccion del esclavo con el que haremos la comunicacion
i2c_write('S'); //enviamos un dato, p.e el entero 5
i2c_write('2'); //enviamos un dato, p.e el entero 5
i2c_write('P'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('3'); //enviamos un dato, p.e el entero 5
i2c_write('5'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_write('0'); //enviamos un dato, p.e el entero 5
i2c_stop(); //finalizacion de la comunicacion
delay_ms(1000); //introducimos retardo para que no este constantemte escribiendo
}
}
y este es el esclavo:

#include <18f4580.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=20000000)
#include <flex_lcd_2.c>

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08, FORCE_HW)

#define LCD_DB4 PIN_B3
#define LCD_DB5 PIN_B2
#define LCD_DB6 PIN_B1
#define LCD_DB7 PIN_B0
//
#define LCD_RS PIN_B5
//#define LCD_RW PIN_B6
#define LCD_E PIN_B4

int count;
int buffer[9];

void main(void)
{

lcd_init();
lcd_putc("Esperando");

while(TRUE)
{
//i2c_poll solo se puede usar por hardware, detecta un byte en el buffer
//seguidamente se llama a la funcion i2c_read que devolvera el byte recibido ó 5 ó 6

//i2c_start(); // Start condition
count=0;
while(count!=9)
{
while(!i2c_poll()) ;
{
buffer[count++]= i2c_read(); //Read Next
}
}

//i2c_stop(); // Stop condition

if(buffer[0]=(0x08))
{
lcd_putc("f");
printf(lcd_putc,"%i",buffer[0]);
printf(lcd_putc," %C",buffer[1]);
printf(lcd_putc,"%C",buffer[2]);
printf(lcd_putc,"%C",buffer[3]);
printf(lcd_putc,"%C",buffer[4]);
printf(lcd_putc,"%C",buffer[5]);
printf(lcd_putc,"%C",buffer[6]);
printf(lcd_putc,"%C",buffer[7]);
printf(lcd_putc,"%C",buffer[8]);
}
else
{
buffer[0]=0;
buffer[1]=0;
buffer[2]=0;
buffer[3]=0;
buffer[4]=0;
buffer[5]=0;
buffer[6]=0;
buffer[7]=0;
buffer[8]=0;
}

Responder
Compartir: