Zakres laboratorium:
- zapoznanie z Modułem 328
- przygotowanie makr do obsługi przycisków i LED
- wstęp do biblioteki UART, praca z terminalem – wysyłanie
- UART – odbieranie
Zadania na ocenę 5.5:
- przygotować prezentacje o interfejsie UART/USART (jedna osoba – 15 minut)
1. Zapoznanie z Modułem 328
Podstawowe informacje o Module 328 można znaleźć na stronie MODUŁ 328. Moduł został wykonany w celu umożliwienia studenta zapoznania się z możliwościami i praktycznym wykorzystaniem interfejsów mikrokontrolera takich jak:
- UART
- I2C
Moduł został zamknięty w obudowie w celu zabezpieczenia układów wewnętrznych jak i uproszczenia w ilości podłączeń – wymagane jest podłączenie tylko jednym kablem USB do komputera.
Należy również zapoznać się z dokumentacja mikrokontrolera ATmega328P.
Zadania:
- założyć projekt (instrukcja do środowiska Eclipse):
- język programowania: C++
- mikrokontroler: ATmega328P
- częstotliwość taktowania: 16 000 000 MHz
- programator: USBasp
- dodać do projektu pliki z paczki
- skompilować projekt i wgrać do mikrokontrolera
2. Przygotowanie makr do obsługi przycisków i LED
- utworzyć plik nagłówkowy “Modul328.h” i dołączyć go do pliku “main.cpp”
- utworzyć makra w pliku nagłówkowym “Modul328.h” do obsługi diod LED
123#define INIT_GREEN_LED ... //ustawienie pinu jako wyjscie#define LED_GREEN_ON ... //ustawienie stanu wysokiego#define LED_GREEF_OFF ... //ustawienie stanu niskiego
- utworzyć makra w pliku nagłówkowym “Modul328.h” do obsługi przycisków
12#define INIT_GREEN_BUTTON ... //Ustawia pin jako wejscie PULL_UP#define BUTTON_GREEN_PUSH ... //zwraca 1 jesli przycisk wcisniety
- przetestować działanie makr – napisać program:
- przyciśnięty przycisk czerwony – dioda czerwona uruchomiona
- przyciśnięty przycisk zielony – dioda zielona uruchomiona
- przyciśnięte dwa przyciski – uruchomiona tylko dioda żółta
Makra ułatwiają dalsze prace nad programem. Dzięki podpowiedzią programu Eclipse programista nie musi podawać całej nazwy makra – po wpisaniu kilku pierwszych liter, środowisko Eclipse powinno automatycznie podpowiedzieć resztę nazwy (jeśli nie uruchomiło się okno podpowiedzi można je ręcznie wywołać przez kombinację klawiszy ctrl+ spacja). Programista tworząc makra do obsługi peryferiów na początku pracy z nowym modułem powinien dokładnie zapoznać się z podłączeniami w module i przetestować utworzony kod. Tak przygotowany kod w czasie tworzenia programu można łatwo wykorzystać – piszemy “LED_GREEN_ON” i dioda zielona zostanie uruchomiona. Takie uproszczenie pozwala skupić się na działaniu kodu – zwalnia programistę z ciągłego zaglądania do dokumentacji modułu i szukania fizycznego połączenia, dodatkowo zapobiega błędom – sprawdzone makro uruchamiające diodę zieloną zawsze będzie wykonywać to zadanie. Tworzenie makr przyczynia się do rozdzielenie warstwy sprzętowej od programu – dalsze prace nad kodem może wykonywać programista, który zna język c/c++ ale nie ma pojęcia o strukturze mikrokontrolera AVR – przenosi tworzenie kodu na wyższą wartę abstrakcji. Inną zaletą takie podejścia jest duża uniwersalność/przenośność kodu np. mamy przygotowany skomplikowany kod (kilka tysięcy linii kodu), który w wielu miejscach wykorzystuje funkcjonalność zapisaną z wykorzystaniem makra dla prototypu urządzenia. Jednak w wersji finalnej urządzenia okazuje, się że elektronik musiał zamienić dwa porty (diodę czerwoną z przyciskiem zielonym) i konieczna są zmiany. Mając utworzone makra – niższe warstwy, wszystkie zmiany dokonujemy na ich poziomie a cały algorytm pozostaje bez zmian.
3. Wstęp do biblioteki UART, praca z terminalem – wysyłanie danych
UART jest to popularny interfejs w mikrokontrolerach. Do swojego działania wykorzystuje dwie linie:
- Rx – linia odbierająca
- Tx – linia nadająca
Jeśli w naszym układzie chcemy aby była jednokierunkowa transmisja to wystarczy podłączyć tylko jedną linię w odpowiednim kierunku. W celu komunikacji w dwie strony należy wykorzystać dwie linie i odpowiednio połączyć co zostało zaprezentowane:
Szybkość transmisji ustawia się za pomocą wyboru odpowiedniego “BAUDRATE” nim niższa szybkość transmisji tym mniejsze generowane błędy i można przesyłać dane na większą odległość.
Praca z programem RealTerm:
- uruchomić program PuTTY- ikona na pulpicie
- przejść do zakładki drugiej “Port”
- ustawić “Baud”: 19200
- wybrać “Port”: port należy odczytać w menadżerze urządzeń systemu np. dla portu COM5 wpisujemy COM5
- kliknąć przycisk “Load”, co spowoduje otwarcie portu i uruchomienie transmisji (nic nie powinno się wyświetlać ponieważ moduł nic nie wysyła)
Zadania:
- dodać do projektu pliki z paczki (UART) i dołączyć klasę “UART0” do pliku “main.cpp”
- zapoznać się z funkcjami jakie udostępnia klasa “UART0”, omówić działanie w grupie
- uzupełnić funkcje: UART0::init() i UART0::sendByte(const uint8_t data)
- skopiować kod z poniższego przykładu, wyświetlić okno terminala i obserwować działanie – co on robi? Po co “\r\n”?
1 2 3 4 5 6 7 |
int main() { UART0::init(); while (1) { UART0::sendText("To dziala\r\n"); _delay_ms(500); } } |
- zaimplementować funkcję która po przyciśnięciu przycisku czerwonego spowoduje wysłanie 10 komunikatów “To działa i!!!” w dostępach 1 sekundy – gdzie i to numer komunikatu (1,2,3…10) – można wykorzystać funkcję sprintf(…)
4. UART – odbieranie danych
- skopiować kod z poniższego przykładu, w terminalu wpisać swoje imię i nazwisko – jaką funkcje realizuje poniższy kod?
123456int main() {UART0::init(19200);while (1) {UART0::sendByte(UART0::receiveByte());}} - zapoznać się z działaniem funkcji “UART0::receiveByte()” – do czego służy?
- zaimplementować następującą funkcjonalność:
- odebranie znaku ‘r’ powoduje włączenie czerwonej diody LED i przesłanie komunikatu do terminala “Świeci: RED”
- odebranie znaku ‘y’ powoduje włączenie żółtej diody LED i przesłanie komunikatu do terminala “Świeci: YELLOW”
- odebranie znaku ‘g’ powoduje włączenie zielonej diody LED i przesłanie komunikatu do terminala “Świeci: GREEN”
- odebranie znaku ‘z’ powoduje wyłączenie wszystkich diod LED i przesłanie komunikatu do terminala: “Wyłączono wszystkie diody LED”
- zaimplementować funkcjonalność menu:
- po uruchomieniu modułu na ekranie wyświetla się menu z opcjami do wyboru:
- ‘1 – wlacz diode czerwona’
- ‘2 – wlacz diode zolta’
- ‘3 – wlacz diode zielona’
- 4 – wylacz diode czerwona’
- ….
- ‘7 – pokaz stan diod LED’
- ‘? – wyswietl menu’
- zaimplementować funkcjonalność menu:
- przyciśnięci przycisku 1 powoduje uruchomienie diody czerwonej i wysłanie informacji o stanie diod LED, przyciśnięcie przycisku 4 powoduje wyłączenie diody czerwonej i wysłanie informacji o stanie
- przyciśnięci przycisku 7 wyświetla stan diod LED: “Stan LED 0 1 0” – co oznacza, ze uruchomiona jest tylko dioda żółta
- ? – wyświetla ponownie menu
- po uruchomieniu modułu na ekranie wyświetla się menu z opcjami do wyboru:
- praca z ciągiem znaków: po wpisaniu PWR terminal odpowiada “Witaj studencie!!!”
- odczytywanie liczb z terminala: po podaniu swojego roku urodzenia, na terminalu pojawia się napis: “Witaj, masz xx lat.” np. podajemy 1988 i pojawia się komunikat “Witaj, masz 26 lat.”