¿Por qué este PIC18LF1220 programa solo dos veces y luego falla la programación?

Tengo un PIC18LF1220 en paquete SSOP de 20 pines funcionando a 4 MHz desde una fuente de reloj interna y 3,3 voltios. He soldado el microcontrolador en una placa de circuito impreso con un plano de tierra en la capa inferior y la imagen está en la capa superior. Estoy usando dos capacitores de derivación de cerámica de 0.1 µF, uno para VDD y VSS y otro para el par AVdd y AVss. También tengo una resistencia pullup de 10kOhm en el pin MCLR. Tengo el encabezado de programación en la placa a unos 3 cm de la imagen y un par de la primera programación en esta placa prototipo funcionó bien, pero después de que se ejecuta esta primera programación, ICD3 dice lo siguiente:

Programming...
program memory
Address: 0 Expected Value: 59 Received Value: 0
Failed to program device

Este es el tercer chip de imagen a bordo que se niega a programar nuevamente. He tenido que cambiar el chip cada dos nuevos programas prototipo ya que siempre ha ocurrido el mismo problema después de dos ejecuciones de programación. ¿Por qué la imagen se niega a reprogramarse después de dos programaciones anteriores que funcionaron bien? Hice funcionar el programa anterior toda la noche para probar que funcionaba correctamente (solo un simple programa de parpadeo de pines) y ahora simplemente no hará nada, ya que parece que el borrado funcionó, pero no se cargó ningún código nuevo (al menos correctamente). Este comportamiento parece ser muy consistente ya que estos tres PIC han muerto después de intentar programarlos por tercera vez. A continuación se muestra el mensaje completo dado por ICD3.

Connecting to MPLAB ICD 3...

Currently loaded firmware on ICD 3
Firmware Suite Version.....01.43.35
Firmware type..............PIC18F

Programmer to target power is enabled - VDD = 3,250000 volts.
Target device PIC18LF1220 found.
Device ID Revision = 7

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x74f
configuration memory

Device Erased...

Programming...
program memory
Address: 0 Expected Value: 59 Received Value: 0
Failed to program device

¿Podría ser que este lote en particular que tengo tenga algunos problemas de memoria flash (he verificado este problema en tres fotos, una tras otra). El ICD3 informa que todos los chips que tengo aquí son de silicio de revisión 7. A continuación se muestran los bits de configuración que he estado usando si pudieran tener algo que ver con el problema (dudo mucho que causen este tipo de problema).

// CONFIG1H
#pragma config OSC = INTIO2     // Oscillator Selection bits (Internal RC oscillator, port function on RA6 and port function on RA7)
#pragma config FSCM = OFF        // 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 = OFF         // 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) code-protected)
#pragma config CP1 = OFF         // Code Protection bit (Block 1 (000800-000FFFh) code-protected)

// CONFIG5H
#pragma config CPB = ON         // Boot Block Code Protection bit (Boot Block (000000-0001FFh) 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)
¿Ha intentado alimentar el circuito por separado en lugar de hacerlo desde el programador? Solo un pensamiento, pero tal vez una vez que esté ejecutando su programa de parpadeo, esté causando un problema con la fuente de alimentación del ICD3.
@RogerRowland Intenté usar el ICD3 para suministrar energía y una fuente de alimentación externa también sin éxito al tratar de reprogramar el chip. Ambos suministrando 3.3v. Otra cosa extraña es que he estado usando PIC18F1220 (el mismo chip que conozco con voltajes operativos más estrechos), la única diferencia es que es una versión empaquetada DIP. No he tenido ningún problema con ese 18F1220 en paquete de inmersión.
¿Tiene éxito un borrado seguido de un cheque en blanco?
@brhans No lo intenté, pero el problema parecía ser solo este borrado, ya que 3.3 voltios no son suficientes para quemar los fusibles de protección del código, por lo que algunos bits de configuración no se pueden borrar cuando se usan menos de 5 voltios en la fase de programación. Sin embargo, no sé si eso se vería en un cheque en blanco después de borrarlo.

Respuestas (1)

Creo que el bit de protección de bloqueo de arranque puede estar prohibiendo escribir en 0x0 (?)

config CPB = ON  // Boot Block Code Protection bit (000000-0001FFh)
Hola: hipótesis interesante, excepto : (a) Esos bits de configuración se borran durante un borrado completo del dispositivo que, según la salida del OP, tiene éxito; (b) ¿Cómo explicaría esto por qué la programación solo falla en el tercer intento, después de 2 éxitos anteriores? Si esta hipótesis fuera cierta, y si esa configuración no se borrara durante el borrado de un dispositivo, seguramente el segundo intento de programación debería fallar. Por lo tanto, en base a esas 2 razones, esta hipótesis no parece ajustarse a los datos informados. ¿O cree que entendí mal la hipótesis o los datos informados? Me alegra que me corrijan :-)
¡Sí, este fue el caso! El problema fue causado por ese bit de configuración ya que estaba usando 3.3 voltios para programar el chip y eso no fue suficiente para quemar el fusible de protección del código. Después de aumentar el voltaje a 5 voltios y borrar ese bit, pude programarlo nuevamente usando 3.3 voltios. Algunas de estas fotos requieren 5 voltios para quemar algunos de los fusibles. Cuando estos fusibles siguen siendo los mismos, se pueden programar usando 3 voltios.
Feliz de que funcionó, ya que @SamGibson tenía razón. Fue una suposición.