Zde se chystáme navázat komunikaci mezi mikrokontrolérem ATmega8 a Arduino Uno. Komunikace zde navázaná je typu UART (Universal Asynchronous Receiver Transmitter). Je to sériová komunikace. Díky této sériové komunikaci lze data sdílet mezi dvěma řadiči, což je vyžadováno v různých aplikacích integrovaného systému.
V integrovaných systémech musíme mít základní znalosti o systémové komunikaci, proto děláme tento projekt. V tomto projektu probereme základní komunikační systém a budeme sériově odesílat některá data z vysílače do přijímače.
V tomto projektu funguje ATMEGA8 jako VYSÍLAČ a ARDUINO UNO jako PŘIJÍMAČ. V sériové komunikaci budeme odesílat data BIT BY BIT, dokud nebude plně přenesen BYTE dat. Data mohou mít velikost 10 bitů, ale zatím si ponecháme 8 BITS.
Požadované komponenty
Hardware: ATMEGA8, ARDUINO UNO, napájecí zdroj (5 V), AVR-ISP PROGRAMÁTOR, kondenzátor 100 uF (připojený přes napájecí zdroj), rezistor 1 KΩ (dva kusy), LED, tlačítko.
Software: Atmel studio 6.1, progisp nebo flash magic, ARDUINO NIGHTLY.
Schéma zapojení a vysvětlení
Než budeme diskutovat o schématu zapojení a programování pro vysílač a přijímač, musíme pochopit sériovou komunikaci. ATMEGA zde odesílá data UNO v sérii, jak bylo popsáno výše.
To má i další způsoby komunikace, jako je Master podřízeným komunikačním, JTAG komunikaci, ale pro snadnou komunikaci jsme se rozhodli RS232. Zde připojíme PIN TXD (vysílač) ATMEGA8 k RXD (přijímač) PIN ARDUINO UNO
Navázaná datová komunikace je naprogramována tak, aby měla:
- Osm datových bitů
- Dva stop bity
- Žádný bit kontroly parity
- Přenosová rychlost 9600 BPS (bitů za sekundu)
- Asynchronní komunikace (žádné sdílení hodin mezi ATMEGA8 a UNO (oba mají různé jednotky hodin))
Pro vytvoření UART mezi Arduino Uno a ATMEGA8 musíme nastavení přesně naprogramovat. Z tohoto důvodu musíme zachovat výše uvedené parametry na obou koncích stejné. V tomto funguje jako VYSÍLAČ a další jako PŘIJÍMAČ. Níže probereme nastavení každé strany.
Nyní pro rozhraní RS232 musí být na straně VYSÍLAČE (ATMEGA8) splněny následující funkce:
1. VYSÍLAČ musí být povolen pin TXD (funkce příjmu dat) prvního řadiče.
2. Protože je komunikace sériová, musíme vědět, kdykoli je datová bye přijata, abychom mohli program zastavit, dokud nedostaneme kompletní bajt. To se provádí povolením úplného přerušení přijímání dat.
3. DATA jsou přenášena a přijímána do řadiče v 8bitovém režimu. Do řídicí jednotky budou tedy odeslány současně dva znaky.
4. V datech odeslaných modulem nejsou žádné paritní bity, jeden stop bit.
Výše uvedené funkce jsou nastaveny v registrech řadiče; budeme o nich krátce diskutovat:
TMAVĚ ŠEDÁ (UDRE): Tento bit není nastaven během spuštění, ale používá se během práce ke kontrole, zda je vysílač připraven vysílat nebo ne. Další informace najdete v programu na TRASMITTER SIDE.
VOILET (TXEN): Tento bit je nastaven pro povolení pinu vysílače na TRASMITTER SIDE.
ŽLUTÁ (UCSZ0, UCSZ1 a UCSZ2): Tyto tři bity se používají k výběru počtu datových bitů, které přijímáme nebo odesíláme najednou.
Komunikace mezi dvěma STRANAMI je navázána jako osmibitová komunikace. Porovnáním komunikace s tabulkou máme UCSZ0, UCSZ1 s jednou a UCSZ2 s nulou.
ORANGE (UMSEL): Tento bit je nastaven na základě toho, zda systém komunikuje asynchronně (oba používají různé hodiny) nebo synchronně (oba používají stejné hodiny).
Oba SYTÉMY nesdílejí žádné hodiny. Protože oba používají vlastní vnitřní hodiny. Musíme tedy nastavit UMSEL na 0 v obou řadičích.
ZELENÁ (UPM1, UPM0): Tyto dva bity jsou upraveny na základě bitové parity, kterou používáme při komunikaci.
Data ATMEGA jsou zde naprogramována tak, aby odesílala data bez parity, protože délka přenosu dat je malá, takže můžeme jednoznačně očekávat, že nedojde ke ztrátě ani chybě dat. Takže zde nenastavujeme žádnou paritu. Takže jsme nastavili oba UPM1, UPM0 na nulu nebo jsou ponechány, protože všechny bity jsou standardně 0.
MODRÁ (USBS): Tento bit se používá k výběru počtu stop bitů, které používáme během komunikace.
Komunikace, která ji navázala, je asynchronního typu, takže pro získání přesnějšího přenosu a příjmu dat musíme použít dvě stop bity, proto jsme nastavili USBS na '1' na straně VYSÍLAČE.
Přenosová rychlost se nastavuje v ovladači výběrem příslušné UBRRH:
Hodnota UBRRH se volí přenosovou rychlostí a krystalovou frekvencí CPU:
Takže křížovým odkazem je hodnota UBRR považována za „6“, a tak je nastavena přenosová rychlost.
Tím jsme vytvořili nastavení na VYSÍLAČI; teď budeme hovořit o PŘÍJMU STRANY.
Sériovou komunikaci umožňující v UNO lze provést pomocí jediného příkazu.
|
Komunikace, kterou jsme předpokládali navázat, se provádí rychlostí BAUD 9600 bitů za sekundu. Aby tedy UNO stanovilo takovou přenosovou rychlost a zahájilo sériovou komunikaci, použijeme příkaz „Serial.begin (9600);“. Zde je 9600 přenosová rychlost a je měnitelná.
Nyní zbývá vše, pokud chcete přijímat data, jedno z nich přijme UNO, bude k dispozici k převzetí. Tato data jsou sbírána příkazem „receivedata = Serial.read ();“. Tímto příkazem jsou sériová data přenesena do 'receivedata' pojmenovaného celého čísla.
Jak je znázorněno v obvodu, je tlačítko připojeno na straně vysílače, když je toto stisknuté tlačítko odesláno osm bitových dat VYSÍLAČEM (ATMEGA8) a tato data jsou přijímána PŘIJÍMAČEM (ARDUINO UNO). Po úspěšném přijetí těchto dat přepne LED k nim připojené ZAPNUTO a VYPNUTO, aby zobrazil úspěšný přenos dat mezi dvěma řadiči.
Tímto způsobem je úspěšně navázána komunikace UART mezi řadičem ATMEGA8 a ARDUINO UNO.