Mündəricat:

PIC MCU və Python Serial Rabitəsi: 5 addım
PIC MCU və Python Serial Rabitəsi: 5 addım

Video: PIC MCU və Python Serial Rabitəsi: 5 addım

Video: PIC MCU və Python Serial Rabitəsi: 5 addım
Video: SKR Pro v1.x - установка Klipper 2024, Noyabr
Anonim
PIC MCU və Python Serial Rabitə
PIC MCU və Python Serial Rabitə
PIC MCU və Python Serial Rabitə
PIC MCU və Python Serial Rabitə

Salam uşaqlar! Bu layihədə PIC MCU və Python serial ünsiyyətləri ilə bağlı təcrübələrimi izah etməyə çalışacağam. İnternetdə, çox faydalı olan virtual terminal üzərindən PIC MCU ilə necə əlaqə quracağınıza dair bir çox dərslər və videolar var. Ancaq əsas layihəmdə tələblərdən biri, yaxşı bir dərs tapa bilmədiyim PIC MCU və Python arasında serial rabitə qurmaqdır. Beləliklə, başlayaq:)

Addım 1: Nə lazımdır?

Bizə Nə Lazımdır?
Bizə Nə Lazımdır?
Bizə Nə Lazımdır?
Bizə Nə Lazımdır?

Beləliklə, əvvəlcə nəyə ehtiyacımız olduğunu görək. Avadanlıq baxımından:

  • Şübhəsiz ki, mənim vəziyyətimdə PIC16f877a olan PIC MCU (Bu lövhəyə ehtiyacınız yoxdur. Bu, bəzi çirkli əlaqələri asanlaşdırmaq üçündür)
  • TX və RX pinlərindən istifadə edərək USB portu vasitəsilə PIC MCU ilə əlaqə qurmaq üçün USB -dən TTL -ə çevirici.
  • Mənim vəziyyətimdə K150 proqramçısı olan MCU proqramçısı, ancaq PicKit 2, 3 və ya başqa bir şeydən istifadə edə bilərsiniz.
  • Və nəhayət kompüter:)

Proqram təminatı baxımından:

  • Mənim vəziyyətim Pycharm olan python kodu yazmaq üçün bir IDE, ancaq adi Python IDE -dən də istifadə edə bilərsiniz.
  • Mənim vəziyyətimdə MPLAB X IDE olan MCS -ni CCS C tərtibçisi ilə proqramlaşdırmaq üçün bir mühit.

Addım 2: Avadanlıq Bağlantıları

Avadanlıq Əlaqələri
Avadanlıq Əlaqələri

Şəkildə PIC MCU və USB TTL çeviricisi arasında olan əlavə edilmiş bağlantılar aşağıda verilmişdir:

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

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

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

USB TTL çeviricisinin VCC pinini bağlamanıza ehtiyac yoxdur (Ancaq istəsəniz edə bilərsiniz). Bu 3 əlaqə kifayət qədərdir.

Addım 3: Python Proqramı

Python tərəfi üçün, bizim vəziyyətimizdə ötürücü olacaq bir proqram yazmağa başlayaq, çünki bu sətri MCU -ya göndərəcək.

import serial #import serial librarydata = '24' #data göndərəcəyimiz data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, zaman aşımı = 1) #port.reite yazın (a.encode ()) #məlumatları göndərin

Gələcəkdən istifadə etmək üçün ilk növbədə serial kitabxana idxal olunur. MCU kodunda qəbul etdiyimizi təsdiqləmək üçün bir nümunə simli məlumat göndərmək istəyirik. Burada bir şeyi qeyd etmək istəyirəm. Bu səbəbdən sətirə '\ 0' əlavə etdik. Bunun səbəbi, MCU tərəfində sətri tamamilə oxumaq mümkün deyil. Xarakterə görə oxunur. Beləliklə, oxumağı dayandırmaq üçün sətrin sonunu bilmək istəyirik. Beləliklə, sətrin sonunu göstərən sətirə '\ 0' əlavə edirik. Sonra MCU -ya qoşulmuş porta qoşuluruq. 'Cihaz Meneceri' ndə axtarış edərək bu limanı təyin edə bilərsiniz. Beləliklə, eyni limanda olduğunuza diqqət yetirin. Axı, məlumatları MCU -ya göndəririk. Alıcıya göndərə bilmək üçün ".encode ()" simli məlumatlara əlavə edilməlidir.

Addım 4: Mikrokontrolör Proqramı

Beləliklə, MCU kodumuzu görək. Əvvəlcə sizə lazım olmayan "config.h" faylını göstərmək istəyirəm, amma bunu sadəlik üçün etdim. Burada MCU'nun tezliyini dəyişdirin.

#ifndef CONFIG_H#CONFIG_H təyin edin

#daxil edin

#cihaz ADC = 16

#FUSES NOWDT // Watch Dog Timer yoxdur

#FUSES NOBROWNOUT // Brownout reset yoxdur #FUSES NOLVP // I/O üçün B3 (PIC16) və ya B5 (PIC18) aşağı gərginlikli prgming yoxdur.

#istifadə gecikməsi (kristal = 6000000)

İndi əsas kodu görək:

#daxil edin

#daxil edin

#rs232 istifadə edin (baud = 9600, xmit = pin_C6, rcv = pin_C7, parite = N, stop = 1)

#LED_RED PIN_D0 təyin edin

char inp; sim cmp _ = "24"; char tamponu [3];

#int_rda

boş serial_communication_interrupt () {disable_interrupts (int_rda); işarəsiz int i = 0; inp = getc (); putc (giriş); while (inp! = '\ 0') {bufer = inp; inp = getc (); putc (giriş); i ++; }}

void main (void) {

set_tris_d (0x00); çıxış_d (0xFF); enable_interrupts (QLOBAL); while (1) {enable_interrupts (int_rda); əgər (strcmp (tampon, cmp_) == 0) output_low (LED_RED); başqa çıxış_yüksək (LED_RED); }}

Başlanğıcda, simli əməliyyatlar üçün faydalı olacağımız simli kitabxana daxildir ki, bu da bizim vəziyyətimizdə simli müqayisə əməliyyatıdır (strcmp). Beləliklə, bu koddakı məqsədimiz, ötürülən dəyər "cmp_" "24" ə bərabər olan verdiyimiz dəyərlə eyni olarsa, D0 pininə bağlı olan led'i açmaqdır.

Hər şeydən əvvəl, məlumat ötürüldükdə kəsilməyə səbəb olacaq "rda" kəsilməsini təmin edirik.

İkincisi, "serial_communication_interrupt" adlanan ISR (fasilə xidməti rutini) daxilinə baxaq. Daxilində alınan dəyəri oxumaq və daha da kəsilməyə səbəb olmaq üçün əvvəlcə kəsmə bayrağını deaktiv edirik. Bundan sonra '\ 0' çatana qədər simvol xarakterini oxuyuruq. String daxilində oxuyarkən alınan simli əldə etmək üçün hər bir tamponu buferə yazırıq.

Sonda yenə içəri giririk. Burada simli düzgün əldə edib -etmədiyimizi görmək üçün string və cmp_ string alınan tampon simimizi müqayisə edirik. Əgər onlar bərabərdirsə, onda led'i yandırıram, əks halda söndürürəm.

*Lövhəm D port pin dəyərlərini dəyişdirdiyi üçün kodu tərsinə çevirdim. Kodunuzda bunu dəyişdirin:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); başqa output_low (LED_RED);

Nəhayət, onu tərtib edin və MCU -ya yükləyin və sonra Python -da kod işləyin. Ledin açıldığını görməlisiniz.

Addım 5: Nəticə

Bir işi uğurla başa vurduq. Ümid edirəm sizin üçün faydalı olacaq. Hər hansı bir sualınız varsa, xahiş edirik soruşmaqdan çəkinməyin:) Növbəti layihəyə qədər.

Tövsiyə: