- Wymagania:
- Programowanie mikrokontrolera PIC do komunikacji UART:
- Symulacja naszego programu:
- Konfiguracja sprzętu i testowanie wyjścia:
W tym samouczku nauczymy się, jak włączyć komunikację UART z mikrokontrolerem PIC i jak przesyłać dane do iz komputera. Do tej pory omówiliśmy wszystkie podstawowe moduły, takie jak ADC, Timery, PWM, a także nauczyliśmy się, jak łączyć się z wyświetlaczami LCD i 7-segmentowymi wyświetlaczami. Teraz wyposażymy się w nowe narzędzie komunikacyjne zwane UART, które jest szeroko stosowane w większości projektów mikrokontrolerów. Sprawdź tutaj nasze kompletne samouczki dotyczące mikrokontrolerów PIC przy użyciu MPLAB i XC8.
Tutaj użyliśmy MCU PIC16F877A, który ma moduł o nazwie „Adresowalny uniwersalny synchroniczny asynchroniczny odbiornik i nadajnik”, krótko znany jako USART. USART to dwuprzewodowy system komunikacji, w którym dane są przesyłane szeregowo. USART to także komunikacja w trybie pełnego dupleksu, co oznacza, że możesz jednocześnie wysyłać i odbierać dane, które mogą być używane do komunikacji z urządzeniami peryferyjnymi, takimi jak terminale CRT i komputery osobiste.
USART można skonfigurować w następujących trybach:
- Asynchroniczny (pełny dupleks)
- Synchroniczne - Master (półdupleks)
- Synchroniczne - Slave (półdupleks)
Istnieją również dwa różne tryby, a mianowicie tryb 8-bitowy i 9-bitowy, w tym samouczku skonfigurujemy moduł USART do pracy w trybie asynchronicznym z 8-bitowym systemem komunikacji, ponieważ jest to najczęściej używany typ komunikacji. Ponieważ jest asynchroniczny, nie musi wysyłać sygnału zegarowego wraz z sygnałami danych. UART wykorzystuje dwie linie danych do wysyłania (Tx) i odbierania (Rx) danych. Uziemienie obu urządzeń powinno być również wspólne. Ten rodzaj komunikacji nie ma wspólnego zegara, dlatego wspólna masa jest bardzo ważna dla działania systemu.
Pod koniec tego samouczka będziesz w stanie ustanowić komunikację (UART) między komputerem a mikrokontrolerem PIC i przełączać diodę LED na płycie PIC z laptopa. Status diody LED zostanie wysłany do twojego laptopa z PIC MCU. Wyjście przetestujemy za pomocą Hyper Terminal w komputerze. Szczegółowe wideo jest również podane na końcu tego samouczka.
Wymagania:
Sprzęt komputerowy:
- PIC16F877A Płyta perf
- Moduł konwertera RS232 na USB
- Komputer
- PICkit 3 Programmer
Oprogramowanie:
- MPLABX
- HyperTerminal
RS232 konwerter USB jest wymagane do konwersji danych szeregowych w postaci czytelnej dla komputera. Istnieją sposoby na zaprojektowanie własnego obwodu zamiast kupowania własnego modułu, ale nie są one niezawodne, ponieważ są narażone na hałas. Ten, którego używamy, jest pokazany poniżej
Uwaga: Każdy konwerter RS232 na USB wymagałby zainstalowania specjalnego sterownika; większość z nich powinna zostać zainstalowana automatycznie po podłączeniu urządzenia. Ale jeśli to nie odpręża !!! Skorzystaj z sekcji komentarzy, a ja ci pomogę.
Programowanie mikrokontrolera PIC do komunikacji UART:
Podobnie jak wszystkie moduły (ADC, Timer, PWM) powinniśmy również zainicjować nasz moduł USART naszego MCU PIC16F877A i polecić mu pracę w 8-bitowym trybie komunikacji UART. Zdefiniujmy bity konfiguracyjne i zacznijmy od funkcji inicjalizacji UART.
Inicjalizacja modułu UART mikrokontrolera PIC:
Kołki Tx i Rx są fizycznie obecne na kołkach RC6 i RC7. Zgodnie z arkuszem danych zadeklarujmy TX jako wyjście, a RX jako wejście.
// **** Ustawienie pinów I / O dla UART **** // TRISC6 = 0; // TX Pin ustawiony jako wyjście TRISC7 = 1; // Zestaw pinów RX jako wejście // ________ Zestaw pinów I / O __________ //
Teraz należy ustawić szybkość transmisji. Szybkość transmisji to szybkość, z jaką informacje są przesyłane w kanale komunikacyjnym. Może to być jedna z wielu wartości domyślnych, ale w tym programie używamy 9600, ponieważ jest to najczęściej używana prędkość transmisji.
/ ** Zainicjuj rejestr SPBRG dla wymaganej szybkości transmisji i ustaw BRGH dla szybkiej szybkości transmisji ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // dla wysokiej szybkości transmisji // _________ Koniec ustawienia szybkości transmisji _________ //
Wartość szybkości transmisji ustawia się za pomocą rejestru SPBRG, wartość zależy od wartości Częstotliwości kryształu zewnętrznego, poniżej przedstawiono wzory do obliczania szybkości transmisji:
SPBRG = ((_XTAL_FREQ / 16) / Szybkość_Budów) - 1;
Bit BRGH musi być ustawiony na wysoki, aby umożliwić dużą szybkość transmisji. Zgodnie z arkuszem danych (strona 13) zawsze jest korzystne, aby ją włączyć, ponieważ może to wyeliminować błędy podczas komunikacji.
Jak wspomniano wcześniej, będziemy pracować w trybie asynchronicznym, dlatego bit SYNC powinien być ustawiony na zero, a bit SPEM musi być wysoki, aby włączyć piny szeregowe (TRISC6 i TRICSC5)
// **** Włącz asynchroniczny port szeregowy ******* // SYNC = 0; // Asynchroniczny SPEN = 1; // Włącz piny portu szeregowego // _____ Asynchroniczny port szeregowy włączony _______ //
W tym samouczku będziemy zarówno wysyłać, jak i odbierać dane między MCU a komputerem, dlatego musimy włączyć bity TXEN i CREN.
// ** Przygotujmy się do transmisji i odbioru ** // TXEN = 1; // włącz transmisję CREN = 1; // włącz odbiór // __ moduł UART gotowy do transmisji i odbioru __ //
Te bity TX9 i RX9 mają być wykonane do zera, dzięki czemu możemy pracować w trybie 8-bitowym. Jeśli istnieje potrzeba ustalenia wysokiej niezawodności, można wybrać tryb 9-bitowy.
// ** Wybierz tryb 8-bitowy ** // TX9 = 0; // wybrano odbiór 8-bitowy RX9 = 0; // Wybrano 8-bitowy tryb odbioru // __ Wybrano 8-bitowy tryb odbioru __ //
Na tym kończymy naszą konfigurację inicjalizacyjną. i jest gotowy do pracy.
Przesyłanie danych za pomocą UART:
Poniższa funkcja może służyć do przesyłania danych przez moduł UART:
// ** Funkcja wysyłająca jeden bajt daty do UART ** // void UART_send_char (char bt) {while (! TXIF); // wstrzymaj program do momentu zwolnienia bufora TX TXREG = bt; // Załaduj odebraną wartość do bufora nadajnika} // _____________ Koniec funkcji ________________ //
Po zainicjowaniu modułu dowolna wartość załadowana do rejestru TXREG zostanie przesłana przez UART, ale transmisja może się pokrywać. Dlatego powinniśmy zawsze sprawdzać flagę przerwania transmisji TXIF. Tylko jeśli ten bit jest niski, możemy przejść do następnego bitu do transmisji, w przeciwnym razie powinniśmy poczekać, aż ta flaga spadnie.
Jednak powyższa funkcja może być użyta tylko do wysłania tylko jednego bajtu danych, aby wysłać pełny ciąg należy użyć poniższej funkcji
// ** Funkcja do konwersji ciągu znaków na bajt ** // void UART_send_string (char * st_pt) {while (* st_pt) // jeśli istnieje znak UART_send_char (* st_pt ++); // przetworzyć to jako dane bajtowe} // ___________ Koniec funkcji ______________ //
Ta funkcja może być nieco trudna do zrozumienia, ponieważ zawiera wskaźniki, ale zaufaj mi, że wskaźniki są wspaniałe i ułatwiają programowanie, a to jest jeden dobry przykład tego samego.
Jak możesz zauważyć, ponownie wywołaliśmy UART_send_char (), ale teraz wewnątrz pętli while. Podzieliliśmy ciąg na pojedyncze znaki, przy każdym wywołaniu tej funkcji jeden znak zostanie wysłany do TXREG i zostanie przesłany.
Odbieranie danych za pomocą UART:
Do odbioru danych z modułu UART można wykorzystać następującą funkcję:
// ** Funkcja pobierająca jeden bajt daty z UART ** // char UART_get_char () {if (OERR) // sprawdź błąd {CREN = 0; // Jeśli błąd -> Resetuj CREN = 1; // Jeśli błąd -> Resetuj} while (! RCIF); // wstrzymaj program do momentu zwolnienia bufora RX return RCREG; // odbierz wartość i wyślij ją do funkcji głównej} // _____________ Koniec funkcji ________________ //
Gdy dane są odbierane przez moduł UART, pobiera je i zapisuje w rejestrze RCREG. Możemy po prostu przenieść wartość do dowolnej zmiennej i użyć jej. Ale może wystąpić błąd nakładania się lub użytkownik może wysyłać dane w sposób ciągły, a my jeszcze ich nie przesłaliśmy do zmiennej.
W takim przypadku z pomocą przychodzi bit RCIF flagi odbioru. Ten bit będzie niski, gdy dane zostaną odebrane i nie są jeszcze przetwarzane. Dlatego używamy go w pętli while, tworząc opóźnienie wstrzymania programu, dopóki nie zajmiemy się tą wartością.
Przełączanie diody LED za pomocą modułu UART mikrokontrolera PIC:
Przejdźmy teraz do ostatniej części programu, funkcji void main (void) , w której będziemy przełączać diodę LED przez komputer za pomocą komunikacji UART między PIC a komputerem.
Gdy wyślemy znak „1” (z komputera) dioda LED zaświeci się, a komunikat o stanie „CZERWONA DIODA -> WŁ.” Zostanie odesłany (z PIC MCU) do komputera.
Podobnie wyślemy znak „0” (z komputera) dioda LED zgaśnie, a komunikat o stanie „CZERWONA DIODA -> WYŁ.” Zostanie odesłany (z PIC MCU) do komputera.
while (1) // Nieskończona pętla {get_value = UART_get_char (); if (get_value == '1') // Jeśli użytkownik wyśle "1" {RB3 = 1; // Włącz diodę LED UART_send_string ("CZERWONA DIODA -> WŁ."); // Wyślij powiadomienie do komputera UART_send_char (10); // Wartość ASCII 10 jest używana do powrotu karetki (do wydrukowania w nowej linii)} if (get_value == '0') // Jeśli użytkownik wyśle "0" {RB3 = 0; // Wyłącz diodę LED UART_send_string ("RED -> OFF"); // Wyślij powiadomienie do komputera UART_send_char (10); // Wartość 10 ASCII jest używana do powrotu karetki (do wydrukowania w nowej linii)}}
Symulacja naszego programu:
Jak zwykle zasymulujmy nasz program za pomocą proteusa i sprawdźmy, czy działa zgodnie z oczekiwaniami.
Powyższy obrazek przedstawia terminal wirtualny, w którym wyświetla komunikat powitalny i status diody LED. Można zauważyć, że czerwona dioda LED jest podłączona do pinu RB3. Szczegółowy opis symulacji można znaleźć na końcu filmu.
Konfiguracja sprzętu i testowanie wyjścia:
Połączenie tego obwodu jest naprawdę proste, używamy naszej płytki PIC Perf i po prostu podłączamy trzy przewody do konwertera RS232 na USB i podłączamy moduł do naszego komputera za pomocą kabla USB, jak pokazano poniżej.
Następnie instalujemy aplikację Hyper Terminal (pobierz ją stąd) i otwieramy. Powinien pokazywać coś takiego
Teraz otwórz Menedżera urządzeń na swoim komputerze i sprawdź, do którego portu Com jest podłączony twój moduł, mój jest podłączony do portu COM 17, jak pokazano poniżej
Uwaga: nazwa portu COM dla twojego modułu może się zmienić w zależności od dostawcy, to nie jest problem.
Teraz wróć do aplikacji Hyper Terminal i przejdź do Ustawień -> Konfiguracja portu lub naciśnij Alt + C, aby uzyskać następujące wyskakujące okienko i wybierz żądany port (w moim przypadku COM17) w wyskakującym oknie i kliknij Połącz.
Po nawiązaniu połączenia włącz kartę PIC perf i powinieneś zobaczyć coś takiego poniżej
Trzymaj kursor w oknie poleceń i wprowadź 1, a następnie naciśnij enter. Dioda LED zostanie włączona, a stan zostanie wyświetlony jak pokazano poniżej.
W ten sam sposób, trzymaj kursor w oknie poleceń i wprowadź 0, a następnie naciśnij enter. Dioda LED zgaśnie, a stan zostanie wyświetlony, jak pokazano poniżej.
Poniżej podano pełny kod i szczegółowe wideo, które pokaże, jak dioda LED reaguje w czasie rzeczywistym na „1” i „0”.
To wszystko, połączyliśmy PIC UART z naszym komputerem i przesłaliśmy dane, aby przełączyć diodę LED za pomocą terminala Hyper. Mam nadzieję, że rozumiesz, jeśli nie, skorzystaj z sekcji komentarzy, aby zadać pytanie. W naszym następnym samouczku ponownie użyjemy UART, ale sprawimy, że będzie on bardziej interesujący, używając modułu Bluetooth i transmitując dane bezprzewodowo.
Sprawdź również komunikację UART między dwoma mikrokontrolerami ATmega8 i komunikację UART między ATmega8 i Arduino Uno.