Тук ще установим комуникация между ATmega8 микроконтролер и Arduino Uno. Установената тук комуникация е тип UART (Universal Asynchronous Receiver Transmitter). Това е серийна комуникация. Чрез тази серийна комуникация данните могат да се споделят между два контролера, което се изисква в различни вградени системни приложения.
Във вградените системи трябва да имаме основни познания за системните комуникации, така че за това правим този проект. В този проект ще обсъдим основната комуникационна система и ще изпратим някои данни от предавателя към приемника в сериал.
В този проект ATMEGA8 действа като ПРЕДАВАТЕЛ, а ARDUINO UNO действа като ПРИЕМАТЕЛ. При последователна комуникация ще изпращаме данни БИТ ПО БИТ, докато байт от данни не бъде прехвърлен изцяло. Данните могат да бъдат с размер от 10 бита, но засега ще запазим 8BITS.
Необходими компоненти
Хардуер: ATMEGA8, ARDUINO UNO, захранване (5v), AVR-ISP PROGRAMMER, кондензатор 100uF (свързан през захранването), 1KΩ резистор (два броя), LED, бутон.
Софтуер: Atmel studio 6.1, прогисп или флаш магия, ARDUINO НОЩНО.
Електрическа схема и обяснение
Преди да обсъдим електрическата схема и програмирането на предавателя и приемника, трябва да разберем за серийната комуникация. Тук ATMEGA изпраща данни до ООН последователно, както беше обсъдено по-рано.
Той има други режими на комуникация като MASTER SLAVE комуникация, JTAG комуникация, но за лесна комуникация избираме RS232. Тук ще свържем PIN на TXD (предавател) на ATMEGA8 към RXD (приемник) PIN на ARDUINO UNO
Установената комуникация на данни е програмирана да има:
- Осем бита за данни
- Два стоп бита
- Няма бит за проверка на паритета
- Скорост на предаване от 9600 BPS (бита в секунда)
- Асинхронна комуникация (без споделяне на часовника между ATMEGA8 и UNO (и двете имат различни тактови единици))
За да установим UART между Arduino Uno и ATMEGA8, трябва да програмираме настройката точно. За това трябва да запазим гореспоменатите параметри еднакви в двата края. В този един действа като ПРЕДАВАТЕЛ, а други действа като ПРИЕМНИК. Ще обсъдим настройките на всяка страна по-долу.
Сега за интерфейса RS232 трябва да бъдат изпълнени следните функции за страната ПРЕДАВАТЕЛ (ATMEGA8):
1. ПИН TXD (функция за получаване на данни) на първия контролер трябва да бъде активиран за TRANSMITTER.
2. Тъй като комуникацията е серийна, трябва да знаем всеки път, когато се получи данните, за да можем да спрем програмата, докато не бъде получен целият байт. Това се прави, като се даде възможност на данните да получават пълно прекъсване.
3. ДАННИТЕ се предават и получават на контролера в 8-битов режим. Така че два знака ще бъдат изпратени на контролера наведнъж.
4. Няма битове за паритет, един стоп бит в данните, изпратени от модула.
Горните функции са зададени в регистрите на контролера; ще ги обсъдим накратко:
ТЪМНО СИВО (UDRE): Този бит не е зададен по време на стартиране, но се използва по време на работа, за да се провери дали предавателят е готов за предаване или не. Вижте програмата на TRASMITTER SIDE за повече подробности.
VOILET (TXEN): Този бит е настроен за активиране на щифта на предавателя на TRASMITTER SIDE.
ЖЪЛТ (UCSZ0, UCSZ1 и UCSZ2): Тези три бита се използват за избор на броя битове за данни, които получаваме или изпращаме с едно движение.
Комуникацията между две SIDES се установява като осембитова комуникация. Чрез съвпадение на комуникацията с таблица, която имаме, UCSZ0, UCSZ1 на едно и UCSZ2 на нула.
ОРАНЖЕВ (UMSEL): Този бит се задава въз основа на това дали системата комуникира асинхронно (и двете използват различен часовник), или синхронно (и двата използват един и същ часовник).
И двете СИСТЕМИ не споделят никакъв часовник. Тъй като и двамата използват собствен вътрешен часовник. Така че трябва да зададем UMSEL на 0 в двата контролера.
ЗЕЛЕН (UPM1, UPM0): Тези два бита се коригират въз основа на битов паритет, който използваме в комуникацията.
Данните ATMEGA тук са програмирани да изпращат данни без паритет, тъй като дължината на предаване на данни е малка, можем ясно да очакваме загуба или грешка в данните. Така че ние не поставяме никакъв паритет тук. Така че настройваме и двете UPM1, UPM0 на нула или те са останали, защото всички битове са 0 по подразбиране.
СИН (USBS): Този бит се използва за избор на броя битове за спиране, които използваме по време на комуникацията.
Установената от нея комуникация е от асинхронен тип, така че за да получите по-точно предаване и приемане на данни, трябва да използваме два стоп бита, следователно задаваме USBS на „1“ в страната ПРЕДАВАТЕЛ.
Скоростта на предаване се задава в контролера чрез избор на подходящия UBRRH:
Стойността на UBRRH се избира чрез скорост на кръстосано препращане и честота на кристала на процесора:
Така чрез кръстосана препратка стойността на UBRR се разглежда като „6“ и така се задава скоростта на предаване.
С това ние сме установили настройки на TRANSMITTER SIDE; сега ще говорим за ПОЛУЧАВАНЕ НА СТРАНА.
Активирането на серийната комуникация в UNO може да се осъществи с помощта на една команда.
|
Комуникацията, за която се предполагаше, че се осъществява, се осъществява със скорост BAUD от 9600 бита в секунда. Така че за UNO да установи такава скорост на предаване и да започне серийна комуникация, ние използваме командата „Serial.begin (9600);“. Тук 9600 е скорост на предаване и е променлива.
Сега всички остават, ако за получаване на данни, една информация е получена от ООН, тя ще бъде на разположение за вземане. Тези данни се събират чрез команда „Получени данни = Serial.read ();“. С тази команда серийните данни се отвеждат към 'получени данни' с име цяло число.
Както е показано във верига, бутон, свързан от страната на предавателя, когато този бутон при натискане, осем битови данни се изпращат от ПРЕДАВАТЕЛ (ATMEGA8) и тези данни се получават от ПРИЕМНИК (ARDUINO UNO). При успешно получаване на тези данни той включва включения и изключени светодиоди, свързани към него, за да покаже успешен трансфер на данни между два контролера.
Чрез този UART комуникацията между контролера ATMEGA8 и ARDUINO UNO се установява успешно.