Schaltungen
PIC-Mikrocontroller sind ein sehr nützliches und vielseitiges Werkzeug für viele elektronische Projekte. Sie sind sehr günstig und leicht zu finden. Sie sind auch sehr leistungsstark und viele können mit dem internen Oszillatorblock Geschwindigkeiten von bis zu 64 MIPS erreichen, was etwa 16-mal schneller ist als bei den meisten vergleichbaren AVR-Mikrocontrollern. PICs sind ebenfalls einfach zu programmieren, jedoch kann es manchmal schwierig sein, das Projekt einzurichten. Diese Anweisungen führen Sie durch den Prozess des Einrichtens der Software, des Erstellens eines neuen Projekts und des Programmierens einiger sehr einfacher Funktionen, um die Konfiguration zu testen und sicherzustellen, dass alles funktioniert. Sie sind so konzipiert, dass sie sehr offen sind. Nachdem das Projekt erstellt und die Grundlagen fertiggestellt wurden, wird der Leser aufgefordert, alle Funktionen und Extras zu erkunden, die in dieser Anleitung nicht behandelt werden. Sie werden auch feststellen, dass diese Anweisungen Schritt für Schritt durchlaufen werden. Wenn sich die Anweisungen jedoch dem Ende nähern, wird der Leser aufgefordert, andere Möglichkeiten zur Erfüllung der Aufgaben zu erkunden und das Projekt zu seinem eigenen zu machen.Programmierung von PIC-Mikrocontrollern
Was Sie benötigen Um ein Projekt mit einem PIC-Mikrocontroller zu erstellen, sind nur wenige Elemente erforderlich.
- PIC-Mikrocontroller
- Diese Anweisungen dienen zum Programmieren einer MCU der PIC18F-Serie, obwohl andere ähnlich sind.
- Erhalten von der Microchips-Website.
- Mit Microchip können Schüler mit gültigen .edu-E-Mail-Adressen kostenlos Beispiel-PICs erhalten!
- Der PIC, mit dem ich diese Anweisungen erstelle, ist ein PIC18F22K80
- PICkit 3 In-Circuit-Debugger
- Erhältlich bei Microchip.
- Kostet $ 45 für die breite Öffentlichkeit und # 34 mit Studentenrabatt, wenn Sie eine .edu-E-Mail-Adresse haben.
- Es gibt auch andere Programmierer, die genauso gut funktionieren. Dies ist jedoch die beste für den Anfang.
- Steckbrett und Steckbrettdrähte
- LEDs, Tasten, Potentiometer oder alles andere, was Sie an den PIC anschließen möchten
Schritt 1: Hardware erstellen

Hinweis: VDD = positive Spannung und VSS = Masse.
- Verbinden Sie den MCLR-Pin über einen 1kΩ-Widerstand mit VDD.
- Schließen Sie einen 0, 1 μF-Kondensator zwischen jedem Paar benachbarter VDD-VSS-Paare oder AVDD-AVSS-Paare an.
- Schließen Sie einen 10μF-Kondensator zwischen VCAP und Vss an.
- Verbinden Sie den MCLR-Pin mit Pin 1 des PICkit 3.
- Verbinden Sie den VDD mit Pin 2 des PICkit 3.
- Verbinden Sie VSS mit Pin 3 des PICkit 3.
- Verbinden Sie den PGD-Pin mit Pin 4 des PICkit 3.
- Verbinden Sie den PGC-Pin mit Pin 5 des PICkit 3.
- Lassen Sie Pin 6 des PICkit 3 nicht angeschlossen.
- Verbinden Sie alle analogen Eingänge mit Pins mit ANx-Funktionalität, wobei x eine Zahl ist.
- Verbinden Sie alle digitalen Ein- oder Ausgänge mit Pins mit Rxy-Funktionalität, wobei x ein Buchstabe ist, der den Port identifiziert, und y eine Zahl ist, die das Bit identifiziert.
Schritt 2: Software herunterladen



