TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: thegame en 03 de Diciembre de 2021, 05:52:37

Título: I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 05:52:37
Muy buenas chicos

Nuevamente consultandolos, estoy intentando trabajar con el PIC16F88, en modo esclavo, a 100Khz, programando en C, con CCS, con un cristal de 4Mhz, intento leer de el un dato simple, un byte de un arreglo

Mi problema es que pareciera que aunque entra en la interrupcion, no esta operando como deberia, al maestro (PIC18F46K22) siempre le llega un 0xFF

He leido muchos de los post, y aplicado lo que dicen pero ciertamente no estoy logrando que funcione.

El maestro funciona con un cristal de 20Mhz, lei en un post que podria deberse a que no operan a la misma frecuencia el maestro y el esclavo, aplique los delays recomendados, los incremente, los disminui, y nada, siempre llega el 0xFF

Las resistencias de pull-up, son de 10K

Coloque un led en el pin A1 del esclavo (16F88) y lo hago encender al entrar a la rutina de interrupcion del SSP, pues, entra, y enciende el led, pero de ahi en mas, no hace nada, no se puede leer nada del esclavo, y en el maestro obtengo siempre un 0xFF (255)

mi directiva I2C para el esclavo la he modificado varias veces, segun lo que he leido, en particular un post que decia que si colocaba el FORCE_HW no funciona, pues en mi caso, lo he quitado, lo he puesto y siempre se enciende el led en la rutina de interrupcion, pero no se lee nada de el, solo un fantastico.......0xFF  :?

Les coloco las partes de codigo relevantes del maestro y del esclavo, las que tienen que ver con el I2C

Fuses, frecuencia de reloj y directiva I2C en el maestro:

Código: [Seleccionar]
#include<18f46k22.h>
#fuses HSH,NOPLLEN,PRIMARY_ON,NOWDT,PUT,NOBROWNOUT,NOPBADEN,MCLR,PROTECT,NOLVP,NOSTVREN,NODEBUG
#use delay(crystal=20000000)

//****************Directivas de perifericos*******************************************
#use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW=100000,FORCE_HW,STREAM=i2c_maestro)

Rutina de lectura que ejecuta el maestro:

Código: [Seleccionar]
            i2c_start(i2c_maestro);       //Inicio comunicacion
            delay_ms(1);
            i2c_write(i2c_maestro,0x99);  //Escribo direccion del esclavo
            delay_ms(1);
            i2c_write(i2c_maestro,0);     //Escribo la posicion que quiero leer del esclavo
            delay_ms(1);
            i2c_start(i2c_maestro);       //Reinicio el protocolo
            delay_ms(1);
            i2c_write(i2c_maestro,0x9A);  //Escribo direccion del esclavo + 1 (para lectura)
            delay_ms(1);
            dato=i2c_read(i2c_maestro,0); //Leo la posicion previamente enviada
            i2c_stop();                   //Detengo la comunicacion
            delay_ms(200);

Fuses, frecuencia de reloj y directiva I2C en el esclavo (esta entendido que habilito la interrupción del I2C):

Código: [Seleccionar]
#include<16f88.h>
#fuses MCLR,XT,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NODEBUG,NOFCMEN,NOIESO,PROTECT
#use delay(crystal=4000000)

//****************Directivas de perifericos*******************************************
#use i2c(SLAVE,SCL=PIN_B4,SDA=PIN_B1,ADDRESS=0x99,SLOW=100000,FORCE_HW,STREAM=sensor)

Funcion de interrupcion para el esclavo (SSP):

Código: [Seleccionar]
//Interrupcion por recepcion de I2C
#INT_SSP
void recepcion_i2c(void)
{
   unsigned int8 incoming, state;
   
   output_high(PIN_A1);
   
   state = i2c_isr_state(sensor);
   
   if(state < 0x80)                      //Master is sending data
   {
      if(state == 0)
      {
     
      }
      if(state == 1)     //First received byte is address
      {
         incoming = i2c_read(sensor);
         address = incoming;
         //fprintf(uart_maestro,"direccion: %u\n",address); //solo para debug
      }
      else if(state >= 2 && state != 0x80)
      {  //Received byte is data
         incoming=i2c_read(sensor);
         buffer[address] = incoming;
         //fprintf(uart_maestro,"dato recibido: %u\n",buffer[address]);
      }
   }

   if(state >= 0x80)                      //Master is requesting data
   {
      i2c_write_slave(sensor,buffer[address]);
   }
}

