Spisu treści:

Komunikacja szeregowa PIC MCU i Python: 5 kroków
Komunikacja szeregowa PIC MCU i Python: 5 kroków

Wideo: Komunikacja szeregowa PIC MCU i Python: 5 kroków

Wideo: Komunikacja szeregowa PIC MCU i Python: 5 kroków
Wideo: Programuję prehistoryczny MCU (8051) - programowanie śmieci 5# 2024, Listopad
Anonim
PIC MCU i komunikacja szeregowa Python
PIC MCU i komunikacja szeregowa Python
PIC MCU i komunikacja szeregowa Python
PIC MCU i komunikacja szeregowa Python

Cześć chłopaki! W tym projekcie postaram się wyjaśnić moje eksperymenty dotyczące komunikacji szeregowej PIC MCU i Pythona. W Internecie dostępnych jest wiele samouczków i filmów wideo na temat komunikacji z PIC MCU przez wirtualny terminal, co jest bardzo przydatne. Jednak w moim głównym projekcie jednym z wymagań jest nawiązanie komunikacji szeregowej między PIC MCU a Pythonem, co nie znalazłem dobrego samouczka. Więc zacznijmy:)

Krok 1: Czego potrzebujemy?

Czego potrzebujemy?
Czego potrzebujemy?
Czego potrzebujemy?
Czego potrzebujemy?

Przede wszystkim zobaczmy, czego potrzebujemy. Pod względem sprzętowym:

  • Na pewno PIC MCU, który w moim przypadku jest PIC16f877a (ta płytka nie jest potrzebna. Ma to na celu uproszczenie niektórych brudnych połączeń)
  • Konwerter USB na TTL w celu komunikacji z PIC MCU przez port USB za pomocą pinów TX i RX.
  • Programator MCU czyli w moim przypadku programator K150, ale możesz użyć PicKit 2, 3 lub cokolwiek innego.
  • I wreszcie komputer:)

W zakresie oprogramowania:

  • IDE do pisania kodu w Pythonie, którym jest w moim przypadku Pycharm, ale możesz również użyć zwykłego IDE Pythona.
  • Środowisko do programowania MCU jakim jest w moim przypadku MPLAB X IDE z kompilatorem CCS C.

Krok 2: Połączenia sprzętowe

Połączenia sprzętowe
Połączenia sprzętowe

Na zdjęciu załączone połączenia sprzętowe, które znajdują się pomiędzy PIC MCU a konwerterem USB TTL jak poniżej:

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

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

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

Nie musisz podłączać pinu VCC konwertera USB TTL (jednak jeśli chcesz, możesz to zrobić). Te 3 połączenia w zupełności wystarczą.

Krok 3: Oprogramowanie Python

Zacznijmy pisać oprogramowanie dla strony Pythona, które będzie w naszym przypadku transmiterem, ponieważ wyśle string do MCU.

import serial #import serial librarydata = '24' #dane które wyślemy data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #połącz się z portem ser.write(a.encode()) #wyślij dane

Przede wszystkim importowana jest biblioteka szeregowa w celu wykorzystania jej przyszłości. Chcemy wysłać przykładowe dane ciągu w celu potwierdzenia w kodzie MCU, że je zaakceptowaliśmy. Chcę tutaj zwrócić uwagę na jedną rzecz. Dlatego dodaliśmy '\0' do łańcucha. Dzieje się tak, ponieważ po stronie MCU nie można całkowicie odczytać ciągu. Jest odczytywany znak po znaku. Więc chcemy znać koniec ciągu, aby przestać czytać. Tak więc dodajemy '\0' do ciągu, który wskazuje na koniec ciągu. Następnie łączymy się z portem, który jest podłączony do MCU. Możesz określić ten port, wyszukując w „Menedżerze urządzeń”. Uważaj więc, że jesteś na tym samym porcie. W końcu wysyłamy dane do MCU. ".encode()" należy dodać do danych ciągu, aby móc wysłać go do odbiorcy.

Krok 4: Oprogramowanie mikrokontrolera

Zobaczmy więc nasz kod dla MCU. Przede wszystkim chcę pokazać zawartość pliku "config.h", który nie jest wymagany, ale zrobiłem to dla uproszczenia. Tutaj po prostu zmień częstotliwość swojego MCU.

#ifndef CONFIG_H#define CONFIG_H

#włączać

#urządzenie ADC=16

#BEZPIECZNIKI NOWDT //Brak Zegara Watch Dog

#FUSES NOBROWNOUT //Brak resetu brownout #FUSES NOLVP //Brak prgming niskiego napięcia, B3(PIC16) lub B5(PIC18) używane dla I/O

#użyj opóźnienia(kryształ=6000000)

Zobaczmy teraz główny kod:

#włączać

#włączać

#użyj rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parzystość=N, stop=1)

#define LED_RED PIN_D0

wejście znaku; char cmp_="24"; bufor znaków [3];

#int_rda

void serial_communication_interrupt() { disable_interrupts(int_rda); unsigned int i = 0; inp = getc(); putc(inp); while(inp != '\0') { bufor = inp; inp = getc(); putc(inp); i++; } }

nieważne główne (nieważne) {

set_tris_d (0x00); wyjście_d(0xFF); enable_interrupts (GLOBALNE); while(1) { enable_interrupts(int_rda); if(strcmp(bufor, cmp_) == 0) output_low(LED_RED); w przeciwnym razie output_high(LED_RED); } }

Na początek dołączamy bibliotekę stringów, która będzie pomocna w operacjach na stringach, którymi w naszym przypadku jest operacja porównywania stringów (strcmp). Czyli naszym celem w tym kodzie jest włączenie diody podłączonej do pinu D0 jeśli przekazywana wartość jest taka sama jak nasza podana wartość czyli "cmp_" równa się "24".

Przede wszystkim włączamy przerwanie "rda", które spowoduje przerwanie podczas transmisji danych.

Po drugie, zajrzyjmy do ISR (procedury obsługi przerwań), która nazywa się "serial_communication_interrupt". Wewnątrz najpierw wyłączamy flagę przerwania, aby odczytać odebraną wartość i spowodować dalsze przerwanie. Następnie odczytujemy łańcuch znak po znaku, aż do osiągnięcia '\0'. Podczas czytania wewnątrz łańcucha zapisujemy również każdy znak do bufora w celu uzyskania odebranego łańcucha.

Na koniec ponownie wchodzimy do środka. Tutaj porównujemy nasz łańcuch bufora, który jest otrzymany łańcuch i cmp_ string, aby zobaczyć, czy otrzymaliśmy łańcuch poprawnie. Jeśli są równe to włączam led, w przeciwnym razie wyłączam.*

*W kodzie zrobiłem odwrócenie, ponieważ moja płyta odwraca wartości pinów portu D. W swoim kodzie zmień go na:

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

Na koniec skompiluj go i prześlij do swojego MCU, a następnie uruchom kod w Pythonie. Powinieneś zobaczyć zapaloną diodę.

Krok 5: Wniosek

Zakończyliśmy pomyślnie jedno zadanie. Mam nadzieję, że ci się przyda. Jeśli masz jakieś pytania, nie wahaj się zapytać:) Do następnego projektu.

Zalecana: