Բովանդակություն:

PIC MCU և Python սերիական հաղորդակցություն. 5 քայլ
PIC MCU և Python սերիական հաղորդակցություն. 5 քայլ

Video: PIC MCU և Python սերիական հաղորդակցություն. 5 քայլ

Video: PIC MCU և Python սերիական հաղորդակցություն. 5 քայլ
Video: BTT SKR2 -FluiddPi and Klipper Firmware Install 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 կամ որևէ այլ բան:
  • Եվ վերջապես համակարգիչ:)

Softwareրագրային ապահովման առումով.

  • IDE ՝ Python կոդ գրելու համար, որն իմ դեպքում Pycharm է, բայց կարող եք նաև օգտագործել սովորական Python 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: Python Software

Եկեք սկսենք ծրագրաշար գրել Python- ի համար, որը հաղորդիչ կլինի մեր դեպքում, քանի որ այն կուղարկի տողը MCU- ին:

ներմուծել շարք 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 erամաչափ չկա

#FUSES NOBROWNOUT // Ոչ brownout reset #FUSES NOLVP // No low voltage prgming, B3 (PIC16) or B5 (PIC18) used for I/O

#օգտագործման ուշացում (բյուրեղ = 6000000)

Այժմ տեսնենք հիմնական ծածկագիրը.

#ներառում

#ներառում

#օգտագործել rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)

#սահմանեք LED_RED PIN_D0

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

#ոչ_ռդա

void serial_communication_interrupt () {անջատել_ընդհատումներ (int_rda); անստորագիր int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

դատարկ հիմնական (դատարկ) {

set_tris_d (0x00); ելքային_դ (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (բուֆեր, cmp_) == 0) output_low (LED_RED); այլ ելք_բարձր (LED_RED); }}

Սկզբում մենք ներառում ենք լարային գրադարան, որը մենք օգտակար կլինենք լարային գործողությունների համար, որը մեր դեպքում լարերի համեմատման գործողությունն է (strcmp): Այսպիսով, այս ծածկագրում մեր նպատակն է միացնել D0 պինին միացված led- ը, եթե փոխանցվող արժեքը նույնն է, ինչ մեր տրված արժեքը, որը «cmp_» հավասար է «24» -ին:

Առաջին հերթին մենք հնարավորություն ենք տալիս ընդհատել «rda» - ն, որը կհանգեցնի տվյալների փոխանցմանը:

Երկրորդ, եկեք նայենք ISR- ի ներսում (ծառայության ընդհատման ռեժիմ), որը կոչվում է «serial_communication_interrupt»: Ներսում մենք առաջին հերթին անջատում ենք ընդհատման դրոշը `ստացված արժեքը կարդալու և ընդհատում առաջացնելու համար: Դրանից հետո մենք կարդում ենք տողը բնավորությամբ ՝ մինչև հասնելով '\ 0': Տողի ներսում կարդալիս մենք նաև յուրաքանչյուր նշան գրում ենք բուֆերին `ստացված տողը ստանալու համար:

Վերջում մենք նորից ներս ենք մտնում: Այստեղ մենք համեմատում ենք մեր բուֆերային տողը, որը ստացվել է և cmp_ տողը, որպեսզի տեսնենք, թե արդյոք մենք տողը ճիշտ ենք ստանում: Եթե դրանք հավասար են, ես միացնում եմ led- ը, այլապես անջատում եմ*:

*Կոդում ես հակադարձեցի, քանի որ իմ տախտակը հակադարձում է D պորտի քորոցային արժեքները: Ձեր ծածկագրում փոխեք այն.

if (strcmp (բուֆեր, cmp_) == 0) output_high (LED_RED); այլ կերպ output_low (LED_RED);

Վերջապես, կազմեք այն և վերբեռնեք ձեր MCU- ում, ապա գործարկեք կոդը Python- ում: Դուք պետք է տեսնեք, որ LED- ը միացված է:

Քայլ 5: Եզրակացություն

Մենք մեկ առաջադրանք հաջողությամբ ավարտեցինք: Հուսով եմ, որ դա օգտակար կլինի ձեզ համար: Եթե ունեք որևէ հարց, խնդրում ենք մի հապաղեք հարցնել:) Մինչև հաջորդ նախագիծը:

Խորհուրդ ենք տալիս: