La compilación de producción PIC18F1220 del código C no funciona

2

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.

    

2 respuestas

5

El problema aquí es que el PIC18F1220 y el 18F1320 requieren que el pin MCLR esté conectado al menos a una resistencia de Vdd a 1-10kOhm. Esto habilita el POR como indica la hoja de datos. Si el pin MCLR se deja desconectado, el POR no se generará y la imagen permanecerá en estado de reinicio. Es por esto que no habrá salida de reloj (y ningún programa ejecutado). Las configuraciones de depuración funcionan a medida que el programador cuida el pin MCLR cuando se conecta al programador durante la depuración y la programación de chips.

La conexión de trabajo más simple para hacer que el chip funcione es conectar el pin MCLR a Vdd usando una resistencia (asumiendo que el tiempo de subida de Vdd es rápido). Se requiere un condensador cuando hay un aumento lento en el Vdd (consulte la página 32 de la hoja de datos de PIC18F1X20).

    
respondido por el The amateur programmer
3

Al programar un dispositivo con código de liberación usando MPLABX, no use el botón "Ejecutar". El botón "Crear y programar dispositivo" se utiliza para programar un dispositivo con un código de liberación.

PorloquemedijouningenierodeaplicacionesdecampodeMicrochip,elbotón"Ejecutar" es un remanente de NetBeans (el IDE en el que se basa MPLABX). El botón "Ejecutar" funciona a veces y no otro.

    
respondido por el vini_i

Lea otras preguntas en las etiquetas