- Die neueste Version der Software finden Sie auf der Microchips-Website unter //www.microchip.com/pagehandler/en-us/family/mplabx/.
- Wählen Sie die Software für Ihr Betriebssystem aus und befolgen Sie die Standardinstallationsanweisungen.
- Starten Sie nach der Installation der Software MPLAB X.
- Wählen Sie in der Menüleiste Extras-> Optionen
- Wählen Sie im Dialogfeld "Optionen" die Registerkarte "Eingebettet" und stellen Sie sicher, dass XC8 in der Toolchain-Liste aufgeführt ist.
- Wenn es aufgelistet ist, wählen Sie OK und fahren Sie mit dem nächsten Schritt fort.
- Wenn es nicht aufgeführt ist, stellen Sie sicher, dass die Instillation abgeschlossen ist, und klicken Sie auf die Schaltfläche Nach Build-Tools suchen.
- Wenn dies immer noch nicht aufgeführt ist, suchen Sie im Microchips-Forum nach Hilfe bei Ihrem speziellen Problem.
Schritt 3: Neues Projekt erstellen




- Wählen Sie in der Menüleiste Datei-> Neues Projekt ...
- Erweitern Sie im Dialogfeld "Neue Datei" die Option "Beispiele" und wählen Sie "Eingebetteter Mikrochip" aus
- Wählen Sie im Projektfeld PIC18 C Template aus
- Wählen Sie Weiter
- Geben Sie dem Projekt einen beliebigen Namen
- Wählen Sie im Feld Projektspeicherort einen Speicherort aus, an dem das Projekt gespeichert werden soll
- Belassen Sie den Projektordner als Standardoptionen
- Aktivieren Sie das Kontrollkästchen "Als Hauptprojekt festlegen"
- Wählen Sie Fertig stellen
Schritt 4: Parameter erstellen










Konfiguration erstellen
- Klicken Sie mit der rechten Maustaste auf den Projektnamen in der Projektsymbolleiste.
- Wählen Sie im Dialogfeld Projekteigenschaften die Option Konfigurationen verwalten ...
- Wählen Sie im Dialogfeld "Konfigurationen" die Option "Neu"
- Geben Sie im Dialogfeld Neuer Konfigurationsname Standard ein und klicken Sie auf OK
- Stellen Sie im Dialogfeld "Konfigurationen" sicher, dass "Standard" ausgewählt ist, und klicken Sie auf "Aktiv setzen"
- Klicken Sie im Dialogfeld "Konfigurationen" auf "OK"
- Wählen Sie im Dialogfeld Projekteigenschaften in der Liste Kategorien die Option "Conf: [Standard]" aus
- Geben Sie im Feld Gerät den Namen des verwendeten Geräts ein. In meinem Fall PIC18F26K80
- Wählen Sie in der Liste Hardware Tools die Option PICkit3 aus
- Wählen Sie in der Compiler-Toolchain XC8 (v ...) aus, wobei ... die von Ihnen installierte Version ist.
- Wählen Sie Übernehmen
- Wählen Sie unter Conf: [Default] PICkit 3 aus
- Wählen Sie für Optionskategorien die Option Leistung
- Überprüfen Sie "Power Target Circuit von PICkit3
- Wählen Sie Übernehmen.
- Wählen Sie unter Conf: [Default] den XC8-Compiler aus
- Wählen Sie unter Optionskategorien Optimierungen aus
- Setzen Sie "Optimization Set" auf "none"
- Wählen Sie Übernehmen
- Klicken Sie auf OK, um das Dialogfeld zu schließen
Schritt 5: Konfigurationsbits festlegen





- Erweitern Sie im Projektexplorer Quelldateien und öffnen Sie configuration_bits.c
- Entfernen Sie den gesamten Text unter der Zeile #endif
- Beachten Sie, dass am unteren Bildschirmrand eine neue Registerkarte geöffnet wurde
- Stellen Sie die Bits nach Bedarf für Ihr Projekt ein. Da diese chipabhängig sind, überprüfen Sie das Datenblatt auf weitere Informationen zu den jeweiligen Funktionen. Es folgen einige allgemeine Einstellungen:
- Erweiterter Befehlssatz - Sollte bei Verwendung der Vorlage auf AUS gesetzt werden
- Oszillator - Dient zur Auswahl des Prozessors. Wenn Sie keinen externen Quarz verwenden, lassen Sie ihn als internen RC-Oszillator eingestellt. Weitere Oszillatorkonfigurationen finden Sie im Datenblatt. Hinweis: CLKOUT erleichtert das Debuggen und sollte aktiviert werden, falls verfügbar.
- PLL aktivieren - Ermöglicht die zukünftige Verwendung der PLL. Hinweis: Dadurch wird die PLL nicht aktiviert, sondern nur aktiviert. Es wird empfohlen, es zu aktivieren.
- Watchdog-Timer - Der Watchdog-Timer wird verwendet, um sicherzustellen, dass der Prozessor nicht blockiert. Es macht es jedoch viel schwieriger zu debuggen. Es wird empfohlen, es während der ersten Programmierung zu deaktivieren und erst zu aktivieren, nachdem das Projekt fast abgeschlossen ist.
- Code / Tabelle Schreib- / Leseschutz - Wird verwendet, um das Schreiben oder Lesen in bestimmte Speicherbereiche zu deaktivieren. Lassen Sie alle diese deaktiviert.
- Wenn Sie sich über eine Einstellung nicht sicher sind, können Sie diese normalerweise auf der Standardeinstellung belassen.
- Nachdem alle Konfigurationsbits gesetzt wurden, klicken Sie unten im Bedienfeld auf die Schaltfläche "Quellcode für Ausgabe generieren".
- Das Bedienfeld wechselt nun zur Registerkarte Ausgabe. Wählen Sie den gesamten Text auf dieser Registerkarte aus und kopieren Sie ihn in die Zwischenablage
- Fügen Sie es am Ende der Datei configuration_bits.c ein und speichern Sie es vorab.
- Bereinigen und erstellen Sie das Projekt erneut, indem Sie auf das Besen- und Hammersymbol klicken.
- Stellen Sie sicher, dass der Build erfolgreich war. Stellen Sie außerdem sicher, dass die Ausgabe keine Fehler enthält
Schritt 6: Konfigurieren Sie den Oszillator



Einstellungen festlegen
Bevor wir die Einstellungen programmieren können, müssen wir auswählen, mit welcher Geschwindigkeit wir laufen möchten. In diesem Beispiel verwende ich 16 MHz, da die meisten PICs mit dieser Geschwindigkeit betrieben werden können. Für meine Konfiguration verwende ich den 4-MHz-Postscaller vom HF-INTOSC und die 4x PLL mit einer Ausgangsfrequenz von 4 MHz * 4x = 16 MHz- Im Datenblatt finden Sie den Abschnitt mit der Bezeichnung Oszillatorkonfigurationen
- Das erste, was in diesem Abschnitt aufgeführt ist, sind Oszillatortypen. Wenn Sie den internen Oszillator verwenden, verwenden Sie die Einstellungen für INTIO1
- Auf den nächsten ein oder zwei Seiten finden Sie eine schematische Zeichnung des Oszillators ähnlich der gezeigten. Es ist hilfreich, das Signal in dieser Zeichnung zu verfolgen, um sicherzustellen, dass die richtige Geschwindigkeit ausgewählt wird.
- Der nächste Schritt besteht darin, diese Einstellungen auf die MCU zu programmieren. Dies erfolgt durch Einstellen von Registern. Das erste zu setzende Register ist OSCCON.
- IDLEN - wird verwendet, um die Aktion des Schlafbefehls zu steuern. Kann als Standard belassen werden.
- IRCF - Oszillatorauswahl. Da ich HF-INTOSC / 4 (4 MHz) verwende, muss ich dies auf einen Binärwert von 101 einstellen
- OSTS - Nur-Lese-Bit
- HFIOFS - Nur-Lese-Bit
- SCS - Taktauswahlbits. Da ich den internen Oszillator verwende, werde ich auf 1x setzen, wobei x 0 oder 1 sein kann
- Das nächste Register ist OSCCON2; Dieses Register ist jedoch meist schreibgeschützt und an dieser Stelle nicht wichtig
- Das letzte Oszillatorkonfigurationsregister ist OSCTUNE. Wir werden die Frequenz für dieses Projekt nicht einstellen, müssen jedoch dieses Register verwenden, um die PLL mit dem PLLEN-Bit einzuschalten.
Einstellungen anwenden
- Kehren Sie zu MPLAB zurück
- Öffnen Sie im Projektexplorer unter Quelldateien system.c
- Am Ende dieser Datei befindet sich die Funktion ConfigureOscillator. Entfernen Sie die Kommentare in dieser Funktion.
- Um die Bits eines Registertyps in Großbuchstaben zu setzen, geben Sie den Registernamen ein, gefolgt von den Kleinbuchstabenbits und dann einer Periode und dem Bitnamen.
- Um die Bits zu setzen, folgen Sie dem mit einem Gleichheitszeichen. Um die Binärzahl zu verwenden, geben Sie 0bXXXX ein, wobei XXXX die Binärzahl ist. Zuletzt beenden Sie die Zeile mit einem Semikolon.
- Setzen Sie alle oben für das OSCCON-Register festgelegten Bits. Beispiel: OSCCONbits.IRCF = 0b101;
- Machen Sie dasselbe für alle anderen benötigten Oszillatorregister. Unten finden Sie ein Beispiel für eine fertige ConfigureOscillator-Funktion.
- Wenn Sie fertig sind, prüfen Sie, ob Warnungen / Fehler vorliegen
/ ** * Konfigurieren Sie die Taktquelle und die Geschwindigkeit * / void ConfigureOscillator (void) {OSCCONbits. IRCF = 0b101; OSCCONbits. SCS = 0b00; OSCTUNEbits. PLLEN = 0b1; }}
Schritt 7: Warten Sie Milli-Sekunden-Funktion
Eine der nützlichsten Funktionen ist wait_ms. Dies ist jedoch keine Funktion in der Standardbibliothek und muss von Ihnen programmiert werden. Für diese Implementierung gibt es eine Schleife, die den Prozessor hält, bis die angegebene Zeit abgelaufen ist.PIC18F-Mikrocontroller benötigen 4 Taktzyklen, um eine Zeile Assembler-Code auszuführen. Daher werden bei einem Takt von 16 MHz Leitungen mit 4 Millionen Zeilen pro Sekunde = 4000 Zeilen pro Millisekunde ausgeführt. Da eine for-Schleife jedes Mal einen Befehl für den Vergleich und zwei für die Operation einen für den Körper der Schleife benötigt, funktioniert sie perfekt. Wir brauchen nur die for-Schleife, um 1000 Mal pro Millisekunde zu schleifen.
- Erstellen Sie in system.c eine neue Funktion am Ende der Datei vom Typ void wait_ms (uint16_t time).
- Unten ist die abgeschlossene Funktion
/ ** * Warten Sie mit dem Besetztschema auf eine bestimmte Anzahl von Millisekunden. * @param time - Wartezeit in ms. * / void wait_ms (uint16_t time) {statische lange Zeit = 0; Zeit = Zeit * 1000l; for (; timel; timel -); // keine Anfangsbedingung, während die Zeit> 0 ist, dekrementiere die Zeit für jede Schleife}
- Öffnen Sie system.h im Ordner Header Files im Projektbrowser
- Fügen Sie am Ende die Zeile void wait_ms (uint16_t) hinzu. Prototyp der Funktion.
- Ändern Sie Zeile 8 von 8000000L in 16000000L
- Erstellen und überprüfen Sie auf Fehler / Warnungen
Schritt 8: Blinken Sie eine LED

- Öffnen Sie main.c im Projekt-Viewer unter Quelldateien.
Die fertige Funktion sollte folgendermaßen aussehen:
- Fügen Sie unmittelbar über der while-Schleife den folgenden Code hinzu.
- Setzen Sie den LED-Pin als Ausgang - TRISAbits.TRISA0 = 0; // Setzen eines TRIS-Bits auf 0 Sätze als Ausgang, Setzen auf 1 Sätze als Eingang
- Fügen Sie innerhalb der while-Schleife den folgenden Code hinzu
- Stellen Sie die LED auf OFF - LATAbits.LATA0 = 0; // Die LAT-Bits steuern den Ausgang eines Pins. 0 = NIEDRIG, 1 = HOCH
- Warten Sie eine halbe Sekunde - wait_ms (500);
- Stellen Sie die LED auf ON - LATAbits.LATA0 = 1;
- Warten Sie eine halbe Sekunde - wait_ms (500);
void main (void) {/ * Konfiguriere den Oszillator für das Gerät * / ConfigureOscillator (); / * E / A und Peripheriegeräte für die Anwendung initialisieren * / InitApp (); TRISAbits.TRISA0 = 0; // setze Pin als Ausgang während (1) {LATAbits.LATA0 = 0; // Pin LOW setzen wait_ms (500); // warte 0, 5 Sekunden LATAbits.LATA0 = 1; // setze Pin HIGH wait_ms (500); // 0, 5 Sekunden warten}}
- Erstellen Sie das Programm und suchen Sie nach Fehlern oder Warnungen
- Stellen Sie sicher, dass das PICkit korrekt mit dem PIC und dem Computer verbunden ist
- Klicken Sie auf die Schaltfläche Gerät erstellen und programmieren (die Schaltfläche rechts neben der Schaltfläche Bereinigen und Erstellen).
- Wenn Sie dazu aufgefordert werden, wählen Sie PICkit 3 und klicken Sie auf OK
- Wenn die Warnung eine doppelte Überprüfung anzeigt, haben Sie den richtigen PIC in der Schaltung und klicken Sie auf OK
- Wenn eine Warnung zur Zielgeräte-ID angezeigt wird, klicken Sie auf OK, um sie zu ignorieren
Schritt 9: Lesen eines Analogwerts
Bisher kann das Programm eine LED blinken lassen. Als nächstes geben wir ihm einige Benutzereingaben. Wir werden ein Potentiometer verwenden, um ein analoges Signal zu erzeugen, das die Geschwindigkeit der LED ändert. Der ADC nimmt eine analoge Spannung auf und gibt einen digitalen Wert aus.- Öffnen Sie im Projektbrowser user.c unter Quelldateien
- Über der InitApp-Funktion erstellen Sie eine neue Funktion
void init_adc(void)
- Geben Sie den folgenden Code ein, um das ADC-Modul zu initialisieren
/ ** * Initialisieren Sie den Analog-Digital-Wandler. * / void init_adc (void) {TRISAbits. TRISA1 = 0b1; // Pin als Eingang ANCON0bits setzen. ANSEL1 = 0b1; // Pin als analoge ADCON1bits setzen. VCFG = 0b00; // setze v + Referenz auf Vdd ADCON1bits. VNCFG = 0b0; // setze v- Referenz auf GND ADCON1bits. CHSN = 0b000; // setze den negativen Eingang auf GND ADCON2bits. ADFM = 0b1; // rechts die Ausgabe ADCON2bits ausrichten. ACQT = 0b110; // 16 TAD ADCON2bits. ADCS = 0b101; // benutze Fosc / 16 für die Taktquelle ADCON0bits. ADON = 0b1; // ADC einschalten}
- Erstellen Sie als Nächstes unmittelbar nach dem Aufruf von
uint16_t adc_convert(uint8_t channel)
eine weitere Funktion.
/ ** * Führen Sie eine Analog-Digital-Wandlung durch. * @param channel Der zu verwendende ADC-Eingangskanal. * @return Der Wert der Konvertierung. * / uint16_t adc_convert (uint8_t channel) ADRESL; // gebe das Ergebnis zurück
- Fügen Sie in der InitApp-Funktion die Zeile
init_adc()
- Fügen Sie in der Datei user.h den Prototyp
uint16_t adc_convert(uint8_t);
- Ändern Sie main auf Folgendes:
void main (void) {uint16_t adc_value; // Variable zum Halten des ADC-Konvertierungsergebnisses in / * Konfiguriere den Oszillator für das Gerät * / ConfigureOscillator (); / * E / A und Peripheriegeräte für die Anwendung initialisieren * / InitApp (); TRISAbits. TRISA0 = 0; // Pin als Ausgang setzen während (1) {LATAbits. LATA0 = 0; // Pin LOW setzen adc_value = adc_convert (1); // A / D-Wandlung auf Kanal 1 durchführen (wait_ms (adc_value >> 2); // 0, 5 Sekunden warten LATAbits. LATA0 = 1; // setze Pin HIGH adc_value = adc_convert (1); // A / D-Wandlung auf Kanal 1 durchführen (wait_ms (adc_value >> 2); // 0, 5 Sekunden warten}}
- Erstellen Sie den Code und laden Sie ihn herunter. Wenn Sie den POT drehen, sollte sich die Geschwindigkeit ändern, mit der die LED blinkt
Schritt 10: Lesen Sie einen digitalen Wert
Als nächstes erhalten wir einen digitalen Eingang vom Schalter. Wenn der Schalter ausgeschaltet ist, lässt das Programm das tun, was es die ganze Zeit getan hat, und wenn der Schalter eingeschaltet ist, leuchtet die LED dauerhaft auf, bis der Schalter wieder ausgeschaltet wird.- Um einen Pin als Eingang zu setzen, schreiben Sie eine 1 in das TRIS-Registerbit des Pins -
TRISAbits.TRISA2 = 1;
- Wenn ein Pin analoge Funktionen gemeinsam nutzt, muss er möglicherweise auf digital gesetzt werden, indem das entsprechende Bit im ANCONx-Register gelöscht wird
- Verwenden Sie beim Schreiben eines Werts in einen Pin das LAT-Register. Verwenden Sie jedoch beim Lesen eines Werts von einem Pin das PORT-Register -
value = PORTAbits.RA2;
- Ändern Sie main auf Folgendes:
void main (void) {uint16_t adc_value; // Variable zum Halten des ADC-Konvertierungsergebnisses in / * Konfiguriere den Oszillator für das Gerät * / ConfigureOscillator (); / * E / A und Peripheriegeräte für die Anwendung initialisieren * / InitApp (); TRISAbits. TRISA0 = 0; // Pin als Ausgang TRISAbits setzen. TRISA2 = 1; // Pin als Eingang ANCON0bits setzen. ANSEL2 = 0; // Pin als digital setzen während (1) {if (PORTAbits. RA2) // wenn der Pin hoch ist {LATAbits. LATA0 = 1; // setze den Pin auf high} else // wenn der Pin niedrig ist {// blink die LED LATAbits. LATA0 = 0; // Pin LOW setzen adc_value = adc_convert (1); // A / D-Wandlung auf Kanal 1 durchführen (wait_ms (adc_value >> 2); // warte einige Zeit LATAbits. LATA0 = 1; // setze Pin HIGH adc_value = adc_convert (1); // A / D-Wandlung auf Kanal 1 durchführen (wait_ms (adc_value >> 2); // etwas warten}}}
Das ist es! Sie haben jetzt die Grundkenntnisse, wie Sie ein neues Projekt einrichten, digitale Pins lesen und schreiben und wie Sie von analogen Pins lesen. Mit diesen drei Funktionen können Sie 90% der Projekte mit PICs im Internet ausführen. Wenn Sie sich weiter mit PIC-Mikrocontrollern befassen, werden Sie feststellen, dass die meisten anderen Funktionen sehr ähnliche Schritte zum Konfigurieren von Peripheriegeräten sowie zum Lesen und Recht auf Register erfordern.