TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Promo_byte 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);
}
}
- Tienes que ingresar para ver archivos adjuntos -
- Tienes que ingresar para ver archivos adjuntos -
- Tienes que ingresar para ver archivos adjuntos -
Espero que puedan ayudarme que llevo algunos días intentando solucionarlo pero nada! :( :( :(
Modificar mensaje
-
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
-
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.
:? :? :(
-
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.
-
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 -
-
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.
-
Acabo de probar y lo mismo pasa :? :? :( :(
-
Acabo de probar y lo mismo pasa :? :? :( :(
¿Y no tienes un osciloscopio?
Esa sería una manera de ver que está pasando.
-
No sinceramente :shock: :(
Estoy pensando si el sensor es iniciado correctamente... pero ya no se que mas buscar :(
-
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.
-
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.
-
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.
-
¿Asi está conectado?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=51280.0;attach=32381;image)
Porque necesitás resistencias de pullup de ambos lados del adaptador de nivel.
-
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.
-
¿Asi está conectado?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=51280.0;attach=32381;image)
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.
-
¿Asi está conectado?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=51280.0;attach=32381;image)
Porque necesitás resistencias de pullup de ambos lados del adaptador de nivel.
Hola Eduardo, si claro. Así está conectado, aunque tambien probe con las resistencias de PULL-UP en ambos lados pero no hubo cambios.
Con el conversor de nivel creia que no era necesario ya que al liberar el bus el sensor(este ya incluye pull- up en su pcb), tendria 3,3Vcc, y el conversor adapta la señal que llega al pic a 5V. Pero quizás me este saltando algún punto, pero no lo se
- Tienes que ingresar para ver archivos adjuntos -
-
Qué conversor de nivel estas usando? Hay algunos basados en integrados cpmo el TXS0108E con los que no deberias tener problemas, pero otros están hechos hechos en forma discreta con mosfets y no pondría las manos en el fuego por ellos.
-
¿Asi está conectado?
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=51280.0;attach=32381;image)
Porque necesitás resistencias de pullup de ambos lados del adaptador de nivel.
Hola Eduardo, si claro. Así está conectado, aunque tambien probe con las resistencias de PULL-UP en ambos lados pero no hubo cambios.
Con el conversor de nivel creia que no era necesario ya que al liberar el bus el sensor(este ya incluye pull- up en su pcb), tendria 3,3Vcc, y el conversor adapta la señal que llega al pic a 5V. Pero quizás me este saltando algún punto, pero no lo se
- Tienes que ingresar para ver archivos adjuntos -
Deberías quitar el conversor y conectarlo directamente con las resistencias de 1 k de pull-up, lo peor que puede pasar es que no funcione. Por seguridad, podrías poner los diodos de protección que te mencioné.
-
Eduardo, efectivamente es el que usa Mosfet. Algo que me sorprendió es que al no tener conectado ni 5V ni 0V en ninguno de los lados, tenían 3,3V(en Low Voltage) y 5V(High Voltage).
Sinceramente no me puse a analizar el circuito para comprobar que esto sea correcto :shock:, pero estimo que si, ya que al conectar con 0V de cualquiera de los lados, el que le corresponde también estaba a 0V.
- Tienes que ingresar para ver archivos adjuntos -
-
Eduardo, efectivamente es el que usa Mosfet. Algo que me sorprendió es que al no tener conectado ni 5V ni 0V en ninguno de los lados, tenían 3,3V(en Low Voltage) y 5V(High Voltage).
Sinceramente no me puse a analizar el circuito para comprobar que esto sea correcto :shock:, pero estimo que si, ya que al conectar con 0V de cualquiera de los lados, el que le corresponde también estaba a 0V.
- Tienes que ingresar para ver archivos adjuntos -
Podrías simplemente en una protoboar y con cables poner a 1 y 0 lógico en un lado y medir en el otro lado para determinar si "convierte" a los niveles de voltaje adecuados.
Supón que por ahí algo estaba mal y ya le pusiste 5V al sensor que sólo soporta 3.3V.
-
Si claro, probe esto y si funciona el conversor sin problemas.
En cuanto al sensor, pensé que quizás pudiera estar dañado :(, pero si funciona. Lo comprobé con un Arduino Mega.
Solo me queda probar el metodo de diodos como me mencionó DominusDRR. Sino ya no se que mas intentar :? :?
-
Si claro, probe esto y si funciona el conversor sin problemas.
En cuanto al sensor, pensé que quizás pudiera estar dañado :(, pero si funciona. Lo comprobé con un Arduino Mega.
Solo me queda probar el metodo de diodos como me mencionó DominusDRR. Sino ya no se que mas intentar :? :?
Mencioné de un posible daño por esto que escribiste:
tenían 3,3V(en Low Voltage)
Low Voltaje pienso que debe ser cero voltios para ambos lados.
Respecto a los diodos de protección es en caso que no uses el conversor y decidas conectar directamente el microcontrolador al sensor.
-
Hola Amigos, despues de horas y horas de quemarme la cabeza, decidí probar con otro compilador ya que no tenia nada que perder :-). Usé CCS y anduvo a la primera, asique que creo que con XC8 debo tener algun problema con las librerias o puede ser alguno de los Fuses(esto ultimo no creo).
Ahora bien, este sensor me esta dando mas dolores de cabezas pero creo que estoy cerca... :-) Espero que me puedan ayudar
El SENSOR(bmp180) no da el valor de la temperatura sino te da un valor de 16 bits que hay que hacer multiples opereaciones que estan indicadas en el datasheet... aqui el problema, en XC8 pude realizar estas operaciones obteniendo el valor correcto, pero aqui en CCS creo que no maneja de la misma manera los datos.
El código que me está dando problemas es el siguiente:
long long X2_1, X2_2, X2;
long T,MC,MD, B5 ;
long MC= -8711;
long MD = 2868;
X2_1 =(MC*2048); // DE ESTA MANERA TENGO PROBLEMAS
// X2_1 = -8711*2048; // DE ESTA MANERA TENGO EL RESULTADO CORRECTO
X2_2 = (X1 + MD);
X2= (X2_1 / X2_2);
B5 = X1+X2;
T = (B5+8)/16;
Los valores de las variables MC y MD son propias de cada sensor, pero estoy tomando las de ejemplo que figuran en el datasheet(-8711 y 2868 respectivamente), en fin... si declaro como esta en el código, MC como variable y le asigno un valor(como dije arriba, que me indica de ejemplo el datasheet que por cierto es negativo)o leo el dato directamente del sensor(en proteus, que es el mismo que esta en la hoja de datos) y lo guardo en esa variable, luego de hacer los calculos me da erroneo... perooo... si directamente en la linea X2_1 realizo la operación de multiplicación -8711*2048, el valor de la operación final B5 es correcto...
Para X1, tenia un problema similar, pero estimaba que era el tratamiento de variables y que estaban quedando muy chicas por las operaciones asique las declare como long long.
X1 = ((long long)(UT-AC6) * AC5) / 32768;
Como creen que puedo solucionar esto?
De paso muchas gracias por su ayuda en los comentarios anteriores! ((:-))
- Tienes que ingresar para ver archivos adjuntos -
-
Hola Amigos, despues de horas y horas de quemarme la cabeza, decidí probar con otro compilador ya que no tenia nada que perder :-). Usé CCS y anduvo a la primera, asique que creo que con XC8 debo tener algun problema con las librerias o puede ser alguno de los Fuses(esto ultimo no creo).
¿Pero por qué te funcionaba en el simulador?
¿Podías hacer algo tan básico en el XC8 como prender y apagar un led? Si ni eso funcionaba, debe ser un problema de fuses como indicas, pero eso tal vez era lo primero que debías probar antes de lanzarte hacer algo complejo.
Podrías leer como se generó los fuses con el CCS y comparar con el generado con el XC8
Voy a analizar el resto de lo que preguntas.
-
Gracias Dominus por tu ayuda :)!!!
La verdad que si probe el XC8, programé varios pic con sensores pero nunca había manejado I2C...asique mi primera experiencia no fue buena :(. Me parecía raro que funcionara en el simulador y no en en el protoboard, siempre que me simulaba en Proteus me funcionaba en la vida real.
-
Hola Amigos, despues de horas y horas de quemarme la cabeza, decidí probar con otro compilador ya que no tenia nada que perder :-). Usé CCS y anduvo a la primera, asique que creo que con XC8 debo tener algun problema con las librerias o puede ser alguno de los Fuses(esto ultimo no creo).
Ahora bien, este sensor me esta dando mas dolores de cabezas pero creo que estoy cerca... :-) Espero que me puedan ayudar
El SENSOR(bmp180) no da el valor de la temperatura sino te da un valor de 16 bits que hay que hacer multiples opereaciones que estan indicadas en el datasheet... aqui el problema, en XC8 pude realizar estas operaciones obteniendo el valor correcto, pero aqui en CCS creo que no maneja de la misma manera los datos.
El código que me está dando problemas es el siguiente:
long long X2_1, X2_2, X2;
long T,MC,MD, B5 ;
long MC= -8711;
long MD = 2868;
X2_1 =(MC*2048); // DE ESTA MANERA TENGO PROBLEMAS
// X2_1 = -8711*2048; // DE ESTA MANERA TENGO EL RESULTADO CORRECTO
X2_2 = (X1 + MD);
X2= (X2_1 / X2_2);
B5 = X1+X2;
T = (B5+8)/16;
Los valores de las variables MC y MD son propias de cada sensor, pero estoy tomando las de ejemplo que figuran en el datasheet(-8711 y 2868 respectivamente), en fin... si declaro como esta en el código, MC como variable y le asigno un valor(como dije arriba, que me indica de ejemplo el datasheet que por cierto es negativo)o leo el dato directamente del sensor(en proteus, que es el mismo que esta en la hoja de datos) y lo guardo en esa variable, luego de hacer los calculos me da erroneo... perooo... si directamente en la linea X2_1 realizo la operación de multiplicación -8711*2048, el valor de la operación final B5 es correcto...
Para X1, tenia un problema similar, pero estimaba que era el tratamiento de variables y que estaban quedando muy chicas por las operaciones asique las declare como long long.
X1 = ((long long)(UT-AC6) * AC5) / 32768;
Como creen que puedo solucionar esto?
De paso muchas gracias por su ayuda en los comentarios anteriores! ((:-))
- Tienes que ingresar para ver archivos adjuntos -
Me parece que long no es parte del compilador de CCS (Imagen adjunta), creo que deberías usar signed int16 o signed int32
Referencia: https://www.ccsinfo.com/downloads/ccs_c_manual.pdf (https://www.ccsinfo.com/downloads/ccs_c_manual.pdf) Página 43.
Sería de conocer la opinión de alguien que conoce mejor a ese compilador
-
Hola, para mi que el problema es de velocidad, en el simulador va bien por que omite esa característica pero en el hadware real eso es importante, si el bus va muy rápido no da tiempo al chip de que se refresque y se bloquea, el compilador XC8 es más eficiente que CCS y si no controlas el tiempo de refresco del chip le pasa eso, en el datasheet de la sonda te viene el tiempo de refresco mínimo ¿lo has mirado?
saludos