W tym samouczku zamierzamy ustanowić komunikację szeregową między dwoma mikrokontrolerami ATMEGA8. Nawiązana tutaj komunikacja jest typu UART (Universal Asynchronous Receiver Transmitter). Dzięki tej komunikacji szeregowej dane mogą być współdzielone między dwoma mikrokontrolerami, co jest wymagane w różnych systemach wbudowanych.
Wymagane składniki
Osprzęt: ATMEGA8 (2 sztuki), zasilacz (5v), PROGRAMATOR AVR-ISP, kondensator 100uF (podłączany przez zasilacz), rezystor 1KΩ (dwa sztuki), dioda LED, przycisk.
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic.
Schemat obwodu i wyjaśnienie
Rozumiemy komunikację szeregową w mikrokontrolerach AVR. Tutaj ATMEGA wysyła dane do drugiej ATMEGA szeregowo. Ma inny tryb komunikacji, ale dla łatwej komunikacji wybieramy RS232. Pin RS232 pierwszego ATMEGA8 jest połączony z pinem RXD drugiego ATMEGA8.
Ustanowiona transmisja danych jest zaprogramowana tak, aby mieć:
- Osiem bitów danych
- Dwa bity stopu
- Brak bitu kontroli parzystości
- Szybkość transmisji 2400 BPS (bitów na sekundę)
- Komunikacja asynchroniczna (brak udziału zegara między dwoma ATMEGA8)
Mamy więc dwa zestawy rejestrów inaczej dla dwóch ATMEGA8, z których jeden działa jako NADAJNIK, a drugi jako ODBIORNIK.
Teraz dla interfejsu RS232 między dwoma mikrokontrolerami ATmega, następujące cechy muszą być spełnione dla NADAJNIKA i ODBIORNIKA:
1. Pin TXD (funkcja odbioru danych) pierwszego kontrolera musi być włączony dla NADAJNIKA, a pin RXD drugiego kontrolera musi być włączony dla ODBIORNIKA.
2. Ponieważ komunikacja odbywa się szeregowo, musimy wiedzieć, kiedy zostanie odebrany bajt danych, abyśmy mogli zatrzymać program do momentu odebrania całego bajtu. Odbywa się to poprzez włączenie całkowitego przerwania odbioru danych.
3. DANE są przesyłane i odbierane do kontrolera w trybie 8-bitowym. Tak więc do kontrolera zostaną wysłane jednocześnie dwa znaki.
4. Brak bitów parzystości, jeden bit stopu w danych wysyłanych przez moduł.
Powyższe cechy są ustawione w rejestrach kontrolera; omówimy je pokrótce,
CIEMNOSZARY (UDRE): (STRONA TRASMITERA) Ten bit nie jest ustawiony podczas uruchamiania, ale jest używany podczas pracy do sprawdzenia, czy nadajnik jest gotowy do nadawania, czy nie. Więcej szczegółów w programie na TRASMITTER SIDE.
JASNOSZARY (RXC): (STRONA ODBIORU) Ten bit nie jest ustawiony podczas uruchamiania, ale jest używany podczas pracy, aby sprawdzić, czy odbiornik jest gotowy do odbioru danych, czy nie. Więcej informacji można znaleźć w programie STRONA ODBIORU.
VOILET (TXEN): (TRASMITTER SIDE) Ten bit jest ustawiony na włączenie pinów nadajnika na TRASMITTER SIDE.
CZERWONY (RXEN): (STRONA ODBIORU) Ten bit reprezentuje funkcję odbioru danych, ten bit musi być ustawiony, aby dane z modułu były odbierane przez kontroler, włącza również pin RXD kontrolera.
BRĄZOWY (RXCIE): Ten bit musi być ustawiony, aby uzyskać przerwanie po udanym odbiorze danych. Włączając ten bit poznajemy zaraz po otrzymaniu 8-bitowych danych. Nie zamierzamy tutaj używać tego bitu, więc pozostaje w spokoju.
PINK (URSEL): Ten bit musi być ustawiony przed włączeniem innych bitów w UCSRC, po ustawieniu innych potrzebnych bitów w UCSRC; URSEL musi być wyłączony lub ustawiony na zero. Nie zamierzamy tutaj używać tego bitu, więc pozostaje w spokoju.
ŻÓŁTY (UCSZ0, UCSZ1, UCSZ2): (STRONA ODBIORU I STRONA PRZEKAŹNIKA) Te trzy bity są używane do wybierania liczby bitów danych, które odbieramy lub wysyłamy za jednym razem.
Komunikacja między dwoma ATMEGA jest ustanowiona jako ośmiobitowa komunikacja. Dopasowując komunikację do tabeli mamy UCSZ0, UCSZ1 do jedynki i UCSZ2 do zera.
Musimy ustawić je zarówno po stronie odbiorczej, jak i nadawczej.
POMARAŃCZOWY (UMSEL): (STRONA ODBIORU I STRONA TRASMITERA) Ten bit jest ustawiany w zależności od tego, czy system komunikuje się asynchronicznie (oba używają innego zegara), czy synchronicznie (oba używają tego samego zegara).
Oba kontrolery nie współdzielą żadnego zegara. Ponieważ obaj używają własnego zegara wewnętrznego. Musimy więc ustawić UMSEL na 0 w obu kontrolerach.
ZIELONY (UPM1, UPM0): (STRONA ODBIORU I STRONA TRASMITERA) Te dwa bity są regulowane na podstawie parzystości bitów, której używamy w komunikacji.
ATMEGA jest zaprogramowana do wysyłania danych bez parzystości, ponieważ długość transmisji danych jest niewielka, nie możemy spodziewać się utraty danych ani błędów. Więc nie ustalamy tutaj żadnej parzystości. Więc ustawiamy oba UPM1 i UPM0 na zero lub są one pozostawione, ponieważ wszystkie bity mają domyślnie 0.
NIEBIESKI (USBS): (STRONA ODBIORU I STRONA PRZEKAŹNIKA) Ten bit jest używany do wyboru liczby bitów stopu, których używamy podczas komunikacji.
Ustanowiona tutaj komunikacja ma charakter asynchroniczny, więc aby uzyskać dokładniejszą transmisję i odbiór danych, musimy użyć dwóch bitów stopu, dlatego w obu kontrolerach ustawiamy USBS na „1”.
Szybkość transmisji ustawia się w kontrolerze poprzez wybór odpowiedniego UBRRH.
Wartość UBRRH jest wybierana poprzez łączenie szybkości transmisji i częstotliwości kryształu procesora.
Zatem przez odniesienie wartość UBRR jest postrzegana jako „25”, a więc ustawiana jest prędkość transmisji.
Jak pokazano na schemacie, przycisk jest podłączony po stronie nadajnika. Po wciśnięciu tego przycisku, 8-bitowe dane są wysyłane przez NADAJNIK i te dane są odbierane przez ODBIORNIK. Po pomyślnym odebraniu tych danych włącza i wyłącza podłączoną diodę LED, co pokazuje udany transfer danych między dwoma kontrolerami.