Тут ми збираємося встановити зв'язок між мікроконтролером ATmega8 та Arduino Uno. Тут встановлено зв’язок типу UART (Універсальний асинхронний приймач-передавач). Це послідовне спілкування. За допомогою цього послідовного зв'язку дані можуть передаватися між двома контролерами, що є необхідним для різних вбудованих системних програм.
У вбудованих системах ми повинні мати базові знання про системні комунікації, тому для цього ми робимо цей проект. У цьому проекті ми обговоримо базову систему зв'язку та послідовно надішлемо деякі дані від передавача до приймача.
У цьому проекті ATMEGA8 виступає передавачем, а ARDUINO UNO - приймачем. При послідовному зв'язку ми будемо надсилати дані БІТ ЗА БІТОМ, поки байт даних не буде передано повністю. Дані можуть мати розмір 10 біт, але наразі ми дотримуватимемося 8 БІТ.
Потрібні компоненти
Апаратне забезпечення: ATMEGA8, ARDUINO UNO, блок живлення (5 в), AVR-ISP PROGRAMMER, конденсатор 100 мкФ (підключений через блок живлення), резистор 1 кОм (дві частини), світлодіод, кнопка.
Програмне забезпечення: Atmel studio 6.1, progisp або flash magic, ARDUINO NIGHTLY.
Принципова схема та пояснення
Перш ніж ми обговоримо принципову схему та програмування передавача та приймача, нам слід зрозуміти послідовний зв'язок. Тут ATMEGA послідовно надсилає дані до ООН, як було обговорено раніше.
Він має інші способи зв'язку, такі як MASTER SLAVE, JTAG, але для зручності ми вибираємо RS232. Тут ми підключимо PIN-код TXD (передавач) ATMEGA8 до PIN-коду RXD (приймача) ARDUINO UNO
Встановлений обмін даними запрограмований на:
- Вісім бітів даних
- Два стоп-біти
- Відсутній біт перевірки парності
- Швидкість передачі даних 9600 BPS (біт в секунду)
- Асинхронний зв’язок (відсутність розподілу тактової частоти між ATMEGA8 та UNO (обидва мають різні тактові одиниці))
Для встановлення UART між Arduino Uno та ATMEGA8 нам потрібно точно запрограмувати налаштування. Для цього нам потрібно зберегти згадані вище параметри однаковими на обох кінцях. При цьому один виступає в ролі ПЕРЕДАВАЧА, а інший виступає в ролі ПРИЙМАЧА. Ми обговоримо налаштування кожної сторони нижче.
Тепер для інтерфейсу RS232 для сторони ПЕРЕДАТЧИКА (ATMEGA8) повинні бути задоволені такі функції:
1. Для передавача повинен бути включений штифт TXD (функція прийому даних) першого контролера.
2. Оскільки зв’язок є послідовним, нам потрібно знати, коли отримуються дані до побачення, щоб ми могли зупинити програму до отримання повного байта. Це робиться, дозволяючи даним отримувати повне переривання.
3. ДАНІ передаються та приймаються на контролер у 8-бітному режимі. Отже, два символи будуть надіслані контролеру одночасно.
4. У даних, що передаються модулем, немає бітів парності, один біт зупинки.
Вищевказані функції встановлені в регістрах контролерів; ми їх коротко обговоримо:
ТЕМНО-СІРИЙ (UDRE): Цей біт не встановлений під час запуску, але він використовується під час роботи, щоб перевірити, чи передавач готовий до передачі чи ні. Докладніше див. У програмі на TRASMITTER SIDE.
VOILET (TXEN): Цей біт встановлений для активації штифта передавача на БІЧНОМУ СТРАНІ.
ЖОВТИЙ (UCSZ0, UCSZ1 та UCSZ2): Ці три біти використовуються для вибору кількості бітів даних, які ми отримуємо або надсилаємо за один прийом.
Зв'язок між двома SIDES встановлюється як восьмирозрядна. Завдяки поєднанню зв'язку з таблицею ми маємо UCSZ0, UCSZ1 до одиниці, а UCSZ2 до нуля.
ОРАНЖЕВИЙ (UMSEL): Цей біт встановлюється залежно від того, чи система взаємодіє асинхронно (обидва використовують різні годинники) або синхронно (обидва використовують однакові годинники).
Обидві СИСТЕМИ не мають жодного годинника. Оскільки обидва вони використовують власні внутрішні годинники. Отже, нам потрібно встановити для UMSEL значення 0 в обох контролерах.
ЗЕЛЕНИЙ (UPM1, UPM0): Ці два біти регулюються залежно від паритету бітів, який ми використовуємо в спілкуванні.
Дані ATMEGA запрограмовані на передачу даних без паритету, оскільки тривалість передачі даних невелика, ми можемо однозначно очікувати втрати даних або помилок. Тож ми не встановлюємо ніякого паритету тут. Отже, ми встановлюємо для обох UPM1, UPM0 нуль або вони залишаються, оскільки всі біти за замовчуванням дорівнюють 0.
СИНІЙ (USBS): Цей біт використовується для вибору кількості стопових бітів, які ми використовуємо під час зв’язку.
Спілкування встановило, що вона має асинхронний тип, тому для отримання більш точної передачі та прийому даних нам потрібно використовувати два стопових біта, отже, ми встановлюємо USBS на «1» на стороні ПЕРЕДАТЧИКА.
Швидкість передачі даних встановлюється в контролері, вибираючи відповідний UBRRH:
Значення UBRRH вибирається за швидкістю передачі в бодах та частотою кристалів процесора:
Отже, за перехресним посиланням значення UBRR розглядається як '6', і тому швидкість передачі даних встановлюється.
Завдяки цьому ми встановили налаштування на БІК-ПЕРЕДАЧІ; ми зараз поговоримо про ОТРИМАННЯ БОКУ.
Увімкнення послідовного зв'язку в UNO можна здійснити за допомогою однієї команди.
|
Зв'язок, який ми передбачали встановити, здійснюється зі швидкістю передачі даних у 9600 біт в секунду. Тому для того, щоб UNO встановила таку швидкість передачі даних і розпочала послідовний зв’язок, ми використовуємо команду “Serial.begin (9600);”. Тут 9600 - це швидкість передачі даних і є змінною.
Тепер залишилося все, якщо ООН отримає дані, один з них отримає ООН, він буде доступний для взяття. Ці дані отримує команда "полученные данные = Serial.read ();". За допомогою цієї команди послідовні дані переносяться в "отримані дані" з іменем ціле число.
Як показано в схемі кнопка, підключена на стороні передавача, при натисканні цієї кнопки восьмибітові дані передаються ПЕРЕДАТЧИКОМ (ATMEGA8), а ці дані приймаються ПРИЙМАЧОМ (ARDUINO UNO). При успішному отриманні цих даних він перемикає підключений до нього світлодіод і вмикає та вимикає, щоб показати успішну передачу даних між двома контролерами.
Цим UART успішно налагоджено зв’язок між контролером ATMEGA8 та ARDUINO UNO.