Ich habe den PIC16f887 sowohl auf den externen Quarz 20 MHz als auch auf den internen Oszillator 4 MHz eingestellt, keiner von ihnen hat jemals mit dem folgenden Code gearbeitet:
int main(void) {
ANSELbits.ANS5 = 0;
TRISEbits.TRISE0 = 0;
PORTEbits.RE0 = 1; // pin RE0 is high
TRISDbits.TRISD1 = 0; // pin RD1 is high
PORTDbits.RD1 = 1;
while(1);
return 0;
}
Aber mit den beiden oben genannten Oszillatormodi habe ich erfolgreich einige UART-Funktionen ausgearbeitet. Dies könnte also die Möglichkeit ausschließen, dass der PIC nicht funktioniert. Zumindest glaube ich das.
Um genau zu sein, meine Konfigurationsbits für INTOSC sind:
#pragma config FOSC = INTRC_CLKOUT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
Und was den externen Kristall angeht , habe ich gerade geändert:
#pragma config FOSC = HS
Da ich das Datenblatt immer wieder gelesen habe (vielleicht habe ich noch etwas Wichtiges ausgelassen), weiß ich, dass das erste, was einen Pin als I/O-Pin für allgemeine Zwecke verwendet, darin besteht, alle Peripheriegeräte zu löschen. So tat ich
ANSELbits.ANS5 = 0;
um sicherzustellen, dass sich RE0 im digitalen Ein-/Ausgangsmodus befindet.
Und ich setze das entsprechende Bit im TRIS-Register, um das Bit als Ausgang zu konfigurieren.
Aber es hat nie funktioniert.
aktualisieren
Ich habe überprüft, ob die Volt zwischen VDD / VSS und RE0 beide Null sind, was mich ziemlich verwirrt.
Weiß jemand was hier los ist? FYI, ich habe beide PIC16f887s getestet. Sie endeten alle gleich.
(Diese Antwort ist möglicherweise nicht korrekt. Bitte zögern Sie nicht, sie zu kommentieren und zu bearbeiten.)
Nachdem ich mich 2 Tage damit beschäftigt habe, habe ich endlich mehrere Probleme gefunden und das Problem gelöst.
Wenn ein Mikrocontroller wie hier nicht richtig zu funktionieren scheint, sollten Sie Folgendes überprüfen:
Nach einigem Testen und Prüfen stellte ich fest, dass das Problem, das ich hier hatte, darin besteht, dass ich das Zurücksetzen nicht implementiert und die LVP (Low-Volatge-Programmierung) eingeschaltet habe .
MCLR-Reset
Bei einigen PICmirco-Geräten kann das MCLR(Master Clear)-Signal intern über ein Konfigurationsbit MCLRE mit VDD verbunden werden . Wenn dieses Bit gesetzt ist, ist die MCLR-Funktion aktiviert. Und dann, wenn die Spannung am Pin niedrig ist, muss der Mikrocontroller zurückgesetzt werden. Wenn dieses Bit gelöscht ist, kann der MCLR-Pin als I/O-Pin verwendet werden.
Was mein Problem hier betrifft, so habe ich das MCLRE- Bit gesetzt, hatte aber den MCLR-Pin Floating . Da das MCLRE- Bit gesetzt ist, sollte der Pin als Eingang fungieren. Aber das Schweben des Pins machte es schwer vorherzusagen, wie hoch die Spannung ist.
Auf Seite 217 des Datenblatts PIC16F887 wird vorgeschlagen, einen 1k-Widerstand (oder größer) an VDD und einen 0,1uF-Kondensator (optional, nicht kritisch) an Masse zu binden. Dann sollte sich der Mikrocontroller niemals selbst zurücksetzen, außer POR, BOR und WDT-Timeout-Reset usw.
Ich habe den Kondensator tatsächlich durch einen Schalter ersetzt, sodass ich das Gerät jederzeit manuell zurücksetzen kann.
Niederspannungsprogrammierung
Ich wusste nicht, dass mich diese LVP- Sache beunruhigt, bis ich auf diesen Beitrag im Microchip-Forum stieß .
Microchip bietet uns zwei Programmiermodi: Hochspannungsprogrammierung und Niederspannungsprogrammierung.
Die Hochspannungsprogrammierung erforderte drei Dinge nacheinander (laut PICmirco Device Programming: What You Always Wanted to Know (But Didn't Know Who To Ask) Seite 2):
- Anlegen der geeigneten Stromquelle und Masse (VDD und VSS) an das Gerät;
- Erhöhen der Spannung am MCLR-Pin auf den Programmierspannungspegel (im Allgemeinen etwa 13 V), während gleichzeitig:
- Ziehen Sie die beiden bezeichneten E / A-Ports auf logisch niedrig und halten Sie sie dort.
Falls Sie nicht alle VDD und VSS ordnungsgemäß angeschlossen haben, sollten Sie dies tun. Weitere Informationen dazu finden Sie unter Wenn eine PIC-MCU mehrere Vdd/Vss liefert, sollten Sie sie alle mit Strom versorgen? .
Die Unterschiede zwischen den Anforderungen an die Niederspannungsprogrammierung (auch Single-Supply-Programmierung genannt) und die Hochspannungsprogrammierung sind:
In meinem Fall, weil ich in den Konfigurationsbits das LVP- Bit gesetzt habe. Laut Datenblatt:
LVP: Bit zur Aktivierung der Niederspannungsprogrammierung
1 = RB3/PGM-Pin hat PGM-Funktion, Niederspannungsprogrammierung aktiviert
0 = RB3-Pin ist Digital-I/O, HV auf MCLR muss zum Programmieren verwendet werden
Und so wechselt das Gerät in den LVP-Modus gemäß PICmirco Device Programming Seite 5:
Wenn PGC- und PGD-Pins gleichzeitig auf logisch niedrig gehalten werden, während VDD sowohl an PGM als auch an MCLR angelegt wird, tritt der Mikrocontroller in den Programmiermodus ein.
Also habe ich unbeabsichtigt LVP eingestellt und PGC, PGD und PGM verschoben, bevor ich weiß, was LVP ist. Da LVP eingeschaltet ist und PGC, PGC, PGM alle Floating sind, ging das Gerät, nachdem ich einen Reset implementiert hatte, der das Reset-Problem löste, aber auch den MCLR-Pin auf VDD brachte, in den Niederspannungs-Programmiermodus, anstatt den Code auszuführen.
verwandte frage:
PIC-Schaltung bleibt nicht eingeschaltet
Scheinbar instabile PIC18F2550-Grundschaltung
Ist es wirklich eine schlechte Idee, einen MCU-Eingangspin schwebend zu lassen?
alexan_e
longtengaa
Andi aka
longtengaa
Andi aka
longtengaa