Інтерфейси. Протоколи

Програмна реалізація - передавач.

На цьому уроці ми з вами уяснимо для себе, що таке інтерфейси та протоколи. Дізнаємося, які варіанти реалізації доступні нам. Спробуємо реалізувати обмін між двома МК.

Для управління машинкою нам понадобиться система радіоуправління. Состоює вона з пульта управління та відповідної частини, встановленої безпосередньо в самій машинці.

Пульт управління включає в себе: органи управління, кодер (в вигляді нашого МК) та передавач.

В машинці встановлений: приймач, декодер (нам доведеться використовувати додатковий МК), драйвери приводів та виконавчі механізми.

Фізична зв'язок між кодером та декодером здійснюється за допомогою інтерфейсу зв'язку. Дані передаються за заздалегідь встановленими правилами, які визначаються протоколом обміну.

Для прикладу: всі ми спілкуємося, створюючи звукові хвилі голосовими зв'язками – це наш інтерфейс. Звуки складаються в слова, ми з вами говоримо українською мовою, американці англійською, французи французькою. Мова - це наш протокол обміну. Отже, що володіючи одним і тим же інтерфейсом, у людей не збігаються протоколи обміну. Тому то українці не розуміють американців, поки не вивчать їх «протокол»!!!

Які інтерфейси нам доступні?

  • вивід даних за допомогою лінії порту з програмним формуванням пакета даних;
  • передача даних з використанням апаратних інтерфейсів, які є в МК, таких, наприклад, як UART, I2C, SPI.

Щодо протоколів… є кілька варіантів реалізації:

  • програмне формування імпульсів з тривалістю, що відповідає передаваним даним;
  • програмне формування цифрової, байт орієнтованої послідовності;
  • передача даних за допомогою використання апаратних інтерфейсів, що є в МК, таких, наприклад, як UART, I2C, SPI.

Спробуємо розібратися з програмною реалізацією... На початку ми повинні з'ясувати, які дані ми будемо передавати, для цього визначимо склад нашої машинки:

По-перше двигун приводу, по-друге кермова система. Що можна ще додати??? 

Фари, клаксон?? В них я не бачу сенсу.

Коробка передач… її у нас немає.

Адаптивна система управління кліренсом – цікава тема! Але підвіска у нас «не тієї системи»…

Контроль напруги батареї… можливо!

Отже, для управління вище перерахованим нам знадобиться:

  1. Один імпульс для передачі потужності двигуна від ручки газу;
  2. Один імпульс для передачі напрямку руху;
  3. Один імпульс для передачі напрямку повороту: прямо, вліво, вправо.

Пакет даних виглядатиме наступним чином:

Стартова пауза в 300 відліків, для ідентифікації початку пакета. Три імпульси, тривалістю в 255 відліків кожен. Плюс дві паузи, щоб розмежувати імпульси. Всього посилка займає 1165 відліків загальною тривалістю в 26,6мс.

Розглянемо, як відбувається формування посилки.

По-перше АЦП. Ми налаштували його проводити вимірювання в автоматичному режимі. Ніяких дій з запуску/перезапуску нам виконувати не потрібно. 

Опрос клавіш заднього ходу та повороту відбувається наступним чином. Для обробки натискань введені додаткові змінні…

direction_of_motion	//Напрямок руху
direction_of_rotation   //Напрямок повороту

В основному циклі програми відбувається опитування клавіш та кодування поточного стану…

//Напрямок руху
if (!(PIND & (1 << PD0))) direction_of_motion = 255;
else direction_of_motion = 128; 

//Напрямок повороту
if (!(PIND & (1 << PD1))) direction_of_rotation = 3; //Вліво
if (!(PIND & (1 << PD2))) direction_of_rotation = 255; //Вправо
if (PIND & (1 << PD1) && PIND & (1 << PD2)) direction_of_rotation = 127; //Прямо

Формування основної посилки даних відбувається в перериванні. Працює це наступним чином. Для проведення відліків введена змінна…

counter_cycles //Лічильник тактів посилки

…кожного разу, коли лічильник переповнюється, змінна інкрементується та обнуляється при досягненні 1165 відліків…

counter_cycles++;
if (counter_cycles = 1165) counter_cycles = 0;

Виходячи з поточного положення по осі X, імпульси починаються з міток 300, 605, 910. Перевіряючи значення змінної counter_cycles на збіги з міткою, програмно формуються фронти імпульсів…

if (counter_cycles == 300) PORTB |= (1 << PB0); //Потужність двигуна

Точка зрізу обчислюється шляхом складання значення мітки імпульсу та значення переданої змінної (яка лежить в діапазоні 0..255)…

if (counter_cycles == (300 + ADCH + 3)) PORTB &= ~(1 << PB0);

Інші дані передаються аналогічним чином.

Прикріплені файли:

Top