Obsah:

Sériová komunikace PIC MCU a Python: 5 kroků
Sériová komunikace PIC MCU a Python: 5 kroků

Video: Sériová komunikace PIC MCU a Python: 5 kroků

Video: Sériová komunikace PIC MCU a Python: 5 kroků
Video: SKR Pro v1.x - Klipper install 2024, Červenec
Anonim
Sériová komunikace PIC MCU a Python
Sériová komunikace PIC MCU a Python
Sériová komunikace PIC MCU a Python
Sériová komunikace PIC MCU a Python

Nazdar hoši! V tomto projektu se pokusím vysvětlit své experimenty na sériové komunikaci PIC MCU a Python. Přes internet existuje mnoho návodů a videí, jak komunikovat s PIC MCU přes virtuální terminál, což je velmi užitečné. V mém hlavním projektu je však jedním z požadavků vytvořit sériovou komunikaci mezi PIC MCU a Pythonem, což se mi nepodařilo najít. Takže začneme:)

Krok 1: Co potřebujeme?

Co potřebujeme?
Co potřebujeme?
Co potřebujeme?
Co potřebujeme?

Nejprve se tedy podívejme, co potřebujeme. Co se týče hardwaru:

  • Jistě, PIC MCU, což je v mém případě PIC16f877a (Tuto desku nepotřebujete. To je za účelem zjednodušení některých špinavých připojení)
  • Převodník USB na TTL za účelem komunikace s PIC MCU přes USB port pomocí pinů TX a RX.
  • Programátor MCU, což je v mém případě programátor K150, ale můžete použít PicKit 2, 3 nebo cokoli jiného.
  • A konečně počítač:)

Pokud jde o software:

  • IDE za účelem psaní kódu pythonu, což je v mém případě Pycharm, ale můžete použít i běžné IDE Pythonu.
  • Prostředí pro programování MCU, což je v mém případě MPLAB X IDE s kompilátorem CCS C.

Krok 2: Hardwarová připojení

Hardwarová připojení
Hardwarová připojení

Na obrázku jsou připojena hardwarová připojení, která jsou mezi PIC MCU a USB TTL převodníkem, jak je uvedeno níže:

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

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

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

Nepotřebujete připojit pin VCC převodníku USB TTL (Pokud však chcete, můžete to udělat). Tato 3 připojení jsou docela dost.

Krok 3: Software Python

Začněme psát software pro stranu Pythonu, který bude v našem případě vysílačem, protože odešle řetězec do MCU.

import serial #import serial librarydata = '24' #data that we will send data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #odešlete data

Nejprve je importována sériová knihovna, aby bylo možné využívat její budoucnost. Chceme poslat ukázková řetězcová data, abychom v kódu MCU potvrdili, že jsme je přijali. Zde chci poznamenat jednu věc. Proto jsme do řetězce přidali '\ 0'. Důvodem je, že na straně MCU není možné řetězec úplně přečíst. Čte se znak po znaku. Chceme tedy znát konec řetězce, abychom přestali číst. Takže přidáme '\ 0' do řetězce, který označuje konec řetězce. Poté se připojíme k portu, který je připojen k MCU. Tento port můžete určit vyhledáním ve „Správci zařízení“. Dávejte si tedy pozor, abyste byli na stejném portu. Koneckonců posíláme data do MCU. ".encode ()" by mělo být přidáno do řetězcových dat, aby bylo možné je odeslat do přijímače.

Krok 4: Software pro mikrokontrolér

Podívejme se tedy na náš kód pro MCU. Nejprve vám chci ukázat soubor „config.h“, který není nutný, ale udělal jsem to pro jednoduchost. Zde stačí změnit frekvenci vašeho MCU.

#ifndef CONFIG_H#definujte CONFIG_H

#zahrnout

#zařízení ADC = 16

#FUSES NOWDT // Časovač hlídacího psa

#FUSES NOBROWNOUT // Žádné resetování Brownout #FUSES NOLVP // Žádné nízkonapěťové prgming, B3 (PIC16) nebo B5 (PIC18) použité pro I/O

#zpoždění použití (krystal = 6000000)

Nyní se podívejme na hlavní kód:

#zahrnout

#zahrnout

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

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; char buffer [3];

#int_rda

neplatné serial_communication_interrupt () {disable_interrupts (int_rda); bez znaménka 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 (buffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Na začátek přidáme knihovnu řetězců, která nám bude nápomocna při řetězcových operacích, což je v našem případě operace porovnání řetězců (strcmp). Naším cílem v tomto kódu je tedy rozsvítit LED připojenou k pinu D0, pokud je přenášená hodnota stejná jako naše daná hodnota, která je "cmp_" se rovná "24".

Nejprve povolíme přerušení „rda“, které způsobí přerušení při přenosu dat.

Za druhé, podívejme se dovnitř ISR (rutina služby přerušení), která se nazývá „serial_communication_interrupt“. Uvnitř nejprve deaktivujeme příznak přerušení, abychom přečetli přijatou hodnotu a způsobili další přerušení. Poté čteme řetězec po znacích, dokud nedosáhneme '\ 0'. Při čtení uvnitř řetězce také zapisujeme každý znak do vyrovnávací paměti, abychom získali přijatý řetězec.

Nakonec jsme zase přišli dovnitř. Zde porovnáme náš řetězec vyrovnávací paměti, který je přijat řetězec, a řetězec cmp_, abychom zjistili, zda řetězec získáme správně. Pokud jsou stejné, zapnu LED, jinak vypnu.*

*V kódu jsem obrátil, protože moje deska převrací hodnoty pinů portu D. Ve svém kódu jej změňte na:

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

Nakonec jej zkompilujte a nahrajte do MCU a poté spusťte kód v Pythonu. Měli byste vidět zapnutí LED.

Krok 5: Závěr

Úspěšně jsme dokončili jeden úkol. Doufám, že to pro vás bude užitečné. Pokud máte nějaké dotazy, neváhejte se zeptat:) Do dalšího projektu.

Doporučuje: