Čia mes užmegsime ryšį tarp „ATmega8“ mikrovaldiklio ir „Arduino Uno“. Čia užmegztas ryšys yra UART (universalaus asinchroninio imtuvo siųstuvo) tipo. Tai nuoseklus bendravimas. Šiuo nuosekliu ryšiu duomenis galima dalytis tarp dviejų valdiklių, o to reikia įvairiose įterptųjų sistemų programose.
Įterptosiose sistemose turime turėti pagrindinių žinių apie sistemos ryšius, todėl tam ir darome šį projektą. Šiame projekte aptarsime pagrindinę ryšio sistemą ir nuosekliai išsiųsime kai kuriuos duomenis iš siųstuvo į imtuvą.
Šiame projekte ATMEGA8 veikia kaip Siųstuvas, o ARDUINO UNO - GAVĖJAS. Nuosekliame ryšyje mes išsiųsime duomenis BIT BY BIT, kol bus visiškai perduodami BYTE duomenys. Duomenys gali būti 10 bitų dydžio, tačiau kol kas laikysimės 8 bitų.
Būtini komponentai
Aparatūra: ATMEGA8, ARDUINO UNO, maitinimo šaltinis (5v), AVR-ISP PROGRAMMERIUS, 100uF kondensatorius (sujungtas per maitinimo šaltinį), 1KΩ rezistorius (dvi dalys), LED, mygtukas.
Programinė įranga: „ Atmel studio 6.1“, „progisp“ arba „flash magic“, ARDUINO NIGHTLY.
Grandinės schema ir paaiškinimas
Prieš aptardami siųstuvo ir imtuvo grandinės schemą ir programavimą, turime suprasti apie nuoseklųjį ryšį. ATMEGA čia siunčia duomenis UNO nuosekliai, kaip aptarta anksčiau.
Jame yra ir kitų ryšio būdų, tokių kaip MASTER SLAVE, JTAG, bet kad būtų lengviau bendrauti, mes pasirenkame RS232. Čia mes sujungsime ATMEGA8 TXD (siųstuvo) PIN kodą prie ARDUINO UNO RXD (imtuvo) PIN kodo.
Užmegztas duomenų ryšys užprogramuotas taip:
- Aštuoni duomenų bitai
- Du stabdikliai
- Nėra pariteto tikrinimo bitų
- 9600 BPS perdavimo sparta (bitai per sekundę)
- Asinchroninis ryšys (nėra ATMEGA8 ir UNO laikrodžio dalijimosi (abu turi skirtingus laikrodžio vienetus))
Norėdami nustatyti UART tarp „Arduino Uno“ ir „ATMEGA8“, turime tiksliai užprogramuoti nustatymą. Tam abiejuose galuose turime išlaikyti tuos pačius aukščiau nurodytus parametrus. Tai veikia kaip PERDAVĖJAS, o kitas - GAVĖJAS. Toliau aptarsime kiekvienos pusės nustatymus.
Dabar RS232 sąsajoje turi būti įvykdytos šios siųstuvo pusės (ATMEGA8) funkcijos:
1. Pirmojo valdiklio TXD kaištis (duomenų priėmimo funkcija) turi būti įjungtas Siųstuvui.
2. Kadangi ryšys yra nuoseklus, turime žinoti, kai gaunamas duomenų pasisveikinimas, kad galėtume sustabdyti programą, kol bus gautas visas baitas. Tai daroma įgalinus duomenis gauti visišką pertraukimą.
3. DUOMENYS perduodami ir gaunami valdikliui 8 bitų režimu. Taigi vienu metu valdikliui bus nusiųsti du simboliai.
4. Modulio siunčiamuose duomenyse nėra paritinių bitų, vieno sustojimo bito.
Minėtos funkcijos nustatomos valdiklių registruose; mes ketiname juos trumpai aptarti:
Tamsiai pilka (UDRE): Šis bitas nenustatytas paleidimo metu, tačiau jis naudojamas dirbant patikrinti, ar siųstuvas yra pasirengęs perduoti, ar ne. Norėdami sužinoti daugiau informacijos, žiūrėkite programą TRASMITTER SIDE.
VOILET (TXEN): Šis bitas nustatytas įjungti siųstuvo kaištį TRASMITTER SIDE.
GELTONA (UCSZ0, UCSZ1 ir UCSZ2): Šie trys bitai naudojami renkant gaunamų ar siunčiamų duomenų bitų skaičių vienu ypu.
Ryšys tarp dviejų SIDES nustatomas kaip aštuonių bitų ryšys. Suderinę ryšį su mūsų lentele, UCSZ0, UCSZ1 prie vieno ir UCSZ2 prie nulio.
ORANGE (UMSEL): Šis bitas nustatomas atsižvelgiant į tai, ar sistema bendrauja asinchroniškai (abu naudoja skirtingą laikrodį), ar sinchroniškai (abu naudoja tą patį laikrodį).
Abi „SYTEMS“ neturi jokio laikrodžio. Kadangi abu jie naudoja savo vidinį laikrodį. Taigi abiejuose valdikliuose turime nustatyti UMSEL į 0.
ŽALIA (UPM1, UPM0): Šie du bitai koreguojami atsižvelgiant į bitų paritetą, kurį naudojame bendraujant.
Duomenys ATMEGA čia yra užprogramuoti siųsti duomenis be pariteto, kadangi duomenų perdavimo ilgis yra mažas, galime aiškiai tikėtis, kad nebus prarasti duomenys ar klaidos. Taigi mes čia nenustatome jokio pariteto. Taigi mes abu UPM1, UPM0 nustatome į nulį arba jie paliekami, nes visi bitai yra 0 pagal numatytuosius nustatymus.
MĖLYNA (USBS): Šis bitas naudojamas norint pasirinkti sustabdymo bitų skaičių, kurį naudojame ryšio metu.
Užmegztas jos ryšys yra asinchroninio tipo, todėl norint gauti tikslesnį duomenų perdavimą ir priėmimą, turime naudoti du stabdymo bitus. Taigi, TRANSMITTER pusėje USBS nustatėme į „1“.
Perdavimo greitis nustatomas valdiklyje, pasirinkus tinkamą UBRRH:
UBRRH reikšmė parenkama pagal kryžminį perdavimo greitį ir procesoriaus kristalų dažnį:
Taigi pagal kryžminę nuorodą UBRR vertė yra „6“, taigi nustatomas duomenų perdavimo greitis.
Tuo mes nustatėme siųstuvo SIDE nustatymus; mes dabar kalbėsime apie GAVIMO ŠONĄ.
Nuoseklųjį ryšį, įgalinantį UNO, galima atlikti naudojant vieną komandą.
|
Bendravimą, kurį mes manėme užmegzti, vykdo 9600 bitų per sekundę BAUD norma. Taigi, kad UNO nustatytų tokį duomenų perdavimo greitį ir pradėtų nuoseklųjį ryšį, mes naudojame komandą „Serial.begin (9600);“. Čia 9600 yra perdavimo sparta ir yra keičiama.
Dabar visi liko, jei norite gauti duomenis, vieną duomenis gauna JT, juos bus galima paimti. Šiuos duomenis surenka komanda „kapottdata = Serial.read ();“. Šia komanda serijiniai duomenys perkeliami į „gautus duomenis“, pavadintą sveikuoju skaičiumi.
Kaip parodyta grandinėje, mygtukas prijungtas siųstuvo pusėje, kai šį mygtuką paspaudus aštuonių bitų duomenis siunčia TRANSMITTER (ATMEGA8), o šiuos duomenis gauna RECEIVER (ARDUINO UNO). Sėkmingai gavęs šiuos duomenis, jis įjungia ir išjungia prie jo prijungtą šviesos diodą, kad parodytų sėkmingą duomenų perdavimą tarp dviejų valdiklių.
Šiuo UART ryšys tarp ATMEGA8 valdiklio ir ARDUINO UNO sėkmingai užmegztas.