Tu bomo vzpostavili komunikacijo med mikrokrmilnikom ATmega8 in Arduino Uno. Tu vzpostavljena komunikacija je tipa UART (Universal Asynchronous Receiver Transmitter). To je serijska komunikacija. S tem se lahko serijska komunikacija izmenjuje med dvema krmilnikoma, kar je potrebno v različnih vdelanih sistemskih aplikacijah.
V vgrajenih sistemih moramo imeti osnovno znanje o sistemskih komunikacijah, zato za to delamo ta projekt. V tem projektu bomo obravnavali osnovni komunikacijski sistem in poslali nekaj podatkov od oddajnika do sprejemnika v seriji.
V tem projektu ATMEGA8 deluje kot ODDAJALEC, ARDUINO UNO pa kot SPREJEMNIK. Pri serijski komunikaciji bomo podatke pošiljali BIT BY BIT, dokler se bajt podatkov ne prenese v celoti. Podatki so lahko velikosti 10 bitov, vendar se bomo za zdaj držali 8BITS.
Potrebne komponente
Strojna oprema: ATMEGA8, ARDUINO UNO, napajalnik (5v), AVR-ISP PROGRAMMER, kondenzator 100uF (priključen na napajalnik), upor 1KΩ (dva kosa), LED, gumb.
Programska oprema: Atmel studio 6.1, progisp ali flash magic, ARDUINO NOČI.
Shema vezja in razlaga
Preden se pogovorimo o vezju in programiranju oddajnika in sprejemnika, moramo razumeti serijsko komunikacijo. ATMEGA tukaj pošilja podatke UNO zaporedno, kot smo že omenili.
Ima druge načine komuniciranja, kot MASTER SLAVE komunikacije, JTAG komunikacije pa za enostavno komunikacijo smo se odločili RS232. Tu bomo povezali PIN TXD (oddajnika) ATMEGA8 z RXD (sprejemnikom) PIN ARDUINO UNO
Vzpostavljena podatkovna komunikacija je programirana tako, da:
- Osem podatkovnih bitov
- Dva stop bitka
- Brez bitov za preverjanje paritete
- Hitrost prenosa 9600 BPS (bitov na sekundo)
- Asinhrona komunikacija (ni deljenja ure med ATMEGA8 in UNO (obe imata različne enote ure))
Za vzpostavitev UART med Arduino Uno in ATMEGA8 moramo natančno programirati nastavitev. Za to moramo zgoraj omenjene parametre ohraniti enake na obeh koncih. Pri tem deluje kot ODDAJALEC, drugi pa kot SPREJEMNIK. Spodaj bomo razpravljali o nastavitvah vsake strani.
Zdaj za vmesnik RS232 morajo biti na strani TRANSMITTER (ATMEGA8) izpolnjene naslednje funkcije:
1. Za TRANSMITTER mora biti omogočen zatič TXD (funkcija prejemanja podatkov) prvega krmilnika.
2. Ker je komunikacija zaporedna, moramo vedeti, kdaj je prejemnik podatkov, zato lahko zaustavimo program, dokler ne prejmemo celotnega bajta. To se naredi tako, da se omogoči popolna prekinitev podatkov.
3. PODATKI se prenašajo in prejemajo v krmilnik v 8-bitnem načinu. Torej bosta krmilniku naenkrat poslana dva znaka.
4. V podatkih, ki jih pošilja modul, ni paritetnih bitov, en zaustavitveni bit.
Zgornje funkcije so nastavljene v registrih krmilnikov; o njih bomo na kratko razpravljali:
TEMNO SIV (UDRE): Ta bit ni nastavljen med zagonom, vendar se med delom uporablja za preverjanje, ali je oddajnik pripravljen za prenos ali ne. Za več podrobnosti glejte program TRASMITTER SIDE.
VOILET (TXEN): Ta bit je nastavljen za omogočanje zatiča oddajnika na TRASMITTER SIDE.
RUMENA (UCSZ0, UCSZ1 in UCSZ2): Ti trije biti se uporabljajo za izbiro števila podatkovnih bitov, ki jih prejmemo ali pošljemo v enem samem potezu.
Komunikacija med dvema SIDES je vzpostavljena kot osem bitna komunikacija. Z ujemanjem komunikacije s tabelo imamo UCSZ0, UCSZ1 na eno in UCSZ2 na nič.
ORANŽNA (UMSEL): Ta bit se nastavi glede na to, ali sistem komunicira asinhrono (oba uporabljata drugačno uro) ali sinhrono (oba uporabljata isto uro).
Oba SISTEMA nimata skupne ure. Ker oba uporabljata svojo notranjo uro. Torej moramo v obeh krmilnikih nastaviti UMSEL na 0.
ZELENA (UPM1, UPM0): Ta dva bita se prilagodita glede na parnost bitov, ki jo uporabljamo v komunikaciji.
Podatki ATMEGA so tukaj programirani za pošiljanje podatkov brez paritete, saj je dolžina prenosa podatkov majhna, lahko očitno pričakujemo izgubo ali napako. Torej tukaj ne postavljamo nobene paritete. Tako nastavimo oba UPM1, UPM0 na nič ali pa ostanejo, ker so vsi biti privzeto 0.
MODRA (USBS): Ta bit se uporablja za izbiro števila zaustavitvenih bitov, ki jih uporabljamo med komunikacijo.
V komunikaciji je ugotovila, da je asinhrona, zato moramo za natančnejši prenos in sprejem podatkov uporabiti dva stop bita, zato nastavimo USBS na '1' na strani TRANSMITTER.
Hitrost prenosa se nastavi v krmilniku z izbiro ustreznega UBRRH:
Vrednost UBRRH se izbere s hitrostjo navzkrižnega prenosa in frekvenco kristala CPU:
Torej je vrednost navzkrižnega sklica UBRR videti kot "6" in tako je nastavljena hitrost prenosa.
S tem smo vzpostavili nastavitve na STRANI ODDAJNIKA; zdaj bomo govorili o PREJEMI STRANI.
Omogočanje serijske komunikacije v UNO lahko izvedete z enim samim ukazom.
|
Komunikacija, za katero smo domnevali, da poteka, poteka s hitrostjo BAUD 9600 bitov na sekundo. Torej, da UNO vzpostavi takšno hitrost prenosa in začne serijsko komunikacijo, uporabljamo ukaz "Serial.begin (9600);". Tu je 9600 hitrost prenosa in je spremenljiva.
Zdaj je ostalo vse, če bo UNO prejel podatke, če jih bo prejel, bodo na voljo za zajem. Te podatke pobere ukaz “полуčeni podatki = Serial.read ();”. S tem ukazom se serijski podatki prenašajo v 'receivedata' z imenom celo število.
Kot je prikazano v vezju, gumb, ki je priključen na strani oddajnika, ko ta gumb pritisnete, pošlje osem-bitni podatek TRANSMITTER (ATMEGA8) in te podatke prejme RECEIVER (ARDUINO UNO). Po uspešnem prejemu teh podatkov vklopi in izklopi LED, ki je nanj povezan, da prikaže uspešen prenos podatkov med dvema krmilnikoma.
S tem UART je uspešno vzpostavljena komunikacija med krmilnikom ATMEGA8 in ARDUINO UNO.