Satura rādītājs:

PIC MCU un Python seriālā komunikācija: 5 soļi
PIC MCU un Python seriālā komunikācija: 5 soļi

Video: PIC MCU un Python seriālā komunikācija: 5 soļi

Video: PIC MCU un Python seriālā komunikācija: 5 soļi
Video: Управление 16 серводвигателями с использованием модуля PCA9685 и Arduino V2 2024, Jūlijs
Anonim
PIC MCU un Python seriālā komunikācija
PIC MCU un Python seriālā komunikācija
PIC MCU un Python seriālā komunikācija
PIC MCU un Python seriālā komunikācija

Sveiki puiši! Šajā projektā es mēģināšu izskaidrot savus eksperimentus ar PIC MCU un Python sērijas sakariem. Internetā ir daudz noderīgu pamācību un video par to, kā sazināties ar PIC MCU, izmantojot virtuālo termināli. Tomēr manā galvenajā projektā viena no prasībām ir izveidot seriālu komunikāciju starp PIC MCU un Python, kuru nevarēju atrast labu pamācību. Tātad, sāksim:)

1. darbība. Kas mums vajadzīgs?

Kas mums vajadzīgs?
Kas mums vajadzīgs?
Kas mums vajadzīgs?
Kas mums vajadzīgs?

Tātad, vispirms redzēsim, kas mums vajadzīgs. Aparatūras ziņā:

  • Protams, PIC MCU, kas manā gadījumā ir PIC16f877a (šī plāksne jums nav nepieciešama. Tas ir, lai vienkāršotu dažus netīrus savienojumus)
  • USB uz TTL pārveidotājs, lai sazinātos ar PIC MCU, izmantojot USB portu, izmantojot TX un RX tapas.
  • MCU programmētājs, kas manā gadījumā ir K150 programmētājs, bet jūs varat izmantot PicKit 2, 3 vai jebko citu.
  • Un beidzot dators:)

Runājot par programmatūru:

  • IDE, lai rakstītu python kodu, kas manā gadījumā ir Pycharm, bet jūs varat izmantot arī parasto Python IDE.
  • Vide MCU programmēšanai, kas manā gadījumā ir MPLAB X IDE ar CCS C kompilatoru.

2. darbība. Aparatūras savienojumi

Aparatūras savienojumi
Aparatūras savienojumi

Attēlā ir pievienoti aparatūras savienojumi, kas ir starp PIC MCU un USB TTL pārveidotāju, kā norādīts zemāk:

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

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

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

Jums nav jāpievieno USB TTL pārveidotāja VCC tapa (tomēr, ja vēlaties, varat to darīt). Ar šiem 3 savienojumiem pilnīgi pietiek.

3. darbība: Python programmatūra

Sāksim rakstīt programmatūru Python pusei, kas mūsu gadījumā būs raidītājs, jo tā nosūtīs virkni uz MCU.

importēt serial #import serial librarydata = '24' #data, ka mēs nosūtīsim datus = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #izveidojiet savienojumu ar portu ser.write (a.kodēt ()) #nosūtīt datus

Pirmkārt, sērijveida bibliotēka tiek importēta, lai izmantotu tās nākotnes iespējas. Mēs vēlamies nosūtīt virknes datu piemēru, lai MCU kodā apstiprinātu, ka esam to pieņēmuši. Šeit es gribu atzīmēt vienu lietu. Tāpēc virknei pievienojām “\ 0”. Tas ir tāpēc, ka MCU pusē nav iespējams pilnībā izlasīt virkni. Tas tiek lasīts pēc rakstzīmes. Tātad, mēs vēlamies uzzināt virknes beigas, lai pārtrauktu lasīšanu. Tātad virknei pievienojam “\ 0”, kas norāda virknes beigas. Tad mēs izveidojam savienojumu ar portu, kas ir savienots ar MCU. Šo portu var noteikt, meklējot ierīču pārvaldniekā. Tāpēc esiet piesardzīgs, atrodoties tajā pašā ostā. Galu galā mēs nosūtām datus uz MCU. Virknes datiem jāpievieno ".encode ()", lai tos varētu nosūtīt uztvērējam.

4. solis: mikrokontrollera programmatūra

Apskatīsim mūsu MCU kodu. Vispirms es vēlos jums parādīt "config.h" failu, kas nav nepieciešams, bet es to darīju vienkāršības labad. Šeit vienkārši mainiet MCU biežumu.

#ifndef CONFIG_H#definēt CONFIG_H

#iekļaut

#ierīces ADC = 16

#FUSES NOWDT // Bez sargsuņa taimera

#DROŠINĀTĀJI NOBROWNOUT // Nav atiestatīšanas režīma

#izmantot aizkavi (kristāls = 6000000)

Tagad apskatīsim galveno kodu:

#iekļaut

#iekļaut

#izmantot rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, paritāte = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; ogļu buferšķīdums [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); neparakstīts int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buferis = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); kamēr (1) {enable_interrupts (int_rda); if (strcmp (buferis, cmp_) == 0) output_low (LED_RED); cits output_high (LED_RED); }}

Sākumā mēs iekļaujam virkņu bibliotēku, kas mums palīdzēs virkņu operācijās, kas mūsu gadījumā ir virkņu salīdzināšanas darbība (strcmp). Tātad mūsu mērķis šajā kodā ir ieslēgt LED, kas savienots ar tapu D0, ja pārraidītā vērtība ir tāda pati kā mūsu dotā vērtība, kas ir "cmp_", kas vienāda ar "24".

Pirmkārt, mēs iespējojam pārtraukumu "rda", kas izraisīs pārtraukumu, kad tiek pārsūtīti dati.

Otrkārt, ieskatīsimies ISR (interrupt service rutīnas) iekšpusē, ko sauc par "serial_communication_interrupt". Iekšpusē mēs vispirms atspējojam pārtraukuma karodziņu, lai nolasītu saņemto vērtību un izraisītu pārtraukumu tālāk. Pēc tam mēs lasām virkni pēc rakstzīmes, līdz tiek sasniegts “\ 0”. Lasot virknes iekšpusē, mēs arī rakstām katru simbolu buferī, lai iegūtu saņemto virkni.

Beigās mēs atkal nonākam iekšā. Šeit mēs salīdzinām mūsu bufera virkni, kas ir saņemta virkne, un cmp_ virkni, lai redzētu, vai mēs pareizi iegūstam virkni. Ja tie ir vienādi, es ieslēdzu LED, pretējā gadījumā izslēdzu.*

*Kodā es apgriezos, jo mana dēlis apgriež D porta pin vērtības. Kodā nomainiet to uz:

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

Visbeidzot, apkopojiet to un augšupielādējiet savā MCU un pēc tam palaidiet kodu programmā Python. Jums vajadzētu redzēt LED ieslēgšanos.

5. darbība. Secinājums

Vienu uzdevumu esam veiksmīgi pabeiguši. Es ceru, ka tas jums noderēs. Ja jums ir kādi jautājumi, lūdzu, nevilcinieties jautāt:) Līdz nākamajam projektam.

Ieteicams: