AVR налагоджувальний висновок через UART (RS232 debug), avr, programming
У статті розповідається, як швидко вбудувати у firmware AVR налагоджувальний висновок на текстову консоль терміналу.
Небагато програмістів (особливо початківців) мають у своєму розпорядженні апаратний відладчик (типуJTAGICE mkII абоAVR Dragon ). Тому світлодіод, осцилограф та текстовий висновок залишаються актуальним засобом налагодження та пошуку помилок. Однак навіть за наявності апаратного відладчика часто потрібно в реальному часі бачити, що робить код, що виконується. Для цього в консоль терміналу виводять так звану налагоджувальну інформацію - дані, які має побачити програміст.

Найпростіший спосіб реалізації такого висновку - використання апаратного UART , який є майже у всіх моделях AVR. Висновок виходить швидкий і нересурсоемкий (тобто не займає багато процесорного часу ядра AVR). Для виведення через UART для AVR є вже готові підпрограми та макроси, один з них – модульoddebug, який є у складі бібліотекиV-USB.
[Використання модуля oddebug.c для налагодження ]
1. Завантажте бібліотеку V-USB [1].
2. У папці vusb-20120109\usbdrv візьміть файли usbportability.h, oddebug.c та oddebug.h, та скопіюйте їх у папку свого проекту.
3. Додайте до проекту компіляцію модуля oddebug.c.
Якщо у Вас проект AVR GCC, то додайте модуль oddebug.c до списку компіляції та лінківки makefile:
SRC = $(TARGET).c \ Descriptors.c \ oddebug.c \ $(LUFA_SRC_USB) \ $(LUFA_SRC_USBCLASS)
Якщо у Вас є проект IAR, то додайте модуль oddebug.c в дерево модулів проекту.
4. Додайте до модулів, де потрібно використовувати налагоджувальний висновок, підключення заголовка oddebug.h (директивою include).
#include "GenericHID.h" #include #include "oddebug.h" /* Макроси для налагоджувального виведення через UART */
5. Задайте глобальне макровизначення DEBUG_LEVEL, що не дорівнює 0.
Якщо у Вас проект AVR GCC, найкраще це зробити в makefile проекту:
DEBUG_LEVEL = 1 .. CDEFS += -DDEBUG_LEVEL=$(DEBUG_LEVEL)
Якщо у Вас проект IAR, то додайте визначення DEBUG_LEVEL у властивостях проекту (Options -> Compiler -> Preprocessor -> Defined symbols).
Модуль oddebug написаний таким чином, що значення макровизначення DEBUG_LEVEL може бути або 0, або 1, або 2:DEBUG_LEVEL=0 налагодження через UART не активне, код oddebug не компілюється, і макроси DBG1 і DBG2 не працюють (хоча вони можуть бути присутніми в коді користувача).DEBUG_LEVEL=1 працює тільки макрос DBG1, DBG2 не працює (хоча DBG2 може зустрічатися в коді користувача). працює і DBG1, і DBG2.
6. Перед головним циклом main зробіть виклик odDebugInit().
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); odDebugInit(); DBG1(0x00, 0, 0); /* висновок debug: запуск циклу main */ sei();
Макрос odDebugInit налаштовує UART на швидкість 19200 біт/сек, 8 біт даних, один стоп-біт без парності (19200 baud rate, 8 bit data, 1 stop bit, no parity) - майте це на увазі при підключенні до порту налагодження.
u16 var16; var16 = 0x1234; DBG1(0x01, &var16, 2); // виведеться "01: 34 12" - HEX значення двох байт змінної var16

Як Ви вже здогадалися, використання макросів DBG1 і DBG2 дозволяє вести налагодження на 2 рівнях, залежно від значення DEBUG_LEVEL. Якщо DEBUG_LEVEL = 2, то висновок може бути максимально докладним, оскільки виводитимуть інфу і DBG1, і DBG2. Якщо DEBUG_LEVEL = 1, то виведення налагодження можебути менше (виводиться тільки макрос DBG1).
[Усунення проблем ]
1. oddebug.h:39:5: warning: #warning "Debugging disabled because device has no UART"
Напевно, Ви забули підключити заголовок, який визначає символічні імена Вашого мікроконтролера - oddebug.h не знайшов імена TXEN або TXEN0, підключіть потрібний заголовок перед підключенням oddebug.h. У проекті AVR GCC потрібно підключити файлio.h :
2. Якщо у Вас чіп, у якого немає імен TXEN або TXEN0, але встановлено ім'я TXEN1 або інше (наприклад, так у чіпа AT90USB162), то поправте файл oddebug.h приблизно так:
#if DEBUG_LEVEL > 0 && !(defined TXEN defined TXEN0) /* no UART in device */
#if DEBUG_LEVEL > 0 && !(defined TXEN defined TXEN0 defined TXEN1) /* no UART in device */
#if defined UCR # define ODDBG_UCR UCR #elif defined UCSRB # define ODDBG_UCR UCSRB #elif defined UCSR0B # define ODDBG_UCR UCSR0B #endif
#if defined UCR # define ODDBG_UCR UCR #elif defined UCSRB # define ODDBG_UCR UCSRB #elif defined UCSR0B # define ODDBG_UCR UCSR0B #elif defined UCSR1B # define ODDBG_UCR UCSR1B #endif
Аналогічним чином виправте умови визначення ODDBG_TXEN, ODDBG_UBRR, ODDBG_USR USR, ODDBG_UDRE UDRE, ODDBG_UDR UDR.
Готовий oddebug.h із внесеними виправленнями можете завантажити за посиланням [2].
[Як підключити AVR до комп'ютера ]
Для узгодження рівнів TTL RS232 (0..+5V) та стандартного RS232, який використовувався на PC (+-12V), потрібен спеціальний адаптер, на кшталт [3]. По мінімуму потрібно з'єднати з інверсієюTTL TXD мікроконтролера, що налагоджується, зRXD комп'ютера. Складність тут у необхідності забезпечити інверсію, зробити ізолюючурозв'язку від статичної електрики та одночасно забезпечити двополярний сигнал TXD. На малюнку показаний варіант такого підключення, що забезпечує електричну ізоляцію налаштовуваного пристрою та комп'ютера. Оптрон 6H2017C можна замінити на будь-який інший фототранзисторний. Напруги +12V та -12V можна зняти з коннектора ATX блоку живлення комп'ютера.

[Адаптер USB - TTL RS232 ]
Якщо у Вашому комп'ютері немає порту RS232, то потрібний перехідникUSB - TTL RS232 (його ще називаютьVCP перехідник, Virtual COM port). Його можна зібрати на чіпіFTDI [7], а можна на мікроконтролері AVR. На фото показаний приклад такого адаптера, зробленого з макетної платиAVR-USB162MU [6], і підключеного до макетної плати, що відладжується AVR-USB-MEGA16 (на якій, до речі, можна зробити такий самий адаптер USB - TTL RS232). Вгорі – плата AVR-USB-MEGA16, програма якої налагоджується, а внизу – адаптер USB – TTL RS232, зібраний на платі AVR-USB162.

Сама плата AVR-USB162 фізично вже готовий адаптер, який потрібно просто прошити програмоюUSB CDC (див. [2], папка bin) та підключити трьома проводками - GND, TXD, RXD (проводок TXD використовувати необов'язково, якщо потрібен тільки налагоджувальний висновок):

При першому підключенні до комп'ютера адаптера USB - TTL RS232 операційна система Windows запитатиме драйвер, вкажіть майстру установки обладнання папку driver з архіву [2].

Підключення адаптера USB - TTL RS232 до макетної плати AVR-USB-MEGA16 (мікроконтролер ATmega32A).

Підключення адаптера USB - TTL RS232 до макетної плати AVR-USB162 (мікроконтролер AT90USB162).

Підключення адаптера USB - TTL RS232 до макетної плати AVR-USB162MU (мікроконтролерAT90USB162MU).
[Перехідники USB - TTL RS232 на апаратних чіпах ]
Перехідник USB TTL COM-port (він підключається з одного боку до 6-pin конектора FTDI, а з іншого боку до комп'ютера USB) можна купити готовий. Зазвичай, такий перехідник зроблений за найпростішою схемою на основі чіпа FT232 (компанія FTDI) або CP210x (компанія Silicon Labs). Драйвер для перехідника можна завантажити із сайту відповідної компанії. Хороші перехідники USB до TTL Serial Cable FTDI (або на чіпі CP210x) можна купити на eBay, dealextreme або Aliexpress, є навіть пропозиції з безкоштовною доставкою. При покупці вибирайте 5V версію (іноді бувають версії на 3.3V). Найкращий варіант – коли можна вибрати перемичкою робочі рівні порту TTL RS-232 (3.3V чи 5V). Якщо рівні сигналів на перехіднику USB to TTL і пристрої, що налагоджується, не збігаються, то знадобляться послідовно включені резистори номіналом близько 1...2 кОм.
[Використання класу USB CDC для налагодження ]
Якщо Ваш пристрій на AVR має інтерфейс USB (наприклад, макетні плати AVR-USB-MEGA16 або AVR-USB162), то Ви можете запустити на них програмне забезпечення класу USB CDC, що дає можливість працювати USB-пристрою як віртуальний COM-порт. У цьому випадку перехідник USB – TTL RS232 взагалі не потрібен. Приклад використання віртуального COM-порту для AVR-USB-MEGA16 див. у [4] та для AVR-USB162 у бібліотеці LUFA [5].
[Налагодження коду серед програмування Arduino IDE ]
Перехідник VCP можна також використовувати для налагоджувального виведення та завантаження коду скетчу (у платах Arduino, які не обладнані власним портом VCP), що може допомогти у налагодженні коду програми [2]. В Arduino IDE для цієї мети використовується операторprintln.
[Призначення файлів та папокархіву за посиланням [2] ]
bin готові прошивки перехідника USB - TTL RS232 (проект LUFA-110528\Projects\USBtoSerial), скомпільовані для плат AVR-USB162, AVR-USB162MU (чіп AT90USB162) на частоти кварцу 8 і 16 МГц.doc датошити на мікроконтролери AT90USB162 (макетні плати AVR-USB162, AVR-USB162MU) та ATmega32A (макетна плата AVR-USB-MEGA16). -USB, пакет утиліт розробки WinAVR.driver inf-файл для перехідника USB - TTL RS232, який потрібно надати майстру установки обладнання Windows.LUFA-110528\Projects\USBtoSerial проект USBtoSerial, з якого скомпільовані прошивки перехідника USB - TTL RS232.LUFA-110528\Demos\Device\ClassDriver\GenericHID проект , в якому як приклад використовується налагоджувальний висновок через USART (застосований модуль oddebug). також приклад LUFA-110528\Demos\Device\LowLevel\GenericHID.LUFA-110528\Demos\Device\ClassDriver\GenericHID\oddebug.h виправлений файл oddebug.h, до якого додано підтримку мікроконтролера AT90USB162.
Як компілювати прошивки перехідника USB - TTL RS232 (у Вас має бути встановлений пакет розробки WinAVR):
1. Перейдіть до каталогу LUFA-110528\Projects\USBtoSerial.2. Перевірте в makefile опції MCU, BOARD, F_CPU - вони повинні відповідати використовуваному мікроконтролеру, макетній платі, частоті кварцу.3. Виконайте команду make clean.4. Виконайте команду make, отримайте файл USBtoSerial.hex – це і буде скомпільований файл прошивки для перехідника USB – TTL RS232.
Проект USBtoSerial можна скомпілювати для всіх 8-бітних мікроконтролерів Atmel AVR USB (мікроконтролери Atmel, що мають на борту апаратну)підтримку інтерфейсу USB).
[Часті питання, FAQ ]
120428. Зробив висновок налагоджувальної інформації через перетворювач рівнів, що запрацювало. Однак у PuTTY відображаються ієрогліфи (кракозябри та псевдографіка). Скріншот додаю.

Напевно, десь не збігається кодування, чи не підкажете – що потрібно підправити?
Відповідь : причин може бути дві. Перша - розбіжність кодувань тексту, кодування виводу налагодження і кодування відображення в puTTY. Виправити просто – властивості сесії puTTY -> Window ->Translation. Спробуйте кодуванняWin1251 (Cyrillic) або інші українськомовні кодування. Друга можлива причина (у тому випадку, якщо використовується фізичний UART AVR, що напевно має місце у Вас) – розбіжність параметрів прийому/передачі (швидкість, число біт, кількість стоп-бітів, наявність біта парності). Налаштовується через властивості сесії puTTY -> Connection -> Serial. Параметри повинні відповідати параметрам UART AVR.