Inhaltsverzeichnis:

PIC-MCU und serielle Python-Kommunikation - Gunook
PIC-MCU und serielle Python-Kommunikation - Gunook

Video: PIC-MCU und serielle Python-Kommunikation - Gunook

Video: PIC-MCU und serielle Python-Kommunikation - Gunook
Video: Python Serial Port Commuincation 2024, November
Anonim
PIC-MCU und serielle Python-Kommunikation
PIC-MCU und serielle Python-Kommunikation
PIC-MCU und serielle Python-Kommunikation
PIC-MCU und serielle Python-Kommunikation

Hallo Leute! In diesem Projekt werde ich versuchen, meine Experimente zur PIC-MCU und zur seriellen Python-Kommunikation zu erklären. Über das Internet gibt es viele Tutorials und Videos zur Kommunikation mit der PIC-MCU über ein virtuelles Terminal, was sehr nützlich ist. In meinem Hauptprojekt besteht jedoch eine der Anforderungen darin, eine serielle Kommunikation zwischen der PIC-MCU und Python herzustellen, was ich kein gutes Tutorial finden konnte. Also lasst uns anfangen:)

Schritt 1: Was brauchen wir?

Was brauchen wir?
Was brauchen wir?
Was brauchen wir?
Was brauchen wir?

Sehen wir uns also zunächst einmal an, was wir brauchen. Was die Hardware angeht:

  • Sicherlich PIC-MCU, die in meinem Fall PIC16f877a ist (Sie benötigen diese Platine nicht. Dies dient dazu, einige schmutzige Verbindungen zu vereinfachen)
  • USB-zu-TTL-Konverter zur Kommunikation mit der PIC-MCU über den USB-Port unter Verwendung von TX- und RX-Pins.
  • MCU-Programmierer, in meinem Fall K150-Programmierer, aber Sie können PicKit 2, 3 oder etwas anderes verwenden.
  • Und endlich ein Computer:)

Was die Software angeht:

  • Eine IDE, um Python-Code zu schreiben, der in meinem Fall Pycharm ist, aber Sie können auch normale Python-IDE verwenden.
  • Eine Umgebung zum Programmieren der MCU, die in meinem Fall MPLAB X IDE mit CCS C Compiler ist.

Schritt 2: Hardwareverbindungen

Hardware-Anschlüsse
Hardware-Anschlüsse

Im Bild beigefügte Hardware-Verbindungen sind zwischen PIC MCU und USB-TTL-Konverter wie folgt angegeben:

RC7 (RX) ------------- TXD

RC6 (TX) ------------- RXD

GND -------------- GND

Sie müssen den VCC-Pin des USB-TTL-Konverters nicht anschließen (wenn Sie möchten, können Sie dies jedoch tun). Diese 3 Anschlüsse reichen vollkommen aus.

Schritt 3: Python-Software

Beginnen wir damit, Software für die Python-Seite zu schreiben, die in unserem Fall der Sender ist, da sie den String an die MCU sendet.

import serial #import serial librarydata = '24' #Daten, die wir senden werden data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #mit dem Port verbinden ser.write(a.encode()) #sende die Daten

Zunächst wird die serielle Bibliothek importiert, um ihre Futures zu verwenden. Wir möchten eine Beispiel-String-Daten senden, um im MCU-Code zu bestätigen, dass wir sie akzeptiert haben. Ich möchte hier eines anmerken. Aus diesem Grund haben wir dem String '\0' hinzugefügt. Dies liegt daran, dass es auf der MCU-Seite unmöglich ist, den String vollständig zu lesen. Es wird Zeichen für Zeichen gelesen. Wir möchten also das Ende der Zeichenfolge kennen, um mit dem Lesen aufzuhören. Also fügen wir dem String '\0' hinzu, der das Ende des Strings anzeigt. Dann verbinden wir uns mit dem Port, der mit der MCU verbunden ist. Sie können diesen Port ermitteln, indem Sie im 'Geräte-Manager' suchen. Achten Sie also darauf, dass Sie sich auf demselben Port befinden. Schließlich senden wir die Daten an die MCU. ".encode()" sollte den Stringdaten hinzugefügt werden, um sie an den Empfänger senden zu können.

Schritt 4: Mikrocontroller-Software

Sehen wir uns also unseren Code für MCU an. Zuerst möchte ich Ihnen die "config.h"-Datei zeigen, die nicht benötigt wird, aber ich habe es der Einfachheit halber getan. Ändern Sie hier einfach die Frequenz Ihrer MCU.

#ifndef CONFIG_H#define CONFIG_H

#enthalten

#device ADC=16

#FUSES NOWDT //Kein Watchdog-Timer

#FUSES NOBROWNOUT //Kein Brownout-Reset #FUSES NOLVP //Keine Niederspannungs-Prgming, B3 (PIC16) oder B5 (PIC18) für E/A verwendet

#Verzögerung verwenden (Kristall=6000000)

Sehen wir uns nun den Hauptcode an:

#enthalten

#enthalten

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

#define LED_RED PIN_D0

Zeicheneingang; Zeichen cmp_="24"; Zeichenpuffer [3];

#int_rda

Void serial_communication_interrupt () {disable_interrupts (int_rda); unsigned int i = 0; inp = getc(); putc(inp); while(inp != '\0') { Puffer = inp; inp = getc(); putc(inp); i++; } }

Leere Haupt (Leere) {

set_tris_d(0x00); Ausgabe_d(0xFF); enable_interrupts(GLOBAL); while(1) { enable_interrupts(int_rda); if(strcmp(buffer, cmp_) == 0) output_low(LED_RED); sonst output_high (LED_RED); } }

Zu Beginn fügen wir eine String-Bibliothek hinzu, die uns bei String-Operationen behilflich sein wird, die in unserem Fall String-Vergleichsoperationen (strcmp) sind. Unser Zweck in diesem Code besteht also darin, die mit dem Pin D0 verbundene LED einzuschalten, wenn der übertragene Wert mit unserem angegebenen Wert übereinstimmt, der "cmp_" gleich "24" ist.

Zuerst aktivieren wir den Interrupt "rda", der einen Interrupt verursacht, wenn Daten übertragen werden.

Sehen wir uns zweitens das Innere von ISR (Interrupt Service Routine) an, das als "serial_communication_interrupt" bezeichnet wird. Im Inneren deaktivieren wir zunächst das Interrupt-Flag, um den empfangenen Wert zu lesen und einen weiteren Interrupt zu verursachen. Danach lesen wir die Zeichenkette Zeichen für Zeichen, bis wir '\0' erreichen. Beim Lesen innerhalb des Strings schreiben wir auch jedes Zeichen in den Puffer, um den empfangenen String zu erhalten.

Am Ende kommen wir noch einmal hinein während. Hier vergleichen wir unseren Pufferstring, der empfangen wird, und cmp_string, um zu sehen, ob wir den String richtig erhalten. Wenn sie gleich sind, schalte ich die LED ein, ansonsten schalte ich aus.*

* Im Code habe ich umgekehrt, weil mein Board die D-Port-Pin-Werte invertiert. Ändern Sie es in Ihrem Code in:

if(strcmp(buffer, cmp_) == 0) output_high(LED_RED);else output_low(LED_RED);

Kompilieren Sie es schließlich und laden Sie es auf Ihre MCU hoch und führen Sie dann den Code in Python aus. Sie sollten sehen, dass die LED eingeschaltet ist.

Schritt 5: Fazit

Wir haben eine Aufgabe erfolgreich abgeschlossen. Ich hoffe, dass es für Sie nützlich sein wird. Wenn Sie Fragen haben, zögern Sie bitte nicht zu fragen:) Bis zum nächsten Projekt.

Empfohlen: