Autor Tema: Problema I2C PIC18F4550 (ReadI2c)  (Leído 1990 veces)

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

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Problema I2C PIC18F4550 (ReadI2c)
« en: 01 de Agosto de 2022, 22:49:17 »
Hola a todos!   :)

Estoy empezando con PIC's y haciendo un proyecto importante, eh intentado realizar una comunicación I2C con el sensor de temperatura y presión BMP180. Todo iba bien, y hasta pude hacer el programa y simularlo completamente en PROTEUS, pero el problema aquí es que al llevarlo a la vida "real" este no funciona.
Después de horas y horas intentando, llegue a la conclusión que esta atascado en una función, mas precisamente en ReadI2C(), lo eh comprobado indicando con un led al salir de la rutina y es la única que me da problemas.

El programa es sencillo, quiero leer la posición 0xD0 que según la hoja de datos del sensor, tiene el valor cargado en 0x55.

En mi protoboard conecte como en la imagen de Proteus, solamente agregue un convertidor de niveles lógicos ya que el sensor trabaja con 3,3V, y conecte las resistencias de pull-up también.

El pic que estoy usando es el PIC18F4550 con la versión 1.31 de XC8.


// CONFIG1L
#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)

// CONFIG1H
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = OFF         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown-out Reset Voltage bits (Minimum setting 2.05V)
#pragma config VREGEN = OFF     // USB Voltage Regulator Enable bit (USB voltage regulator disabled)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = ON      // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config ICPRT = OFF      // Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <plib/i2c.h>
#include <pic18f4550.h>
#include <plib/delays.h>
#include <plib/usart.h>
#include "stdlib.h"
#include "math.h"

#define _XTAL_FREQ 20000000


void retardo();
void main(void){
    TRISDbits.RD1=0;
    //TRISBbits.RB0=1;
    //TRISBbits.RB1=1;
   
    int dato;
   
    while(1){
                 
    CloseI2C();
    OpenI2C(MASTER,SLEW_OFF);   //Modo MAESTRO y Slew rate OFF
    SSPADD=49;   //         clock = FOSC/(4 * (SSPADD + 1)), 100kHZ @ 20Mhz, velocidad de transmisión I2C
   
    StartI2C();
    IdleI2C();
    WriteI2C(0xEE);             //Dirección del esclavo y ESCRIBIR
    IdleI2C();
    WriteI2C(0xD0);             //dirección de memoria a leer
    IdleI2C();
    RestartI2C();
   
    IdleI2C();
    WriteI2C(0xEF);             //Dirección del esclavo y LEER
    IdleI2C();
   
    dato= ReadI2C();
   
    LATDbits.LATD1=1;
   
    NotAckI2C();
    StopI2C();
   
    retardo();
   
   
    }
    return;
}

void retardo(){
    int x;
    for(x=0;x<200;x++) {
        __delay_ms(5);
    }
}

 

* Lectura BMP180.png
(27.05 kB, 1146x348 - visto 247 veces)

 

* Mapa de memoria BMP180.png
(37.87 kB, 1159x355 - visto 253 veces)

 

* Proteus.jpg
(189.48 kB, 892x743 - visto 256 veces)



Espero que puedan ayudarme que llevo algunos días intentando solucionarlo pero nada!  :( :( :(
Modificar mensaje

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #1 en: 02 de Agosto de 2022, 09:33:29 »
Si dices que la simulación no tienes problema, lo más probable sea un problema del hardware.

Con la I2C y SPI, lo mejor es utilizar un analizador lógico, de esa manera encuentras el problema sin mucha pérdida de tiempo.

Pueda que sea la distancia entre el MCU y el otro dispositivo.

Pueda que sea el valor de las resistencias de pull-up ¿Por qué escogiste ese valor? ¿El fabricante del otro dispositivo indica eso? Prueba con valores mas bajos, 2k ó 1k
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #2 en: 02 de Agosto de 2022, 10:27:50 »
Gracias por tu ayuda, voy a intentar bajando el valor de las resistencias.

A rigor de verdad, estoy utilizando las resistencias de pull up del propio bmp180, que por lo que vi son de 4,7kOhm. Creo que con el adaptador de nivel no eran necesarias estas resistencias entre el convertidor de nivel y el pic. Igualmente probé tambien con resistencias de este lado colocando unas de 3,3kOhm y lo mismo sucedia.

Algo que si es cierto es el largo de los cables entre el PIC y el conversor de nivel, estoy utilizando los cables de protoboard que tienen como 20Cm, pero igual si pruebo con un Arduino Mega, este se comunica sin problema incluso sin usar el adaptador de nivel.

 :? :? :(

 
« Última modificación: 02 de Agosto de 2022, 11:17:43 por Promo_byte »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #3 en: 02 de Agosto de 2022, 11:25:36 »
Gracias por tu ayuda, voy a intentar bajando el valor de las resistencias.

A rigor de verdad, estoy utilizando las resistencias de pull up del propio bmp180, que por lo que vi son de 4,7kOhm. Creo que con el adaptador de nivel no eran necesarias estas resistencias entre el convertidor de nivel y el pic. Igualmente probé tambien con resistencias de este lado colocando unas de 3,3kOhm y lo mismo sucedia.

Algo que si es cierto es el largo de los cables entre el PIC y el conversor de nivel, estoy utilizando los cables de protoboard que tienen como 20Cm, pero igual si pruebo con un Arduino Mega, este se comunica sin problema incluso sin usar el adaptador de nivel.

 :? :? :(

 

El adaptador de nivel no creo que es necesario, ya que el bus I2C es de colector/drenador abierto tanto el reloj como los datos, y por eso se usa de las pull-up para definir el nivel de voltaje para 1 lógico.

El PIC es posible que con unas resistencias tan altas no vea como 1 lógico a los 3.3V.

Posiblemente necesites conectar las resistencias a 5 V.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #4 en: 02 de Agosto de 2022, 11:43:05 »
Entiendo, pero al adaptador de nivel lo conecte por dos motivos:

1- La entrada del PIC es a niveles de CMOS, entonces si no conecto el adaptador de señal 5-3,3V, la salida de datos y reloj del BMP180 estaran muy por el limite del nivel logico 1 del PIC que según tenia entendido este nivel es a partir de 3,5V.(Abajo dejo una imagen del datasheet, quizás este entendiendo mal esta información  :( ).

2- Si conecto resistencias de PULL-UP a 5Vcc en el micro, sin conectar el adaptador de nivel, estare metiendo 5V al BMP180 y este  soporta maximo de 3,5Vcc en la logica I2C.

Tu crees que es necesario como primer punto utilizar cables mas cortos? o de que otra manera? eh visto este problema en otros foros pero ninguno encuentra una solucion, yo también creo que es algo fisico. Aunque también existe la posibilidad de que tenga algun FUSE activado que me sugiera este problema???

De paso agradecerte por tu interes!! :)

 

* SCA_SCL.png
(76.41 kB, 500x278 - visto 241 veces)


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #5 en: 02 de Agosto de 2022, 11:59:29 »
Entiendo, pero al adaptador de nivel lo conecte por dos motivos:

1- La entrada del PIC es a niveles de CMOS, entonces si no conecto el adaptador de señal 5-3,3V, la salida de datos y reloj del BMP180 estaran muy por el limite del nivel logico 1 del PIC que según tenia entendido este nivel es a partir de 3,5V.(Abajo dejo una imagen del datasheet, quizás este entendiendo mal esta información  :( ).

2- Si conecto resistencias de PULL-UP a 5Vcc en el micro, sin conectar el adaptador de nivel, estare metiendo 5V al BMP180 y este  soporta maximo de 3,5Vcc en la logica I2C.

Tu crees que es necesario como primer punto utilizar cables mas cortos? o de que otra manera? eh visto este problema en otros foros pero ninguno encuentra una solucion, yo también creo que es algo fisico. Aunque también existe la posibilidad de que tenga algun FUSE activado que me sugiera este problema???

De paso agradecerte por tu interes!! :)

  - Tienes que ingresar para ver archivos adjuntos -

Primero conecta unas resistencias de 2k o 1K y mira que pasa.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #6 en: 02 de Agosto de 2022, 12:05:31 »
Acabo de probar y lo mismo pasa :? :?  :( :(

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #7 en: 02 de Agosto de 2022, 12:43:12 »
Acabo de probar y lo mismo pasa :? :?  :( :(

¿Y no tienes un osciloscopio?

Esa sería una manera de ver que está pasando.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #8 en: 02 de Agosto de 2022, 13:01:01 »
No sinceramente  :shock: :(

Estoy pensando si el sensor es iniciado correctamente... pero ya no se que mas buscar  :(

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #9 en: 02 de Agosto de 2022, 13:09:17 »
No sinceramente  :shock: :(

Estoy pensando si el sensor es iniciado correctamente... pero ya no se que mas buscar  :(

¿Puedes debugar?

Cuando no estés intentado interactuar con el bus I2C, podrías poner pausa la depuración, dicho bus estaría en reposo y las líneas de reloj y data en 1 lógico. En ese momento deberías medir el voltaje para conocer que es 1 lógico en el bus de datos están las líneas.

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

Desconectado Promo_byte

  • PIC10
  • *
  • Mensajes: 11
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #10 en: 02 de Agosto de 2022, 13:15:11 »
Como soy algo nuevo en esto nunca realice un debug, el pickit2 tampoco se si tiene esta opcion y creo que no porque es un clon y no la version original de Microchip.

Lo que intenté hacer es medir el voltaje al momento que el programa se cuelga en "ReadI2C". El bus esta liberado en este momento, o sea, que tengo 1 logico en SCA y SCL.

« Última modificación: 02 de Agosto de 2022, 13:18:07 por Promo_byte »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #11 en: 02 de Agosto de 2022, 13:17:58 »
Como soy algo nuevo en esto nunca realice un debug, el pickit2 tampoco se si tiene esta opcion y creo que no porque es un clon y no la version original de Microchip.

Lo que intenté hacer es medir el voltaje al salir al momento que el programa se cuelga en "ReadI2C". El bus esta liberado en este momento, o sea, que tengo 1 logico en SCA y SCL.

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

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #12 en: 02 de Agosto de 2022, 14:16:32 »
¿Asi está conectado?


Porque necesitás resistencias de pullup de ambos lados del adaptador de nivel.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #13 en: 02 de Agosto de 2022, 14:19:35 »
Entiendo, pero al adaptador de nivel lo conecte por dos motivos:

1- La entrada del PIC es a niveles de CMOS, entonces si no conecto el adaptador de señal 5-3,3V, la salida de datos y reloj del BMP180 estaran muy por el limite del nivel logico 1 del PIC que según tenia entendido este nivel es a partir de 3,5V.(Abajo dejo una imagen del datasheet, quizás este entendiendo mal esta información  :( ).

2- Si conecto resistencias de PULL-UP a 5Vcc en el micro, sin conectar el adaptador de nivel, estare metiendo 5V al BMP180 y este  soporta maximo de 3,5Vcc en la logica I2C.

Tu crees que es necesario como primer punto utilizar cables mas cortos? o de que otra manera? eh visto este problema en otros foros pero ninguno encuentra una solucion, yo también creo que es algo fisico. Aunque también existe la posibilidad de que tenga algun FUSE activado que me sugiera este problema???

De paso agradecerte por tu interes!! :)

  - Tienes que ingresar para ver archivos adjuntos -

Podrías utilizar diodos de protección (1N4148)  en las entradas del sensor conectadas a 3.3V mientras que las pull-up podrías llevarlas a 5V.

De esa manera protegerías al dispositivo y tendrías 5V como 1 lógico para el PIC y 3.3V para el sensor.

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

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Problema I2C PIC18F4550 (ReadI2c)
« Respuesta #14 en: 02 de Agosto de 2022, 14:21:36 »
¿Asi está conectado?


Porque necesitás resistencias de pullup de ambos lados del adaptador de nivel.

Creo que es una referencia de disieño que está tomando, donde ahí utilizan un conversor de niveles.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything