Съдържание:

PIC MCU и серийна комуникация на Python: 5 стъпки
PIC MCU и серийна комуникация на Python: 5 стъпки

Видео: PIC MCU и серийна комуникация на Python: 5 стъпки

Видео: PIC MCU и серийна комуникация на Python: 5 стъпки
Видео: Serial Port Monitor Code Example - Python with Tkinter 2024, Ноември
Anonim
PIC MCU и Python серийна комуникация
PIC MCU и Python серийна комуникация
PIC MCU и серийна комуникация на Python
PIC MCU и серийна комуникация на Python

Здравейте момчета! В този проект ще се опитам да обясня експериментите си с PIC MCU и серийната комуникация на Python. В интернет има много уроци и видеоклипове за това как да комуникирате с PIC MCU през виртуален терминал, което е много полезно. Въпреки това, в основния ми проект едно от изискванията е да се установи серийна комуникация между PIC MCU и Python, което не можах да намеря добър урок. И така, нека започнем:)

Стъпка 1: Какво ни трябва?

Какво ни трябва?
Какво ни трябва?
Какво ни трябва?
Какво ни трябва?

И така, първо да видим какво ни трябва. По отношение на хардуера:

  • Разбира се, PIC MCU, което е в моя случай PIC16f877a (Не ви е необходима тази платка. Това е за да се опростят някои мръсни връзки)
  • USB към TTL конвертор за комуникация с PIC MCU през USB порт чрез използване на TX и RX щифтове.
  • MCU програмист, който в моя случай е K150 програмист, но можете да използвате PicKit 2, 3 или нещо друго.
  • И накрая компютър:)

По отношение на софтуера:

  • IDE за писане на python код, който в моя случай е Pycharm, но можете да използвате и обикновена Python IDE.
  • Среда за програмиране на MCU, която в моя случай е MPLAB X IDE с CCS C компилатор.

Стъпка 2: Хардуерни връзки

Хардуерни връзки
Хардуерни връзки

На снимката са приложени хардуерни връзки, които са между PIC MCU и USB TTL конвертор, както е показано по -долу:

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

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

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

Не е необходимо да свързвате VCC щифт на USB TTL конвертора (ако искате обаче можете да го направите). Тези 3 връзки са напълно достатъчни.

Стъпка 3: Софтуер на Python

Нека започнем да пишем софтуер за Python страна, който ще бъде предавател в нашия случай, защото той ще изпрати низ към MCU.

import serial #import serial librarydata = '24' #data, които ще изпратим data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #изпратете данните

На първо място серийната библиотека се внася, за да се използват нейните фючърси. Искаме да изпратим примерни низови данни, за да потвърдим в MCU кода, че сме ги приели. Тук искам да отбележа едно нещо. Ето защо добавихме „\ 0“към низа. Това е така, защото от страна на MCU е невъзможно да се прочете изцяло низът. Чете се символ по символ. И така, искаме да знаем края на низа, за да спрем четенето. И така, добавяме „\ 0“към низа, който показва края на низа. След това се свързваме към порта, който е свързан към MCU. Можете да определите този порт, като потърсите в „Диспечер на устройства“. Така че внимавайте да сте на едно и също пристанище. В крайна сметка изпращаме данните до MCU. ".encode ()" трябва да се добави към низовите данни, за да може да се изпрати до получателя.

Стъпка 4: Софтуер за микроконтролер

Така че, нека видим нашия код за MCU. Първо искам да ви покажа файла "config.h", който не е задължителен, но го направих за простота. Тук просто променете честотата на вашия MCU.

#ifndef CONFIG_H#дефинирайте CONFIG_H

#включва

#устройство ADC = 16

#FUSES NOWDT // Няма таймер за кучета за наблюдение

#FUSES NOBROWNOUT // Без нулиране на изгаряне #FUSES NOLVP // Няма ниско напрежение, B3 (PIC16) или B5 (PIC18), използвани за I/O

#използване на забавяне (кристал = 6000000)

Сега нека видим основния код:

#включва

#включва

#използвайте rs232 (бод = 9600, xmit = pin_C6, rcv = pin_C7, паритет = N, стоп = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; буфер за въглища [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); без знак int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {буфер = 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 (буфер, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

В началото включваме низова библиотека, която ще бъдем полезни при низови операции, които в нашия случай са операция за сравнение на низове (strcmp). И така, нашата цел в този код е да включим светодиода, свързан към извода D0, ако предадената стойност е същата като дадената от нас стойност, която е "cmp_", равна на "24".

На първо място активираме прекъсване "rda", което ще предизвика прекъсване при предаване на данни.

На второ място, нека погледнем вътре в ISR (услуга за прекъсване на услугата), която се нарича "serial_communication_interrupt". Вътре първо деактивираме флаг за прекъсване, за да прочетем получената стойност и да предизвикаме допълнително прекъсване. След това четем низа символ по символ, докато достигнем '\ 0'. Докато четем вътре в низа, ние също записваме всеки символ в буфера, за да получим получен низ.

Накрая отново влизаме вътре. Тук сравняваме нашия буферен низ, който е получен низ и cmp_ низ, за да видим дали получаваме низа правилно. Ако са равни, включвам светодиода, в противен случай изключвам.*

*В кода направих обратно, защото моята платка инвертира стойностите на изводите на D порт. Във вашия код го променете на:

if (strcmp (буфер, cmp_) == 0) output_high (LED_RED); иначе output_low (LED_RED);

Накрая го компилирайте и качете във вашия MCU и след това стартирайте кода в Python. Трябва да видите включването на светодиода.

Стъпка 5: Заключение

Успешно завършихме една задача. Надявам се, че ще ви бъде полезно. Ако имате някакви въпроси, моля не се колебайте да попитате:) До следващия проект.

Препоръчано: