Სარჩევი:

PIC MCU და პითონის სერიული კომუნიკაცია: 5 ნაბიჯი
PIC MCU და პითონის სერიული კომუნიკაცია: 5 ნაბიჯი

ვიდეო: PIC MCU და პითონის სერიული კომუნიკაცია: 5 ნაბიჯი

ვიდეო: PIC MCU და პითონის სერიული კომუნიკაცია: 5 ნაბიჯი
ვიდეო: BTT Manta M8P v2 - CM4 with eMMC 2024, ივლისი
Anonim
PIC MCU და პითონის სერიული კომუნიკაცია
PIC MCU და პითონის სერიული კომუნიკაცია
PIC MCU და პითონის სერიული კომუნიკაცია
PIC MCU და პითონის სერიული კომუნიკაცია

Გამარჯობათ ბიჭებო! ამ პროექტში შევეცდები ავხსნა ჩემი ექსპერიმენტები PIC MCU და პითონის სერიული კომუნიკაციის შესახებ. ინტერნეტით, არსებობს მრავალი გაკვეთილი და ვიდეო იმის შესახებ, თუ როგორ უნდა დაუკავშირდეთ PIC MCU– ს ვირტუალურ ტერმინალზე, რაც ძალიან სასარგებლოა. თუმცა, ჩემს მთავარ პროექტში ერთ -ერთი მოთხოვნაა სერიული კომუნიკაციის დამყარება PIC MCU- სა და პითონს შორის, რომელიც მე ვერ ვიპოვე კარგი გაკვეთილი. მაშ, დავიწყოთ:)

ნაბიჯი 1: რა გვჭირდება?

რა გვჭირდება?
რა გვჭირდება?
რა გვჭირდება?
რა გვჭირდება?

ასე რომ, პირველ რიგში ვნახოთ რა გვჭირდება. ტექნიკის თვალსაზრისით:

  • რა თქმა უნდა, PIC MCU, რომელიც არის ჩემს შემთხვევაში PIC16f877a (თქვენ არ გჭირდებათ ეს დაფა. ეს იმისთვის, რომ გაამარტივოთ ზოგიერთი ბინძური კავშირი)
  • USB to 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

თქვენ არ გჭირდებათ USB TTL გადამყვანის VCC პინის დაკავშირება (თუმცა, თუ გინდათ, შეგიძლიათ). ეს 3 კავშირი საკმაოდ საკმარისია.

ნაბიჯი 3: პითონის პროგრამული უზრუნველყოფა

დავიწყოთ პითონის მხარისთვის პროგრამული უზრუნველყოფის წერა, რომელიც იქნება გადამცემი ჩვენს შემთხვევაში, რადგან ის სტრიქონს გაუგზავნის MCU- ს.

იმპორტი სერიული #იმპორტი სერიული ბიბლიოთეკა data = '24' #მონაცემები, რომელსაც ჩვენ გამოგიგზავნით მონაცემებს = a+'\ 0' ser = serial. სერიული ('COM17', baudrate = 9600, ვადა = 1) #დაკავშირება პორტთან 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 // Watch Dog Timer არ არის

#FUSES NOBROWNOUT // არ brownout reset #FUSES NOLVP // არ არის დაბალი ძაბვის prgming, B3 (PIC16) ან B5 (PIC18) გამოიყენება I/O

#გამოყენების დაგვიანებით (კრისტალი = 6000000)

ახლა ვნახოთ მთავარი კოდი:

#ჩართეთ

#ჩართეთ

#გამოყენება 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 (inp); მე ++; }}

ბათილი მთავარი (ბათილი) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (ბუფერი, cmp_) == 0) output_low (LED_RED); სხვაგან გამომავალი_მაღალი (LED_RED); }}

დასაწყისში ჩვენ მოიცავს სტრიქონების ბიბლიოთეკას, რომელიც ჩვენ გამოგვადგება სიმების ოპერაციებში, რაც ჩვენს შემთხვევაში არის სიმების შედარების ოპერაცია (strcmp). ამრიგად, ჩვენი მიზანი ამ კოდში არის ჩართოთ led დაკავშირებული pin D0- თან, თუ გადაცემული მნიშვნელობა იგივეა, რაც ჩვენი მოცემული მნიშვნელობა, რომელიც არის "cmp_" უდრის "24" -ს.

უპირველეს ყოვლისა, ჩვენ ვააქტიურებთ "rda" შეწყვეტას, რაც გამოიწვევს შეწყვეტას მონაცემთა გადაცემისას.

მეორეც, მოდით შევხედოთ ISR- ს (სერვისის შეწყვეტის რუტინას), რომელსაც ეწოდება "სერიული_კომუნიკაციის_შეწყვეტა". შიგნით ჩვენ პირველ რიგში გავთიშავთ შეწყვეტის დროშას, რათა წავიკითხოთ მიღებული მნიშვნელობა და გამოიწვიოს შემდგომი შეფერხება. ამის შემდეგ ჩვენ ვკითხულობთ სტრიქონს სიმბოლოების მიხედვით, სანამ არ მივაღწევთ '\ 0' - ს. როდესაც ვკითხულობთ სტრიქონში, ჩვენ ასევე ვწერთ თითოეულ სიმბოლოს ბუფერზე, რათა მივიღოთ სტრიქონი.

დასასრულს, ჩვენ კვლავ შევდივართ შიგნით. აქ ჩვენ შევადარებთ ჩვენს ბუფერულ სტრიქონს, რომელიც არის მიღებული სტრიქონი და cmp_ სტრიქონი, რათა ვნახოთ სწორად ვიღებთ თუ არა სტრიქონს. თუ ისინი თანაბარია, მაშინ მე ვრთავ led- ს, წინააღმდეგ შემთხვევაში გამორთეთ.*

*კოდში მე შევცვალე, რადგან ჩემი დაფა ინვერსიულობს D პორტის პინის მნიშვნელობებს. თქვენს კოდში შეცვალეთ:

if (strcmp (ბუფერი, cmp_) == 0) output_high (LED_RED); სხვაგან output_low (LED_RED);

დაბოლოს, შეადგინეთ იგი და ატვირთეთ თქვენს MCU– ში და შემდეგ გაუშვით კოდი პითონში. თქვენ უნდა ნახოთ LED ჩართვა.

ნაბიჯი 5: დასკვნა

ჩვენ ერთი დავალება წარმატებით დავასრულეთ. ვიმედოვნებ, რომ ის თქვენთვის სასარგებლო იქნება. თუ თქვენ გაქვთ რაიმე შეკითხვა, გთხოვთ ნუ დააყოვნებთ დასვას:) შემდეგ პროექტამდე.

გირჩევთ: