PIC MCU és Python soros kommunikáció: 5 lépés
PIC MCU és Python soros kommunikáció: 5 lépés
Anonim
PIC MCU és Python soros kommunikáció
PIC MCU és Python soros kommunikáció
PIC MCU és Python soros kommunikáció
PIC MCU és Python soros kommunikáció

Helló srácok! Ebben a projektben megpróbálom elmagyarázni a PIC MCU és Python soros kommunikációval kapcsolatos kísérleteimet. Az interneten számos oktatóanyag és videó található a PIC MCU -val való kommunikációról a virtuális terminálon keresztül, ami nagyon hasznos. A fő projektemben azonban az egyik követelmény a soros kommunikáció létrehozása a PIC MCU és a Python között, amelyhez nem találtam jó oktatóanyagot. Szóval kezdjük:)

1. lépés: Mire van szükségünk?

Mire van szükségünk?
Mire van szükségünk?
Mire van szükségünk?
Mire van szükségünk?

Tehát először is nézzük meg, mire van szükségünk. Hardver szempontjából:

  • Bizony, PIC MCU, ami az én esetemben a PIC16f877a (nem kell ez a kártya. Ez azért van, hogy egyszerűsítsük a piszkos kapcsolatokat)
  • USB -TTL átalakító a PIC MCU -val való kommunikációhoz USB porton keresztül TX és RX érintkezők használatával.
  • MCU programozó, ami esetemben K150 programozó, de használhatja a PicKit 2, 3 vagy bármi mást.
  • És végül egy számítógép:)

A szoftver szempontjából:

  • Egy IDE a python kód írásához, ami az én esetemben a Pycharm, de használhatja a szokásos Python IDE -t is.
  • Környezet az MCU programozásához, ami esetemben MPLAB X IDE CCS C fordítóval.

2. lépés: Hardverkapcsolatok

Hardver kapcsolatok
Hardver kapcsolatok

A képen a csatolt hardvercsatlakozások vannak megadva, amelyek a PIC MCU és az USB TTL konverter között vannak, az alábbiak szerint:

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

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

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

Nem kell csatlakoztatnia az USB TTL átalakító VCC tűjét (ha szeretné, akkor megteheti). Ez a 3 kapcsolat elég.

3. lépés: Python szoftver

Kezdjünk el szoftvert írni a Python oldalához, amely esetünkben adó lesz, mert elküldi a karakterláncot az MCU -nak.

importálja a soros #import soros könyvtárat a.encode ()) #küldje el az adatokat

Először is a soros könyvtárat importálják annak érdekében, hogy felhasználhassák jövőjét. Példaként szeretnénk elküldeni egy karakterlánc -adatot, hogy megerősítsük az MCU kódban, hogy elfogadtuk. Itt egy dolgot szeretnék megjegyezni. Ezért adtuk hozzá a karakterlánchoz a „\ 0” értéket. Ennek az az oka, hogy az MCU oldalon lehetetlen teljesen leolvasni a karakterláncot. Karakterről karakterre olvasható. Tehát szeretnénk tudni a karakterlánc végét az olvasás leállítása érdekében. Tehát a „\ 0” karaktert hozzáadjuk a karakterlánc végéhez. Ezután csatlakozzunk az MCU -hoz csatlakoztatott porthoz. Ezt a portot az "Eszközkezelőben" keresve határozhatja meg. Tehát vigyázzon, hogy ugyanazon a porton legyen. Végül is elküldjük az adatokat az MCU -nak. ".encode ()" -t kell hozzáadni a karakterlánc adataihoz, hogy el tudja küldeni azokat a vevőnek.

4. lépés: Mikrokontroller szoftver

Lássuk tehát az MCU kódját. Először is szeretném megmutatni a "config.h" fájlt, amely nem kötelező, de az egyszerűség kedvéért megtettem. Itt csak módosítsa az MCU frekvenciáját.

#ifndef CONFIG_H#define CONFIG_H

#befoglalni

#eszköz ADC = 16

#FUSES NOWDT // No Watch Dog Timer

#FUSES NOBROWNOUT // Nincs brownout reset #FUSES NOLVP // Nincs kisfeszültségű szabályozás, B3 (PIC16) vagy B5 (PIC18) az I/O -hoz

#use delay (kristály = 6000000)

Most nézzük a fő kódot:

#befoglalni

#befoglalni

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

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; szénpuffer [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); előjel nélküli int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (puffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Az elején tartalmazunk egy karakterlánc -könyvtárat, amely hasznos lesz a karakterlánc -műveletekben, amelyek esetünkben a string összehasonlítási művelet (strcmp). Tehát ebben a kódban az a célunk, hogy bekapcsoljuk a D0 érintkezőhöz csatlakoztatott ledet, ha az átvitt érték megegyezik a megadott értékünkkel, amely "cmp_" egyenlő "24" értékkel.

Először is engedélyezzük az "rda" megszakítást, amely megszakítást okoz az adatok továbbításakor.

Másodszor, nézzünk bele az ISR -be (megszakítási szolgáltatási rutin), amelyet "serial_communication_interrupt" -nak hívnak. Belül először letiltjuk a megszakítás jelzőt, hogy leolvassuk a kapott értéket és további megszakítást okozzunk. Ezt követően karakterről karakterre olvassuk a karakterláncot, amíg el nem érjük a "\ 0" értéket. A karakterlánc belsejében olvasva minden karaktert a pufferbe írunk, hogy megkapjuk a kapott karakterláncot.

A végén ismét bemegyünk. Itt összehasonlítjuk a puffer karakterláncunkat, amely fogadott karakterláncot és cmp_ karakterláncot tartalmaz annak érdekében, hogy megnézzük, helyesen kapjuk -e a karakterláncot. Ha egyenlők, akkor bekapcsolom a ledet, különben kikapcsolom.*

*A kódban fordítottam, mert az alaplapom megfordítja a D port tű értékeit. Változtassa meg a kódban:

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

Végül fordítsa le és töltse fel az MCU -ba, majd futtassa a kódot Pythonban. Látnia kell a led bekapcsolását.

5. lépés: Következtetés

Egy feladatot sikeresen befejeztünk. Remélem, hogy hasznos lesz az Ön számára. Ha bármilyen kérdése van, kérjük, ne habozzon feltenni:) A következő projektig.

Ajánlott: