فهرست مطالب:

MICU PIC و ارتباط سریال پایتون: 5 مرحله
MICU PIC و ارتباط سریال پایتون: 5 مرحله

تصویری: MICU PIC و ارتباط سریال پایتون: 5 مرحله

تصویری: MICU PIC و ارتباط سریال پایتون: 5 مرحله
تصویری: BTT Manta M8P v2 - CM4 with eMMC 2024, جولای
Anonim
MICU PIC و ارتباط سریال پایتون
MICU PIC و ارتباط سریال پایتون
MICU PIC و ارتباط سریال پایتون
MICU PIC و ارتباط سریال پایتون

سلام بچه ها! در این پروژه سعی می کنم آزمایشات خود را در مورد PIC MCU و ارتباط سریال پایتون توضیح دهم. در اینترنت ، آموزشها و فیلمهای زیادی در مورد نحوه ارتباط با PIC MCU از طریق ترمینال مجازی وجود دارد که بسیار مفید است. با این حال ، در پروژه اصلی من یکی از الزامات برقراری ارتباط سریالی بین PIC MCU و Python است که نتوانستم آموزش خوبی پیدا کنم. بنابراین ، بیایید شروع کنیم:)

مرحله 1: به چه چیزی نیاز داریم؟

به چه چیزی نیاز داریم؟
به چه چیزی نیاز داریم؟
به چه چیزی نیاز داریم؟
به چه چیزی نیاز داریم؟

بنابراین ، ابتدا باید ببینیم به چه چیزی نیاز داریم. از نظر سخت افزاری:

  • مطمئنا ، PIC MCU که در مورد من PIC16f877a است (شما به آن برد نیازی ندارید. این به منظور ساده سازی برخی از اتصالات کثیف است)
  • مبدل USB به TTL به منظور ارتباط با PIC MCU از طریق پورت USB با استفاده از پین های TX و RX.
  • برنامه نویس MCU که در مورد من برنامه نویس K150 است ، اما می توانید از PicKit 2 ، 3 یا هر چیز دیگری استفاده کنید.
  • و بالاخره کامپیوتر:)

از نظر نرم افزاری:

  • یک IDE برای نوشتن کد پایتون که در مورد من Pycharm است ، اما می توانید از پایتون 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: نرم افزار پایتون

بیایید شروع به نوشتن نرم افزاری برای طرف پایتون کنیم که در مورد ما فرستنده خواهد بود ، زیرا رشته را به MCU ارسال می کند.

واردات سریال #واردات کتابخانه سریال datadata = '24' #داده که ما داده ها = a+'\ 0' ser = serial را ارسال خواهیم کرد. سریال ('COM17'، baudrate = 9600، timeout = 1) #اتصال به سرور port.write (a.encode ()) #ارسال داده ها

اول از همه کتابخانه سریال به منظور استفاده از آینده آن وارد می شود. ما می خواهیم یک نمونه داده رشته ارسال کنیم تا در کد MCU تایید کنیم که آن را پذیرفته ایم. در اینجا می خواهم به یک نکته توجه کنم. به همین دلیل است که / '0' را به رشته اضافه کردیم. این به این دلیل است که در سمت MCU خواندن کامل رشته امکان پذیر نیست. شخصیت به شخصیت خوانده می شود. بنابراین ، ما می خواهیم پایان رشته را بدانیم تا خواندن را متوقف کنیم. بنابراین ، '\ 0' را به رشته اضافه می کنیم که پایان رشته را نشان می دهد. سپس به پورت متصل به MCU متصل می شویم. با جستجو در "Device Manager" می توانید آن پورت را تعیین کنید. بنابراین ، مراقب باشید که در یک بندر هستید. پس از همه ، ما داده ها را به MCU ارسال می کنیم. ".encode ()" باید به داده های رشته اضافه شود تا بتواند آن را به گیرنده ارسال کند.

مرحله 4: نرم افزار میکروکنترلر

بنابراین ، اجازه دهید کد خود را برای MCU ببینیم. اول از همه من می خواهم فایل "config.h" را در داخل شما نشان دهم که لازم نیست ، اما این کار را برای سادگی انجام دادم. در اینجا فقط فرکانس MCU خود را تغییر دهید.

#ifndef CONFIG_H#CONFIG_H را تعریف کنید

#عبارتند از

#دستگاه ADC = 16

#FUSES NOWDT // بدون تایمر سگ دیده بان

#FUSES NOBROWNOUT // بدون brownout reset #FUSES NOLVP // بدون prgming ولتاژ پایین ، B3 (PIC16) یا B5 (PIC18) که برای ورودی/خروجی استفاده می شود

#تاخیر استفاده (کریستال = 6000000)

حالا اجازه دهید کد اصلی را ببینیم:

#عبارتند از

#عبارتند از

#use rs232 (baud = 9600، xmit = pin_C6، rcv = pin_C7 ، برابری = N ، توقف = 1)

#تعریف LED_RED PIN_D0

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

#در_ردا

void serial_communication_interrupt () {disable_interrupts (int_rda)؛ بدون امضا int i = 0؛ inp = getc ()؛ putc (inp) ؛ while (inp! = '\ 0') {buffer = inp؛ inp = getc ()؛ putc (ورودی) ؛ من ++ ؛ }}

خالی اصلی (خالی) {

set_tris_d (0x00) ؛ خروجی_د (0xFF) ؛ enable_interrupts (GLOBAL) ؛ while (1) {enable_interrupts (int_rda)؛ if (strcmp (بافر ، cmp_) == 0) output_low (LED_RED) ؛ else output_high (LED_RED) ؛ }}

در ابتدا ما کتابخانه رشته را وارد می کنیم که در عملیات رشته که در مورد ما عملیات مقایسه رشته (strcmp) است ، مفید خواهد بود. بنابراین ، هدف ما در این کد این است که led متصل به پین D0 را در صورتی که مقدار ارسال شده همان مقدار داده شده ما باشد که "cmp_" برابر با "24" است ، روشن کنیم.

اول از همه ما وقفه "rda" را فعال می کنیم که هنگام انتقال داده ها باعث وقفه می شود.

ثانیاً ، اجازه دهید ISR (روال وقفه سرویس) را که "serial_communication_interrupt" نامیده می شود ، بررسی کنیم. در داخل ما ابتدا پرچم وقفه را غیر فعال می کنیم تا مقدار دریافت شده را بخوانیم و باعث وقفه بیشتر شویم. پس از آن ما رشته را به صورت نویسه می خوانیم تا به '\ 0' برسیم. هنگام خواندن داخل رشته ، ما همچنین هر char را به بافر می نویسیم تا رشته دریافت شود.

در پایان ، ما دوباره وارد می شویم در حالی که. در اینجا ما رشته بافر خود را که رشته دریافت شده است و رشته cmp_ را مقایسه می کنیم تا ببینیم آیا رشته را به درستی دریافت کرده ایم یا خیر. اگر آنها مساوی هستند ، من LED را روشن می کنم ، در غیر این صورت خاموش می کنم.*

*در کد من معکوس کردم زیرا برد من مقادیر پین پورت D را معکوس می کند. در کد خود آن را تغییر دهید:

if (strcmp (بافر ، cmp_) == 0) خروجی_بالا (LED_RED) ؛ در غیر این صورت output_low (LED_RED) ؛

در نهایت ، آن را کامپایل کرده و در MCU خود بارگذاری کنید و سپس کد را در پایتون اجرا کنید. باید ببینید چراغ روشن است.

مرحله 5: نتیجه گیری

ما یک کار را با موفقیت به پایان رساندیم. امیدوارم برای شما مفید واقع شود. اگر س questionالی دارید ، لطفاً از پرسیدن دریغ نکنید:) تا پروژه بعدی.

توصیه شده: