Konfigurationsproblem mit pic16F877A

Ich baue ein Programm für einen PIC16F877A. Im Simulator MPLABX scheint es korrekt zu laufen. Ich verwende etwa die Hälfte des verfügbaren Programm- und Datenspeichers.

Beim Programmieren erhalte ich folgende Meldung:

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0xfff
configuration memory
Debug Executive
Address: 1f00 Expected Value: 1170 Received Value: 3fff
Failed to program device

Unter der Simulatorsituation habe ich in den Programmspeicher geschaut. Die Adresse 1F00 wird nicht verwendet und hat tatsächlich den Wert 3FFF. Wie gehe ich bei der Fehlersuche vor?

Das Programm ist in XC8 geschrieben.

Verwenden Sie den pickit3 im Programmiermodus "Hochspannung"? Ich habe das schon eine Weile nicht mehr benutzt, aber wenn Sie es mit einer Niederspannungsprogrammierung versuchen, kann es das Konfigurationswort vielleicht nicht ändern.
Programmieren Sie für Release oder Debug?
@BruceAbbott. Ich programmiere für debug. Habe auch deine Antwort angeschaut. Werde nachforschen.

Antworten (2)

Für das Hardware-Debugging wird ein zusätzliches Stück Code namens "Debug Executive" von 0x1F00-1FFF in den Programmspeicher geladen. Aus irgendeinem Grund kann Ihr Programmierer nicht in diesen Bereich schreiben. Drei mögliche Ursachen fallen mir ein:

  1. Der Flash ist schreibgeschützt.

Stellen Sie sicher, dass der gesamte Programmspeicher beschreibbar ist, indem Sie #pragma config WRT = OFFIhrem Code etwas hinzufügen.

  1. Sie haben tatsächlich einen PIC16F877 (kein 'A'), der unterschiedliche Konfigurationsbits hat.

Der 16F877 kann so konfiguriert werden, dass er 0x1F00-1FFF schreibgeschützt macht, während er andere Bereiche in Ruhe lässt. Die Lösung besteht darin, die richtige MCU auszuwählen und die entsprechenden Konfigurationsbits dafür zu setzen.

  1. Der Chip ist defekt, oder es handelt sich tatsächlich um einen anderen PIC, der nur 4.000 Wörter Programmspeicher hat.

Versuchen Sie, das Programm aufzufüllen, bis es mehr als die Hälfte des Speichers ausfüllt. Wenn die Programmierung über 0x1000 fehlschlägt, wissen Sie, dass es nur 4 KB funktionierenden Flash hat!

Der Flash war aufgrund eines unerwarteten Verhaltens einer Definition in der Header-Datei schreibgeschützt. Siehe meine Antwort

Fehler gefunden.

Das Konfigurationsbit WRT wechselte im Moment des Compilerstarts von OFF auf HALF. Also habe ich den gesamten Quellcode kommentiert und bin gegangen

void main(void){
   while(1){};
};

Kein Erfolg. Mit nur xc.h kein Problem. Mein Header verursacht Probleme!!

#define ON  1
#define OFF 0

bewirkt, dass WRT von OFF auf HALF geändert wird

Interessant! Ich sehe, dass der generierte Quellcode für die Konfigurationseinstellungen diesen Kommentar enthält: „ Projekt-Enums anstelle von #define für ON und OFF verwenden “. Jetzt wissen wir warum!