Урок 10. Робота з UART інтерфейсом

В цьому уроці я розповім про UART інтерфейс в мікроконтролерах AVR і про роботу з ним в BASCOM-AVR. UART — це універсальний асинхронний приймально-передавач. Сам інтерфейс досить поширений і є практично у всіх AVR мікроконтролерах, винятком є лише мікроконтролер Attiny13 та ще деякі. Передача даних здійснюється по біту в рівні проміжки часу, цей проміжок часу задається швидкістю в бодах, ось, наприклад, стандартні швидкості: 4800 бод, 9600 бод, 19200 бод, 38400 бод тощо. Слід також врахувати, що швидкість повинна бути однаковою з обох сторін підключення. До речі, приймач і передавач працюють незалежно. Підключення UART здійснюється по трьом лініям: RXD – прийом, TXD – передача і GND – загальний (мінус). Підключати UART потрібно, так би мовити, "наоборот" RXD до TXD, а TXD до RXD, як на малюнку нижче:

Підключення UART

За допомогою UART  також можна зв'язати мікроконтролер і комп'ютер, але є одна проблема: у UART інтерфейсу логічні рівні 0 і +5 вольт, а в комп'ютері логічні рівні в інтерфейсі RS-232 можуть бути від -25 до -3 вольт і від +3 до +25 вольт. Вирішити цю проблему нам допоможе конвертер рівнів, його можна зібрати на транзисторах, а краще використовувати спеціальну мікросхему MAX232. Ось найпоширеніша схема підключення MAX232:

Конвертер UART рівнів на MAX232

Робота з UART в BASCOM-AVR

Перш за все, перед початком роботи з UART потрібно вказати швидкість в бодах, робиться це командою: $baud = (швидкість). Наприклад: $baud = 9600 .Також не забуваємо вказувати реальну частоту тактового генератора командою $crystal = (швидкість Hz), в іншому випадку швидкість роботи програми не буде співпадати зі швидкістю роботи мікроконтролера і в підсумку прийом або передача даних буде неправильною. Приклад написання команди $crystal на частоту 8МГц: $crystal = 8000000. До речі, має сенс відкрити вікно налаштувань в BASCOM-AVR (Options>Compiler>Communications):

Налаштування зв'язку в BASCOM-AVR

У цьому вікні налаштувань ви можете вказати швидкість роботи UART, тактову частоту тактового генератора і побачити відсоток помилок при вибраній тактовій частоті. Але краще вказувати швидкість і тактову частоту безпосередньо в самій програмі. До речі, відсоток помилок при тактовій частоті в 4МГц дуже малий (0.16%), але все ж є. Якщо ви хочете, щоб відсоток помилок був нульовим, потрібно підібрати таку тактову частоту, яка буде кратна швидкості роботи UART. Наприклад, при тактовій частоті 3.6864 МГц і швидкості роботи UART у 115 200 бод відсоток помилок буде нульовим.

Отже, після вказання тактової частоти і швидкості роботи UART можна приступити до роботи з самим інтерфейсом. Щоб надіслати щось в UART, є команда Print (змінна або текст у лапках), ось приклад її використання: Print "Hello, world!". Окрім тексту в лапках можна виводити й змінні, причому одразу кілька, розділяючи крапкою з комою, наприклад: Print "Weight:" ; a ; "kg" або так Print "Hello," ; "world!" . Також з UART можна і приймати, робиться це командою Input (текст або змінна в лапках для відправки), (змінна, куди записувати отримані дані). Як бачимо, все дуже просто: спочатку пишемо в лапках текст, який передасться в UART, а потім вказуємо змінну, в яку запишуться отримані дані з UART. Ось приклад: Input "Weight:", a

Робота з UART на практиці

Ну а тепер спробуємо "порулити" UART на практиці, спочатку зберемо просту схему:

Схема для роботи з UART

Потім наберемо просту програму, (використовуючи отримані знання) і скомпілюємо її. Ось і вона:

$crystal = 8000000
$baud = 9600

Dim A As Byte

Print "Hello, world!"
Print "Hello http://cxem.net"
Input "Size:" , A
Print "Size=" ; A ; "bytes"

End

А працювати ця програмка буде так: спочатку буде надсилати в UART текст, а потім буде чекати прийому даних (в даному випадку числа), які запишуться в змінну a і пізніше надішле текст разом зі змінною. Для тих, кому лінь компілювати, в файлах до уроку є готова прошивка. Прошиваємо мікроконтролер, підключаємо виводи мікроконтролера RXD, TXD (підключаємо, як я писав вище) і GND до COM порту комп'ютера (через конвертер рівнів) або до USB (USB – UART перехідник), відкриваємо на комп'ютері програму для роботи з COM портами, наприклад: Terminal by Bray, Hyper Terminal або Terminal emulator в BASCOM-AVR, вказуємо COM порт, до якого підключилися, вказуємо швидкість в бодах, дивимося у вікно програми, подаємо живлення на мікроконтролер і радіємо. Необхідно також врахувати, що після прошивки мікроконтролера потрібно встановити фьюз біти на потрібну нам тактову частоту генератора, в даному випадку (для програмки вище) на 8МГц. На 8МГц можна використовувати внутрішній тактовий генератор мікроконтролера і встановити фьюз біти ось так (для PonyProg2000):

Фьюз-біти для PonyProg2000

В залозі:

mc129-6.jpg

На фотографії у мене плата для програмування Attiny2313, USB-UART перехідник і програматор USBtiny. Нижче ви можете подивитися відео, як це працює

Файли для уроку (проект в Proteus, вихідний код, прошивка) додаються

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

Top