GPIO auf PIC16F887 funktioniert nicht

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.

Wie prüfen Sie den Ausgang (Voltmeter)? Ist irgendwas mit den Pins verbunden? Sind alle Versorgungspins der MCU angeschlossen?
Ja, ich habe ein Voltmeter verwendet. Und nichts ist mit den Pins verbunden und Versorgungspins sind verbunden. Ich habe dies in MPLAB X simuliert, und es stellt sich heraus, dass es korrekt ausgegeben wird.
Reset-Pin ist hoch?
@Andyaka Ich habe Reset nicht implementiert. Könnte dies ein Problem sein? Aber ich habe UART zum Laufen gebracht.
lesen Sie das Datenblatt. Das Zurücksetzen muss auf logisch 1 liegen. Wenn es frei bleibt, ist das Verhalten unvorhersehbar.
Ich habe Reset hinzugefügt und alle verfügbaren VDD/VSS mit Strom versorgt. Funktioniert immer noch nicht....@Andyaka

Antworten (1)

(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:

  1. Sind alle digitalen und analogen Versorgungs- und Erdungsstifte richtig angeschlossen?
  2. Setzt sich der Mikrocontroller wiederholt selbst zurück?
  3. Funktioniert der Oszillator?
  4. Befindet sich der Mikrocontroller im Programmiermodus, anstatt Code auszuführen?

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):

  1. Anlegen der geeigneten Stromquelle und Masse (VDD und VSS) an das Gerät;
  2. Erhöhen der Spannung am MCLR-Pin auf den Programmierspannungspegel (im Allgemeinen etwa 13 V), während gleichzeitig:
  3. 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:

  1. Nur VDD auf dem MCLR-Pin ist erforderlich.
  2. LVP verwendet PGM als zusätzlichen Programmier-Pin, während andere Pins (PGC-Program Clock, PGD Program Data) im Hochspannungs-Programmiermodus weiterhin verwendet werden.

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?

Nette Antwort :) Der Kondensator am Reset-Pin dort, um EMI auszuweichen, falls die Reset-Leitung auch mit etwas anderem verbunden ist, beispielsweise einer Programmierschnittstelle. In solchen Fällen ist eine Entkopplungskappe (sowie ein Pull-Widerstand intern/extern) sehr wichtig und zwingend erforderlich, da sonst sehr wahrscheinlich EMV-Probleme auftreten. Der MCU-Hersteller sollte angeben, welcher Wert geeignet ist. 100 nF ist ein üblicher Wert für die meisten MCUs, aber einige erfordern eine steilere Reset-Flanke und daher einen kleineren Cap-Wert.