Tartalomjegyzék:

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

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

Videó: PIC MCU és Python soros kommunikáció: 5 lépés
Videó: Microchip PIC mikrovezérlők - 3. rész 2024, November
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: