Tutaj mamy zamiar ustanowić komunikację pomiędzy mikrokontrolerem ATmega8 a Arduino Uno. Nawiązana tutaj komunikacja jest typu UART (Universal Asynchronous Receiver Transmitter). To komunikacja szeregowa. Dzięki tej komunikacji szeregowej dane mogą być współdzielone między dwoma kontrolerami, co jest wymagane w różnych wbudowanych aplikacjach systemowych.
W systemach wbudowanych musimy mieć podstawową wiedzę na temat komunikacji systemowej, dlatego w tym celu wykonujemy ten projekt. W tym projekcie omówimy podstawowy system komunikacyjny oraz wyślemy szereg danych z nadajnika do odbiornika.
W tym projekcie ATMEGA8 działa jako NADAJNIK, a ARDUINO UNO jako ODBIORNIK. W komunikacji szeregowej będziemy przesyłać dane BIT BY BIT, aż do całkowitego przesłania BYTE danych. Dane mogą mieć rozmiar 10-bitowy, ale na razie będziemy trzymać się 8BITÓW.
Wymagane składniki
Osprzęt: ATMEGA8, ARDUINO UNO, zasilacz (5v), PROGRAMATOR AVR-ISP, kondensator 100uF (podłączony przez zasilacz), rezystor 1KΩ (dwuczęściowy), dioda LED, przycisk.
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic, ARDUINO NIGHTLY.
Schemat obwodu i wyjaśnienie
Zanim omówimy schemat obwodu i programowanie nadajnika i odbiornika, musimy zrozumieć komunikację szeregową. ATMEGA wysyła tutaj dane do UNO szeregowo, jak omówiono wcześniej.
Ma inne sposoby komunikacji, takich jak komunikacja Master Slave, komunikacji JTAG ale dla łatwej komunikacji jesteśmy Wybierając RS232. Tutaj podłączymy PIN TXD (nadajnika) ATMEGA8 do PIN RXD (odbiornika) ARDUINO UNO
Ustanowiona transmisja danych jest zaprogramowana tak, aby mieć:
- Osiem bitów danych
- Dwa bity stopu
- Brak bitu kontroli parzystości
- Szybkość transmisji 9600 BPS (bitów na sekundę)
- Komunikacja asynchroniczna (brak udziału zegara między ATMEGA8 i UNO (oba mają różne jednostki zegara))
Aby ustanowić UART między Arduino Uno i ATMEGA8, musimy dokładnie zaprogramować ustawienie. W tym celu musimy zachować powyższe parametry na obu końcach. W tym jeden działa jako NADAJNIK, a inne jako ODBIORNIK. Poniżej omówimy ustawienia każdej strony.
Teraz dla interfejsu RS232 muszą być spełnione następujące cechy po stronie TRANSMITERA (ATMEGA8):
1. Pin TXD (funkcja odbioru danych) pierwszego kontrolera musi być włączony dla TRANSMITERA.
2. Ponieważ komunikacja jest połączona szeregowo, musimy wiedzieć, kiedy odbierane są dane, 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): Ten bit nie jest ustawiony podczas uruchamiania, ale jest używany podczas pracy, aby sprawdzić, czy nadajnik jest gotowy do transmisji, czy nie. Więcej szczegółów w programie na TRASMITTER SIDE.
VOILET (TXEN): Ten bit jest ustawiony na włączenie pinów nadajnika po stronie TRASMITTER SIDE.
ŻÓŁTY (UCSZ0, UCSZ1 i UCSZ2): Te trzy bity służą do wybierania liczby bitów danych, które odbieramy lub wysyłamy za jednym razem.
Komunikacja między dwoma STRONAMI jest ustanowiona jako komunikacja ośmiobitowa. Dopasowując komunikację do tabeli mamy UCSZ0, UCSZ1 do jedynki i UCSZ2 do zera.
POMARAŃCZOWY (UMSEL): Ten bit jest ustawiany na podstawie tego, czy system komunikuje się asynchronicznie (oba używają innego zegara), czy synchronicznie (oba używają tego samego zegara).
Oba SYTEMY 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): Te dwa bity są regulowane na podstawie parzystości bitów, której używamy w komunikacji.
Dane ATMEGA są tutaj zaprogramowane 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): Ten bit jest używany do wyboru liczby bitów stopu, których używamy podczas komunikacji.
Ustanowiona komunikacja jest typu asynchronicznego, więc dla uzyskania dokładniejszej transmisji i odbioru danych musimy użyć dwóch bitów stopu, dlatego ustawiamy USBS na '1' po stronie TRANSMITERA.
Szybkość transmisji ustawia się w sterowniku wybierając odpowiedni UBRRH:
Wartość UBRRH jest wybierana poprzez porównanie szybkości transmisji i częstotliwości kryształu procesora:
Zatem przez odniesienie wartość UBRR jest postrzegana jako „6”, a więc ustawiana jest prędkość transmisji.
Dzięki temu ustaliliśmy ustawienia po STRONIE NADAJNIKA; porozmawiamy teraz o RECEIVING SIDE.
Komunikację szeregową włączoną w UNO można zrealizować jednym poleceniem.
|
Komunikacja, którą przypuszczaliśmy ustanowić, odbywa się z szybkością BAUD 9600 bitów na sekundę. Aby więc UNO ustalić taką prędkość transmisji i rozpocząć komunikację szeregową, używamy polecenia „Serial.begin (9600);”. Tutaj 9600 to szybkość transmisji i jest zmienne.
Teraz wszystko zostało, jeśli do odebrania danych, jeden z nich otrzyma UNO, będzie dostępny do pobrania. Te dane są pobierane za pomocą polecenia „receiveddata = Serial.read ();”. Za pomocą tego polecenia dane szeregowe są traktowane jako „dane otrzymane” o nazwie integer.
Jak pokazano na schemacie, przycisk jest podłączony po stronie nadajnika, gdy ten przycisk jest wciśnięty, 8-bitowe dane są wysyłane przez TRANSMITTER (ATMEGA8) i te dane są odbierane przez ODBIORNIK (ARDUINO UNO). Po pomyślnym odebraniu tych danych włącza i wyłącza podłączoną diodę LED, aby pokazać udany transfer danych między dwoma kontrolerami.
Dzięki tej komunikacji UART pomiędzy kontrolerem ATMEGA8 a ARDUINO UNO jest pomyślnie nawiązana.