Autor Tema: I2C PIC16F88 Esclavo No Funciona  (Leído 6659 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
I2C PIC16F88 Esclavo No Funciona
« 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


Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #1 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/

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

Siento mucho no ser de más ayuda.

« Última modificación: 03 de Diciembre de 2021, 09:40:40 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #2 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
Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #3 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:



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


Y me ha ayudado justo con problemas I2C:

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #4 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
Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #5 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

pero ya tiene sus años, pero aun me sirve.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #6 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
Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #7 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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #8 en: 03 de Diciembre de 2021, 15:43:24 »
Correcto, intentare conseguir uno para depurar paso a paso que sucede

muchas gracias DominusDRR
Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #9 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
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #10 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
Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #11 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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #12 en: 03 de Diciembre de 2021, 15:49:56 »
Lo hare, si tengo Proteus a mano, algo debe ayudarme seguro
Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #13 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.

 

* fallo_1_comunicacion_NACK.jpg
(55.43 kB, 634x421 - visto 334 veces)

Nunca se deja de aprender

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:I2C PIC16F88 Esclavo No Funciona
« Respuesta #14 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
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything