Expansor I2C PIC - PIC PIC16F877A como esclavo y PIC18F2550 como maestro.

#21
estamos trabajando con el CCS Compiler pero nos dicen q se puede hacer el trabajo con el 16f877 y el 18f2550 o 4550
 
#22
Entonces baja mi programa y adaptalo a tus necesidades....no es muy complejo solo tenés que ver la hoja de datos de tu PIC y mirar las direcciones correspondientes el módulo serial sincrónico y cambiar algunos datos en los programas ...si tenés dudas de como se hace poné tu programa y lo vamos viendo.
 
#25
baje el codigo que citaste antes peor me da error de version tengo isie 7.4 podrias volver a subirlo

No hay problema todos sabemos que a la mayoria de nosotros el tiempo no nos sobra.

Sobre la comunicacion I2C migre el codigo del master (18f2550) a un pic 16f877. Ahora funciona con los dos 16f877 siempre y cuando este enchufado la herramienta i2c debugger. Supongo que el problema era el pic 18f, que no se lleva bien con el isis.
Voy a seguir probando si puedo hacer andar en la simulacion y sino probare en la realidad.
Si alguien los quiere, subo los programas.
saludos
 
#29
probe el codigo tal como ud lo subieron y si hay comunicacion pero ciertos datos se pierden, en la imagen que subo del I2C Debug, se puede ver que va aunmentando B1, B2... pero aqui se salta porque se pierde la comunicacion y luego sigue con el B4. Lo cual para el ejemplo no es problema porque lo que se muestra es el conteo, Pero si seria problema si son datos que se van a procesar. Y con mas de un esclavo la comunicacion se corta. ¿Que podria hacer para asegurarme que todos los datos lleg?

Otra cosa que me llamo la atencion es que se ve como que no recibe la address del esclavo lo cual si se me hizo raro, en el dibujo lo marco con azul.
 

Adjuntos

#32
Un algoritmo CRC o código de redundancia cíclica es un algoritmo que permite comprobar la fiabilidad y la no alternación de los datos, en programación se utiliza para comprobar si existe corrupción de datos.

Por lo tanto tenes que ver que los datos que te hayan llegado sean correctos....igual esto se aplica a sistemas complejos ...con un simple checksum es decir mirás que por ejemplo la longitud de datos sea correcta o comparas los datos con otros puestos en memoria ,etc.

CCS tiene un ejemplo de CRC usado en RS485.
 
#33
hola moyano...
soy nueva en el foro.. y creo que tienes bastante idea acerca de pics... la vdd quiero aprender sobre la comunicacion I2C pero no encuentro ni pies ni kbeza!! espero me puedas hechar la mano... aunq sea un tema viejito... :oops:
 
#34
@inaths no entiendo tu consulta, si querés aprender sobre la comunicación I2C tendrías que leer como funciona el protocolo. Ahora si lo que vos querés es implementar una comunicación I2C en C para PIC acá puse un ejemplo.
Saludos y que andes bien !
 
#35
Hola moyanoo, soy nuevo y pasaba por acá y parece ser que tu sabes mucho sobre el tema de I2C con los pics, y ps la verdad yo soy nuevo en eso, almenos con el ccs compiler.

Mira la idea es que tengo 3 pics 16f873a dos como slaves y uno como master, y lo que quiero hacer es a los slaves les pongo un dato en el puerto B como entrada (diferente para cada slave) y con el maestro escojo cual de los dos leer, lo leo y muestro en algun puerto del master el dato que leí.

Tengo un GRAN problema, según varios ejemplos que he visto voy entendiendo como funcionan las sentencias y los comandos que necesito, y he podido hacer un programa para el maestro, que creo que funciona, almenos en lógica, mira:


----------------------------------------------------------------------------------------------------
#include <16f873a.h>
#fuses XT, NOWDT, PUT, NOPROTECT
#use delay (clock= 4000000)
#byte PORTB = 0X06
#byte PORTA = 0X05
#use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW)
#byte SSPCON = 0x14 //espacio de memoria, variable


int x=1, recibe;

void main (void)
{

set_tris_b(0XFF);
set_tris_a(0X01);
do
{

if (bit_test(PORTA,0)==1)
{
delay_ms(10);
bit_set(PORTA,1);
delay_ms(10);
i2c_start(); // inicio
i2c_write(0x0A); // direccion de slave1
i2c_write(0X06); // direccion del registro a buscar (puerto B)
i2c_start(); // re inicio
i2c_write(0x0A+1); // modo lectura
recibe=i2c_read(0);
i2c_stop(); // parada
delay_ms(20);
bit_clear(PORTA,1);
}
else
{
bit_set(PORTA,2);
delay_ms(10);
i2c_start(); // inicio
i2c_write(0x0B); // direccion de slave2
i2c_write(0X06); // direccion del registro a buscar (puerto B)
i2c_start();
i2c_write(0x0B+1);
recibe=i2c_read(0);
i2c_stop();
delay_ms(20);
bit_clear(PORTA,2);
}

PORTB = recibe;

}
while(x==1);

}
---------------------------------------------------------------------------------------------------
No se si le falte alguna instruccion importante o algo así. Y crees que está bien? enviar primero la direccion del esclavo y luego la del registro?

Y mi problema mas grande es el de hacer el programa para los slaves, no entiendo como funciona la interrupción para hacer la comunicacion y en la mayoria de los que he leido, la vdd no entiendo como hacerlo, se del modulo I2C y los registros que tienen las 16F87X, pero no entiendo ni 5 de como hacer el programa para los slaves.
Cualquier ayuda te l oagradeceria muchisiimo!! :)
 
#37
Lo que pasa es que urgente moyano, tu me podrías ayudar? jajaja es que toy MUY perdido, ese programa lo hice como de retasos... Tu no me podrias ayudar a ver como lo harías?
Gracias por tu ayuda en serio!! :)
 
#38
soy_nuevo en esto de i2c ojala i me puedan ayudar no e podido realizar la comunicación estos son mis programas

-------------------------------------------------------
maestro

# include <16f887.h>
#fuses INTRC,NOPROTECT,NOLVP,NOWDT
#use delay(clock=8000000)
#USE I2C (MULTI_MASTER,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0XA0,FAST,FORCE_HW)
void main(void)
{
i2c_start();
i2c_write(0XA1);
i2c_write(0b00111111);
i2c_stop();
delay_ms(1000);
i2c_start();
i2c_write(0XA1);
i2c_write(0b11111111);
i2c_stop();
delay_ms(1000);
i2c_start();
i2c_write(0XA2);
i2c_write(0b00111111);
i2c_stop();
delay_ms(1000);
i2c_start();
i2c_write(0XA2);
i2c_write(0b11111111);
i2c_stop();
}



-------------------------------------------------------
esclavo

# include <16f887.h>
#fuses INTRC,NOPROTECT,NOLVP,NOWDT
#use delay(clock=8000000)
#USE I2C (SLAVE, SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0XA1,FAST,FORCE_HW)


void main(void)
{
INT R1;



R1=i2c_read();

if(R1==(0b00111111))
{
output_b(0B00001111);
R1=i2c_read();
}

if(R1==(0b00111111))
{
output_b(0B00001111);
R1=i2c_read();
}
}
 
#40
Hola amigos soy nuevo en este tipo de conexion la i2C ,hice un sensor de tempreatura con el lm35 y el pic16f877 con salida a una lcd se me ha pedido utilizar el i2c me podria alguien explicar como fuinciona y como podria hacer esto por que no tengo ni dea de lo que se me pidio :/
 

Temas similares

Arriba