Como se puede apreciar, en la funcion de interrupcion del esclavo, coloque unos fprintf, para ver si realmente llegaba a ese punto, y jamas los ejecuta, ni una sola ves. peroooooo, siempre enciende el led, y siempre recibo en mi maestro, el 0xFF

La verdad es que nunca habia tenido la necesidad de leer datos por I2C, desde un PIC como esclavo, escribirlo si, y sin problemas (este modelo el 16F88 no, pero si otros PIC) por lo que no se si estoy omitiendo algun paso, ojala alguien que si pudo implementar la comunicacion con este PIC, me pueda echar una mano.

Tambien revise el erradata del PIC, y para mi desgracia, si tiene un problema con repetidas ejecuciones de la condicion de Start, pero espero que alguien me pueda decir que lo usa sin problema  :D

Saludos y pendiente de sus comentarios


Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 09:08:50
¿Necesitas un retardo de 1 ms antes de reiniciar el protocolo?

Yo tenía muchos dolores de cabeza con esto de la I2C, y en general, aunque no lo creas, sabe tomar mucho tiempo en encontrar los problemas.

Comúnmente por ahí te falta enviar un ACK/NACK o el tiempo entre comandos (delays) es grande.

Personalmente yo te recomendaría comprar un analizador lógico, desde que utilizo eso, puedo examinar las tramas y ver donde está el problema.

Respecto a tu cuestión, acá tienes un artículo en español de la comunicación I2C entre dos PICs con CCS:

http://rubensm.com/i2c-en-pic-utilizando-ccs-como-master-y-slave/ (http://rubensm.com/i2c-en-pic-utilizando-ccs-como-master-y-slave/)

Tal vez te pueda servir de referencia para comparar tu código.

Siento mucho no ser de más ayuda.

Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 13:35:05
Te agradezco DominusDRR

Ese retardo lo coloque ya que leyendo aqui mismo, otro compañero lo uso en una situacion identica para hacerlo funcionar, con situacion identica me refiero a tener el Maestro a 20Mhz, y el Esclavo a 4Mhz

Aunque he probado tambien sin esos delays, y la situacion es la misma, a pesar de que entra a la interrupcion, solo puedo leer un 0xFF en el maestro

Ya antes hice escritura en un PIC como esclavo dentro del bus I2C, pero nunca lectura, y ahi es donde estoy fallando

El analizador logico, o un buen osciloscopio, ya se los pedi a Santa jajaja aunque no creo que me los traiga  :D :D..... :(

Leere la informacion que me compartes, muchas gracias

Saludos y sigo en ello
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 13:41:39
Te agradezco DominusDRR

Ese retardo lo coloque ya que leyendo aqui mismo, otro compañero lo uso en una situacion identica para hacerlo funcionar, con situacion identica me refiero a tener el Maestro a 20Mhz, y el Esclavo a 4Mhz

Aunque he probado tambien sin esos delays, y la situacion es la misma, a pesar de que entra a la interrupcion, solo puedo leer un 0xFF en el maestro

Ya antes hice escritura en un PIC como esclavo dentro del bus I2C, pero nunca lectura, y ahi es donde estoy fallando

El analizador logico, o un buen osciloscopio, ya se los pedi a Santa jajaja aunque no creo que me los traiga  :D :D..... :(

Leere la informacion que me compartes, muchas gracias

Saludos y sigo en ello

Un osciloscopio y un analizador lógico son herramientas muy necesarias en esto de los sistemas embebidos:

Yo utilizo este analizador sencillo:

(http://dangerousprototypes.com/docs/images/8/8c/Ols-cover_es.jpg)

de http://dangerousprototypes.com/docs/File:Ols-cover_es.jpg (http://dangerousprototypes.com/docs/File:Ols-cover_es.jpg)


Y me ha ayudado justo con problemas I2C:

(https://www.microchip.com/forums/download.axd?file=2;1187757&filename=Figure%203.png)
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 13:51:54
Buscare una opcion asi, el que colocas creo que ya no esta a la venta, al menos en las paginas de vendedores que menciona

Muchas gracias

Saludos
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 13:56:13
Buscare una opcion asi, el que colocas creo que ya no esta a la venta, al menos en las paginas de vendedores que menciona

Muchas gracias

Saludos

yo lo compré de aquí, allá por el año 2013 o 2014.

https://www.seeedstudio.com/Open-Workbench-Logic-Sniffer-p-612.html (https://www.seeedstudio.com/Open-Workbench-Logic-Sniffer-p-612.html)

pero ya tiene sus años, pero aun me sirve.
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 15:35:13
Fuera de stock  :( :( :(

buscare otra opcion porque si no tardare mas en encontrar el problema, esta raro, por la tarde cambiare de PIC, solo para descartar que este dañado, que lo dudo pero no esta de mas

Tambien he pensado en estandarizar la frecuencia de trabajo para ambos, ya sea los dos a 4Mhz o los dos a 20Mhz

Si alguien tiene algun ejemplo que sepan que funciona en ese PIC (16F88) en modo esclavo les agradeceria si me pudieran dar algun consejo de que puede estar mal.

Saludos
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 15:39:07
Fuera de stock  :( :( :(


Parece que es el problema de la escases de semiconductores.

Respecto a tu problema, podrías intentarlo con osciloscopio, es un poco más laborioso, pero para ambos caso es mejor depurando el código.

Es decir con puntos de ruptura antes de enviar o recibir una trama.

De esa manera vas analizando poco a poco tu código hasta llegar a un punto de descubres que algo no va bien.
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 15:43:24
Correcto, intentare conseguir uno para depurar paso a paso que sucede

muchas gracias DominusDRR
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 15:46:05
Correcto, intentare conseguir uno para depurar paso a paso que sucede

muchas gracias DominusDRR

¿Y simulando y depurando en Proteus?

Me imagino que si tiene un analizador de I2C incluido
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 15:47:42
Por cierto, he revisado el codigo del enlace, lo veo similar a lo que tengo, solo veo que pone en la directiva de I2C, FAST a 100Khz, tenia entendido que esa velocidad es para SLOW

No se si de plano me toque cambiar de PIC y evitar problemas, he estado mirando algunos modelos que no reportan errores en el modulo I2C (en el erradata) y creo tener uno disponible, hare primero la depuración, si no da resultados, probare con otro PIC a ver si se resuelve el tema

Si proteus si lo tiene, y podria hacerlo, aunque, sinceramente no me da mucha confianza del todo Proteus, prefiero armarlo en fisico, no descarto la opcion, tambien lo intentare


Saludos
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 03 de Diciembre de 2021, 15:48:07
Correcto, intentare conseguir uno para depurar paso a paso que sucede

muchas gracias DominusDRR

¿Y simulando y depurando en Proteus?

Me imagino que si tiene un analizador de I2C incluido


Algo así:


Obviamente es una simulación y en la práctica puede asomar mas cosas, pero ya te ayuda muchísimo.
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 03 de Diciembre de 2021, 15:49:56
Lo hare, si tengo Proteus a mano, algo debe ayudarme seguro
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 04 de Diciembre de 2021, 04:27:49
Pues con buenas y malas noticias

La buena es que ahora se que sucede con la comunicacion, he simulado en Proteus, y no se obtiene nunca el reconocimiento (ack), por ello la interrupcion salta pero no obtiene respuesta confirmatoria del esclavo, por ello, no hace nada de nada.

Para comprobar que lo estaba haciendo correcto en proteus, he simulado tambien, un programa que tengo mas que probado (esta operando en varias maquinas) y en ese, si que obtengo la respuesta del esclavo sin problema.

Ahora el tema sera, porque no reconoce su direccion el esclavo.

Adjunto imagen de la simulacion, donde se aprecia en el paquete que devuelve, el NACK

Seguimos avanzando.

  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 04 de Diciembre de 2021, 10:59:03
Pues con buenas y malas noticias

La buena es que ahora se que sucede con la comunicacion, he simulado en Proteus, y no se obtiene nunca el reconocimiento (ack), por ello la interrupcion salta pero no obtiene respuesta confirmatoria del esclavo, por ello, no hace nada de nada.

Para comprobar que lo estaba haciendo correcto en proteus, he simulado tambien, un programa que tengo mas que probado (esta operando en varias maquinas) y en ese, si que obtengo la respuesta del esclavo sin problema.

Ahora el tema sera, porque no reconoce su direccion el esclavo.

Adjunto imagen de la simulacion, donde se aprecia en el paquete que devuelve, el NACK

Seguimos avanzando.

  - Tienes que ingresar para ver archivos adjuntos -

¿Lo que te refieres a que no reconoce la dirección es de 7 bits y el octavo es el bit que te dice si es lectura o escritura?

Es decir el byte donde te viene la dirección, sólo debes tomar solamente los 7 bits
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 04 de Diciembre de 2021, 12:50:22
Pues con buenas y malas noticias

La buena es que ahora se que sucede con la comunicacion, he simulado en Proteus, y no se obtiene nunca el reconocimiento (ack), por ello la interrupcion salta pero no obtiene respuesta confirmatoria del esclavo, por ello, no hace nada de nada.

Para comprobar que lo estaba haciendo correcto en proteus, he simulado tambien, un programa que tengo mas que probado (esta operando en varias maquinas) y en ese, si que obtengo la respuesta del esclavo sin problema.

Ahora el tema sera, porque no reconoce su direccion el esclavo.

Adjunto imagen de la simulacion, donde se aprecia en el paquete que devuelve, el NACK

Seguimos avanzando.

  - Tienes que ingresar para ver archivos adjuntos -

Pregunta

¿No deberías hacer esto en el lado del esclavo?

Código: C
  1. if(state==0) //Address match received with R/W bit clear, perform i2c_read( ) to read the I2C address.
  2. {
  3.       i2c_read();
  4. }
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 04 de Diciembre de 2021, 14:47:43
Que tal Compañero Dominus

Lo de la direccion esta correcto, me refiero a que el esclavo deberia mandar un Ack cuando la direccion enviada por el maestro coincide con la suya, y no lo hace con la direccion 0x99, porque?, desconozco, la he cambiado a 0x50, y ahora si me envia el ack de que reconoce que es a el al que se le habla

despues de eso, seguia sin obtener ese bit de ack cuando enviaba datos, es decir, enviada direccion y respondia ACK, seguido de ello, mandaba un dato, y obtenia un NACK, entonces, hice lo que dices, pongo el i2c_read() despues de obtener estate ==0, pero seguia igual, reconocia la direccion pero no el dato.

de tantos post que he leido, recorde un compañero que mencionaba que el tuvo que probar con diferentes frecuencias en el slave, hasta donde observo que no tenia problemas, yo creo que se debe al timing que el protocolo debe tener asi que lo e intentado y al parecer, al menos en la simulacion, ahora si responde en ambos casos, direccion y dato, la he cambiado de 4Mhz a 8Mhz y como veras en la imagen, ya se ven los bits de ACK

Aun me falta probar en fisico, como te comente, no soy muy fan de proteus aunque hoy me ha sido de mucha ayuda

cuando tenga resultados del funcionamiento en fisico te comento.

Saludos y mil gracias por la ayuda

Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 04 de Diciembre de 2021, 14:58:13

Pregunta

¿No deberías hacer esto en el lado del esclavo?

Código: C
  1. if(state==0) //Address match received with R/W bit clear, perform i2c_read( ) to read the I2C address.
  2. {
  3.       i2c_read();
  4. }

Yo decía del i2c_read porque según entiendo (tal vez mal) i2c_read genera un ACK y tal vez por eso el esclavo no lo genera (mirar imagen)

Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 04 de Diciembre de 2021, 15:08:26
¿Y estás depurando tu código sin los delays?

Entre retardo y retardo es posible que se te pierda algo que envía el esclavo.

Pienso yo que deberías quitarlos.
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 04 de Diciembre de 2021, 15:42:23
es correcto retire los delays, y modifique la rutina de recepcion en la interrupcion del esclavo, y cambie de frecuencia a 8 Mhz y  ahi, al menos en la simulacion trabaja ya como deberia

la condicion que regresa i2c_read, por default genera el ACK, y si lo hace bien con las modificaciones mencionadas

ya solo me falta probar en fisico

saludos
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 04 de Diciembre de 2021, 15:48:59
es correcto retire los delays, y modifique la rutina de recepcion en la interrupcion del esclavo, y cambie de frecuencia a 8 Mhz y  ahi, al menos en la simulacion trabaja ya como deberia

la condicion que regresa i2c_read, por default genera el ACK, y si lo hace bien con las modificaciones mencionadas

ya solo me falta probar en fisico

saludos

Con el osciloscopio deberías observar que frecuencia tenía el reloj antes y luego de la mejora, para determinar si cambia con lo que dices.<

Si no se mantiene en 100 Hkz, implica que el compilador tiene algún problema.
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: remi04 en 04 de Diciembre de 2021, 20:30:12
Haz una cosa.

  Lee el registro SSPxM (la x sustituye el número de módulo que usas), y saca su valor con un printf.   Esto es para ver cómo la directiva te está configurando el origen del reloj del módulo SSPx

  Por otro lado, si puedes pon la configuración de todos los registros del oscilador que estás usando.

  Hay ocasiones en las que al pic no le resulta posible bajar a 100 khz, especialmente cuando se usan los PLL y te acaba trabajando a 250 u otra frecuencia distinta de la que esperabas.

  También puedes medirla con el osciloscopio en el pin clk.

  Saludos 
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 05 de Diciembre de 2021, 03:04:40
Que tal remi04

Desgraciadamente no cuento con osciloscopio para medir la frecuencia en el pin clk

creo que el tema de la velocidad del bus pudiese afectar en el lado del esclavo, hare lo que me indicas y les publico el resultado.

por lo pronto, decir que, en fisico, ya no obtengo el 0xFF en el maestro como inicialmente, ahora es un espantoso 0x00 siempre  :D :D

sigue sin funcionar en fisico, en la simulacion, agregue el PIC maestro, y o sorpresa, no hace nada de nada, pense que ahi tendria buenos resultados, pero no es asi, el I2C debug, me muestra cosas ilegibles, adjunto la imagen

sigo tratando de resolverlo con el 16F88, pero creo que ya ire pensando en una alternativa, aunque me resisto a dejarme vencer por el problema.

Saludos y gracias por los consejos y ayuda

  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 05 de Diciembre de 2021, 03:45:00
Mi problema me parece que no es en la velocidad de comunicacion a 100Khz

Creo que mi problema esta en la rutina de lectura desde el maestro, y por ende, la funcion en el esclavo, me explico

He probado una rutina simple de escritura, solo escritura, y he puesto el siguiente codigo en el esclavo:

Código: [Seleccionar]
//Interrupcion por recepcion de I2C
#INT_SSP
void recepcion_i2c(void)
{
   dato=i2c_read(sensor);
   
   if(dato==0x50)
   {
      dato=' ';
   }
   else if(dato=='A')
   {
      output_high(PIN_A1);
   }
}

Y desde el maestro, he mandado hacer lo siguiente:

Código: [Seleccionar]
            i2c_start(i2c_maestro);       //Inicio comunicacion
            ack2=i2c_write(i2c_maestro,0x50);  //Escribo direccion del esclavo
            if(ack2==0) //Si el bit de reconocimiento es valido
            {
               i2c_write(i2c_maestro,'A');     //Escribo el caracter a enviar al esclavo
            }
            i2c_stop();

Y funciona de maravilla, en fisico, sin problema

El maestro a 20Mhz, y el esclavo a 16Mhz, a 8Mhz y a 4Mhz, a la que ponga, funciona esta rutina

Entonces, mi bus I2C si que funciona, pero no estoy leyendo como debe ser, mi problema es la bendita lectura  :5]  :5]  :5]

Título: Re:I2C PIC16F88 Esclavo No Funciona [SOLUCIONADO]
Publicado por: thegame en 05 de Diciembre de 2021, 04:34:19
SOLUCIONADO  :-/

Me ha costado un poco, pero como he aprendido, he combinado lo que ya sabia hacer, con lo aprendido, se los comparto.

En el esclavo, he puesto lo siguiente:

La directiva de configuracion del I2C para el esclavo queda asi

Código: [Seleccionar]
#use i2c(SLAVE,SCL=PIN_B4,SDA=PIN_B1,ADDRESS=0x50,SLOW=100000,STREAM=sensor)
y el codigo en la rutina de interrupcion la he echo de la siguiente manera

Código: [Seleccionar]
//Interrupcion por recepcion de I2C
#INT_SSP
void recepcion_i2c(void)
{
   state=i2c_isr_state(sensor); 
   
   if(state<0x80)
   {
      dato=i2c_read();
      if(dato==0x50)
      {
         dato=' ';
         escritura=1;
      }
      else if(escritura==1)
      {
         address=dato;
         dato=' ';
         escritura=0;
      }
     
      if(dato==0x51)
      {
         dato=' ';
         lectura=1;
      }
   }
   else if(state>=0x80)
   {
      i2c_write_slave(buffer[address]);
      dato=' ';
      lectura=0;
   }
}

En el maestro, la directiba para el I2C queda asi

Código: [Seleccionar]
#use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW=100000,FORCE_HW,STREAM=i2c_maestro)
y la solicitud de datos o lectura la hago asi:

Código: [Seleccionar]
            i2c_start(i2c_maestro);       //Inicio comunicacion
           
            ack2=i2c_write(i2c_maestro,0x50);  //Escribo direccion del esclavo
           
            if(ack2==0)
            {
               i2c_write(i2c_maestro,0);     //Escribo la posicion quw quiero leer del esclavo
            }
           
            i2c_start(i2c_maestro);       //Reinicio el protocolo
           
            ack2=i2c_write(i2c_maestro,0x51);  //Escribo direccion del esclavo + 1 (para lectura)
           
            if(ack2==0)
            {
               dato=i2c_read(i2c_maestro,0); //Leo la posicion previamente enviada
            }
            i2c_stop();                   //Detengo la comunicacion

Los PIC quedan operando uno a 20Mhz (maestro 18F46K22) y otro a 16Mhz (esclavo 16F88)

Lo he probado en fisico, y funciona bien  :-)

Ojala a alguien le sirva esta experiencia, si algo no esta claro, con gusto lo aclaramos

Saludos y muchas gracias compañeros

P.D.: Si algun moderador me hiciera favor de agregar en el titulo del post el [SOLUCIONADO] se lo agradecere mucho
Título: Re:I2C PIC16F88 Esclavo No Funciona [SOLUCIONADO]
Publicado por: DominusDRR en 05 de Diciembre de 2021, 09:53:32
SOLUCIONADO  :-/

Me ha costado un poco, pero como he aprendido, he combinado lo que ya sabia hacer, con lo aprendido, se los comparto.

En el esclavo, he puesto lo siguiente:

La directiva de configuracion del I2C para el esclavo queda asi

Código: [Seleccionar]
#use i2c(SLAVE,SCL=PIN_B4,SDA=PIN_B1,ADDRESS=0x50,SLOW=100000,STREAM=sensor)
y el codigo en la rutina de interrupcion la he echo de la siguiente manera

Código: [Seleccionar]
//Interrupcion por recepcion de I2C
#INT_SSP
void recepcion_i2c(void)
{
   state=i2c_isr_state(sensor); 
   
   if(state<0x80)
   {
      dato=i2c_read();
      if(dato==0x50)
      {
         dato=' ';
         escritura=1;
      }
      else if(escritura==1)
      {
         address=dato;
         dato=' ';
         escritura=0;
      }
     
      if(dato==0x51)
      {
         dato=' ';
         lectura=1;
      }
   }
   else if(state>=0x80)
   {
      i2c_write_slave(buffer[address]);
      dato=' ';
      lectura=0;
   }
}

En el maestro, la directiba para el I2C queda asi

Código: [Seleccionar]
#use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW=100000,FORCE_HW,STREAM=i2c_maestro)
y la solicitud de datos o lectura la hago asi:

Código: [Seleccionar]
            i2c_start(i2c_maestro);       //Inicio comunicacion
           
            ack2=i2c_write(i2c_maestro,0x50);  //Escribo direccion del esclavo
           
            if(ack2==0)
            {
               i2c_write(i2c_maestro,0);     //Escribo la posicion quw quiero leer del esclavo
            }
           
            i2c_start(i2c_maestro);       //Reinicio el protocolo
           
            ack2=i2c_write(i2c_maestro,0x51);  //Escribo direccion del esclavo + 1 (para lectura)
           
            if(ack2==0)
            {
               dato=i2c_read(i2c_maestro,0); //Leo la posicion previamente enviada
            }
            i2c_stop();                   //Detengo la comunicacion

Los PIC quedan operando uno a 20Mhz (maestro 18F46K22) y otro a 16Mhz (esclavo 16F88)

Lo he probado en fisico, y funciona bien  :-)

Ojala a alguien le sirva esta experiencia, si algo no esta claro, con gusto lo aclaramos

Saludos y muchas gracias compañeros

P.D.: Si algun moderador me hiciera favor de agregar en el titulo del post el [SOLUCIONADO] se lo agradecere mucho

Una pregunta

¿Y qué mismo fue el problema? No lo capto aún.

Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 05 de Diciembre de 2021, 14:16:41
Que tal Dominus, te enlisto los dos cambios que resolvieron el problema

1.- En principio la direccion que configure en el esclavo no la tomaba (0x99), nunca respondia, la cambie (0x50) y empezo a responder

2.- Cambie la rutina de recepcion en el esclavo, la que muestro, porque no enviaba el dato correcto, me mandaba un 0x00 siempre

en general son los dos cambios importantes que hice, aunado a esto, probe el cambio de cristales a diferentes frecuencias, cambie la estructura de la directiva de I2C, los delays, la frecuencia del bus, etc etc

Pero en realidad, con los dos primeros puntos trabaja sin problema.

Saludos
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: DominusDRR en 05 de Diciembre de 2021, 14:22:05
Que tal Dominus, te enlisto los dos cambios que resolvieron el problema

1.- En principio la direccion que configure en el esclavo no la tomaba (0x99), nunca respondia, la cambie (0x50) y empezo a responder

2.- Cambie la rutina de recepcion en el esclavo, la que muestro, porque no enviaba el dato correcto, me mandaba un 0x00 siempre

en general son los dos cambios importantes que hice, aunado a esto, probe el cambio de cristales a diferentes frecuencias, cambie la estructura de la directiva de I2C, los delays, la frecuencia del bus, etc etc

Pero en realidad, con los dos primeros puntos trabaja sin problema.

Saludos

Bueno tener presente para la próxima.

Sólo con un analizador lógico que muestre las formas de onda (o un osciloscopio) se podría determinar que pasaba cuando la dirección era 0x99
Título: Re:I2C PIC16F88 Esclavo No Funciona
Publicado por: thegame en 05 de Diciembre de 2021, 15:37:39
Si tienes toda la razon, ya estoy por comprarme uno, es como bien se dijo, indispensable cuando se trabaja constantemente con estos sistemas.

Muchas gracias Dominus y compañeros

Saludos