Raro Chaly, siempre que programe con el XC8, genere el .hex y luego de alli lo grabe con el programa del Pickit2 ( o su version para linux en linea de comandos ), y siempre coincidieron los FUSES.
Puede ser el GPIC tambien. La unica forma de saber con ciencia cierta quien es el equivocado es viendo el archivo .hex
Crear un programa basico que compile, y revisar el .hex para ver si los bytes son correctos o no.
Si lo son: El problema es el GPIC que no interpreta correctamente el .hex ( la parte de los bits de configuracion )
Si no lo son: Es el XC8 o hay algo mal configurado.
Antes en el MPLAB 8.xx existia un lugar donde decia si querias usar los bits de configuracion del codigo o usarlo de una tabla. Pero en MPLABX/XC8 no existe mas. Simplemente generar los bits de configuracion y listo. Pero recuerdo que si no detecta ningun fuse ( solo caso de PIC18 ), utiliza unos "default".
Si queres sacarte la duda, subi el .hex con "poco programa" solo el while(1) y vemos.
EDITO:
Acabo de ver una inconsistencia, en la version v1.36 de XC8 o del MPLAB, no me aparece el FUSE de DEBUG, a pesar que en le datasheet si figura. Aun asi, es el unico cambio respecto a lo demas:
Ejemplo:
#include <xc.h>
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config CP = OFF // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection (Code Protection off)
#pragma config WRT = OFF // FLASH Program Memory Write Enable (Unprotected program memory may not be written to by EECON control)
void main (void)
{
while(1)
{
}
}
Esto me genera el siguiente .hex:
:02000000FE2FD1 - Una instruccion ASM de salto
:060FFA00FD2F8301FD2F15 - 3 insrtucciones ASM; 2 saltos y 1 clrf status
:02400E007AFD39 - Config
:00000001FF - Fin del archivo
En negrita estan mis fuses en little endian es decir el valor de los FUSES es:
0xFD7A = 11
11 1101 0111 1010En si solo posee 14 bits, pero el .hex se maneja de bytes, por eso completa con 1.
Nos queda:
11 1101 0111 1010Observando el datasheet, tenemos que:
CP off =
11 1101 01
11 1010 (Son dos pares y deben coincidir)
DEBUG Off = 11
1101 0111 1010
Sin implementar = 11 1
101 0111 1010
WRT Off = 11 11
01 0111 1010
CPD Off = 11 110
1 0111 1010
LVP Off = 11 1101
0111 1010
BOR On = 11 1101 0
111 1010
PWRTE Off = 11 1101 0111
1010
WDT Off = 11 1101 0111 1
010
FOSC HS = 11 1101 0111 10
10A pesar de que no tengo el bit de configuracion DEBUG, el codigo es el correcto.
El formato es correcto:
:02 400E 00 7AFD 39
Cantidad de Datos = 0x02 bytes
Direccion = 0x400E = es el doble de 0x2007 (Es el doble porque en el hex es de a 8bits, mientras que el PIC seria de a 16bits cada incremento en la direccion)
Tipo de linea = Datos = 0x00
Datos de esa linea en little endian = 0x7AFD
Checksum = 0x39
Revisa tu .hex, y verifica si los FUSES son los correctos. Si lo son entonces es el GPIC quien no detecta correctamente la configuracion. Resumen, deberias tener esta linea:
:02400E007AFD39