Tengo este código simple que escribí para probar que mi circuito de programación funciona correctamente y se compila correctamente en el compilador xc8 pic c:
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG1H
#pragma config OSC = INTIO1 // Oscillator Selection bits (Internal RC oscillator, CLKO function on RA6 and port function on RA7)
#pragma config FSCM = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode enabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset enabled)
// BORV = No Setting
// 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 MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled, RA5 input pin disabled)
// CONFIG4L
#pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF // Low-Voltage ICSP Enable bit (Low-Voltage ICSP disabled)
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (00200-0007FFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (000800-000FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (00200-0007FFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (000800-000FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (00200-0007FFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (000800-000FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from table reads executed in other blocks)
#include <stdbool.h>
#include <stdint.h>
#define _XTAL_FREQ 8000000
inline void delayMs(uint8_t x){
for(uint8_t i = 0; i<x; i++){
__delay_ms(1);
}
}
void main(void) {
OSCCONbits.IRCF = 0b111;//8MHz drives directly
ADCON1bits.PCFG4 = 1;//Digital rb0 = an4
TRISBbits.RB0 = 0; //Output for led
PORTBbits.RB0 = 1;
while(true){
delayMs(250);
delayMs(250);
delayMs(250);
delayMs(250);
PORTBbits.RB0 = !PORTBbits.RB0;
}
}
El controlador está configurado para utilizar su fuente de reloj interna de 8 MHz con IO en el pin RA7 y la salida de reloj en RA6. El RB0 está conectado al led y la resistencia en serie y el Vdd de PIC está conectado a +5 voltios y Vss a tierra. Este código se ejecuta y se programa correctamente cuando se usa ICD3 y la compilación de depuración (el led comienza a parpadear cada segundo), pero cuando hago clic en el botón "RUN" en el MPLAB X, el ICD3 dice que la programación / verificación tuvo éxito, pero el led permanece apagado. He deshabilitado el temporizador de vigilancia en los bits de configuración junto con IESO y FSCM. LVP también está deshabilitado. También intenté programar el chip a través de MPLAB IPE tomando el archivo HEX de compilación de producción y programándolo usando el IPE sin suerte. Estoy usando MPLAB X IDE v3.30 e ICD3 como dispositivo de programación / depurador.
Básicamente, no entiendo por qué funciona la compilación de depuración y por qué no funciona la compilación de producción y no he encontrado ninguna razón para la diferencia después de leer la hoja de datos del PIC18F1220. También he comprobado que los bits de configuración son los mismos tanto en las versiones de depuración como en las de producción. Entonces, la pregunta es: ¿por qué la compilación de depuración funciona pero la compilación de producción no?
EDITAR: he intentado programar el chip con PicKit3 y eso no ayudó en absoluto, por lo que no es un problema de ICD3. También el ICD3 funciona bien con otros controladores de imagen en los que lo he probado, excepto los chips 18F1220. También parece que no puedo sacar nada del pin clkout (RA6) cuando el chip está programado con la versión de producción, pero hay una señal de reloj presente en el pin cuando se usa la versión de depuración.
EDITAR: También los chips que estamos usando son todos de revisión 7 o 0b111
de silicio según ICD3. He comprobado la errata, pero no parece haber ningún problema importante (al menos eso afectaría este simple código de parpadeo). También he intentado deshabilitar las soluciones de errata del compilador, pero no parece hacer ninguna diferencia, ya que la versión de depuración todavía funciona y la versión de producción aún no funciona.