Начало работы в среде разработки Microchip MPLAB X. Создание USB CDC-устройства на базе PIC18F4550

Многие устройства на микроконтроллерах связывались с внешней аппаратурой по последовательному интерфейсу RS-232 (com-порт). Но на современных персональных компьютерах такой интерфейс оказался недоступен. Из-за отсутствия com-порта возникают сложности при разработке новой аппаратуры на микроконтроллерах, а также теряется возможность подключения к компьютеру старых устройств. Можно решить проблему, оснастив устройство интерфейсом USB (UniversalSerialBus). Как вариант можно пойти путём аппаратурного преобразования RS-232 в USB, но для такого метода потребуется дополнительная микросхема и дополнительные компоненты. А возможно передавать сигналы RS-232 на шину USB через аппаратный модуль микроконтроллера, воспользовавшись библиотекой microchip. Достоинство последнего метода в том, что не требуется изменений в имеющемся программном обеспечении для компьютера – компьютерное приложение будет видеть USB как соединение по RS-232. Другое преимущество в том, что не нужно разрабатывать сложный драйвер модуля USB для микроконтроллера, а старую программу просто импортировать на микроконтроллер с интерфейсом USB, добавив к имеющемуся в библиотеке коду свой исходный текст программы.

В этой статье рассматривается создание CDC-устройства, эмулирующего RS-232 через USB. Для прочтения статьи не требуется особых знаний о стандарте USB. Необходимо только знание базовых конструкций языка СИ и умение работать в Windows. Прошивку микроконтроллера можно осуществлять через bootloader, который нужно будет один раз прошить в микроконтроллер при помощи программатора. Затем можно обновлять программу контроллера не используя программатор, что может оказаться удобным при программировании в «полевых» условиях.

Для работы со статьёй нужна будет плата PICDEMFSUSB с контроллером PIC18F4550 или аналогичная, собранная своими руками, по той же схеме, и ряд программ, которые нужно скачать с сайта www.microchip.com и установить на компьютер.

Глава 1. Аппаратура и программы, необходимые для работы

Аппаратура, необходимая для работы: компьютер, плата PICDEMFSUSB на микроконтроллере PIC18F4550 с блоком питания, шнур USB и программатор, например, PICkit3, для того, чтобы один раз прошить bootloader. После этого можно программировать через bootloader.

Программы, которые необходимо скачать с сайта microchip.com:

  • Среда разработки MPLABXIDE (версия 3.20)
  • Библиотека Microchip Library for Application (mla_v2015_08_10)
  • Компилятор языка СИ – XC8 (при написании статьи использована версия 1.36), компилятор MCC18 (я использовал MPLABC18v3.47), который может понадобиться для компиляции HIDbootloader, если у Вас XC8 не версии PRO

Возможно, с сайта oracle.com понадобится Java, необходимая для установки среды разработки (я использовал 8.73).

Если у Вас имеется необходимое аппаратное обеспечение и весь набор программ уже установлен на Ваш компьютер, то можно приступать к работе.

Глава 2. Начало работы после установки программ

После того, как все необходимые программы скачаны и установлены можно приступать к работе. Запустим среду разработки MPLABXIDE. Для того, чтобы открыть готовый проект из библиотеки mla_v2015_08_10 сначала выбираем File->OpenProject (рис. 1):

Рис. 1. Открытие проекта в среде разработки MPLABXIDE.

В появившемся окне нужно будет перейти в каталог проекта из библиотеки и выбрать папку с изображением микросхемы (рис. 2) C:\microchip\mla\v2015_08_10\apps\usb\device\cdc_basic\firmware\MPLAB.X:

Рис. 2. Выбор проекта из библиотеки MLA.

Нажимаем кнопку OpenProject, после этого проект откроется во вкладке Projects (рис. 3).

Рис. 3. Вид проекта из библиотеки MLA.

Поскольку библиотека предназначена для множества разных микроконтроллеров и разных плат, в ней имеется большое количество файлов и папок, которые нам не понадобятся. Чтобы не нарушать имеющихся настроек, которые могут пригодиться, например, после смены платы, продублируем необходимую конфигурацию, затем изменим скопированный проект под наши нужды. Для начала наведём мышку на папку нашего проекта (папка с изображением микросхемы) и щёлкнем правой кнопкой. В появившемся окне настроек проекта выберем самую нижнюю строку – Properties (рис. 4):

Рис. 4. Окно настройки проекта.

После этого появится окно Project Properties, где в поле Categories показаны все возможные конфигурации проекта USBDevice–CDC–Basic из раздела USB библиотеки MLA (рис. 5).

Рис. 5. Окно проектов из раздела USB библиотеки MLA.

Нажмём кнопку Manage Configurations… в появившемся окне найдём нужную нам конфигурацию (PICDEMFSUSB), кликнем по ней левой кнопкой мыши, чтобы выделить и нажмём кнопку Duplicate (рис. 6):

Рис. 6. Дублирование конфигурации PICDEMFSUSB.

В окне Configurations в самом конце списка появится копия нужной нам конфигурации:

Рис. 7. Копия конфигурации PICDEM FS USB.

После этого нажмем кнопку Rename и переименуем конфигурацию по своему усмотрению, например, в CDC_via_Bootloader_PICDEM_FSUSB (рис. 8), затем нажимаем OK:

Рис. 8. Переименование конфигурации.

Теперь нажимаем кнопку SetActive, и наша конфигурация – текущая для проекта, о чём говорит надпись active в скобках (рис. 9):

Рис. 9. Текущая конфигурация проекта.

После того, как наша конфигурация стала активной (текущей) для нашего проекта, изменится вид окошка конфигураций в главном окне среды разработки – здесь будет отображено название нашей новой конфигурации (рис. 10):

Рис. 10. Отображение текущей конфигурации в главном окне.

После того, как проект открыт, можно увидеть в каждой из папок достаточно много подпапок и файлов (рис. 11). Эти папки и файлы могут понадобиться при работе с другими платами, допустим, мы бы захотели работать с платой PICDEM FS USB, но с микроконтроллером PIC18F14K50. Тогда бы мы просто сделали активной конфигурацию PICDEM_FSUSB_K50 и все необходимые корректировки были бы автоматически установлены. Но поскольку мы будем использовать вариант с микроконтроллером PIC18F4550, а остальные нет, то удаляем из нашей копии проекта PICDEM FS USB всё, что не относится к нашей плате. Для удаления файлов из проекта наводим мышь на файл, нажимаем правую кнопку и выбираем Remove From Project (рис. 12). Затем появится окно подтверждения с предупреждением, что файлы с диска не удаляются, а просто становятся невидимыми для среды разработки (рис. 13).

Рис. 11. Структура проекта из библиотеки MLA.

Рис. 12. Удаление папок и файлов из проекта.

Рис. 13. Окно предупреждения об удалении файла из среды разработки.

Я бы порекомендовал выделить несколько папок, кликая мышкой при нажатой клавише Ctrl, удалять по одной папке внимательно читая каждое окно предупреждения (рис. 13), и после удаления каждой группы папок компилировать проект, чтобы убедиться в том, что проект сохраняет работоспособность и не было удалено что-то нужное. После удаления достаточно большого количества ненужных нам файлов и папок получаем необходимую структуру проекта (рис. 14). Также на рис. 14 изображён текст основной части программы, в котором, собственно говоря, и происходит обработка всех функций программ.

Рис. 14. Структура проекта после приведения в порядок.

Глава 3. Компиляция загрузчика

Для работы с проектом нам будет необходим загрузчик. Чтобы получить файл *.hex, который будет содержать нужный нам загрузчик нужно иметь компилятор XC8, работающий в режиме PRO. Режим PRO нужен для того, чтобы исходный текст программы скомпилировался в такой *.hex-файл (прошивку), в котором команды будут занимать адресное пространство размером не более чем 0x1000 байтов для корректной работы самого загрузчика и программ, которые потом будут работать на микроконтроллере. Если Ваш компилятор не в режиме PRO, то скомпилировать исходные тексты программ не удастся, так как будет возникать ошибка, в таком случае можно попробовать перенастроить проект и собрать загрузчик компилятором MPLAB C18.

Проект загрузчика имеется в библиотеке MLA, расположен в папке C:\microchip\mla\v2015_08_10\apps\usb\device\bootloaders\firmware\pic18_non_j.

Файл загрузчика нужно прошить в микроконтроллер при помощи программатора.

В проекте также имеется программа для компьютера, которая находится в папке C:\microchip\mla\v2015_08_10\apps\usb\device\bootloaders\utilities\bin\win.

Программа называется HIDBootloader.exe. Через эту программу можно загружать файлы прошивки *.hex, которые получены пользователем в результате компиляции проекта. Для перевода платы PICDEM FS USB в режим загрузки нужно нажать на кнопку S1 (reset) и, удерживая кнопку S2, отпустить кнопку S1, затем через секунду отпустить S2. Тогда программа на компьютере сможет связаться с платой PICDEM FS USB для загрузки программы пользователя (файла *.hex).

Глава 4. Компиляция программы

После того, как проект избавлен от ненужных файлов, а в микроконтроллер уже помещён загрузчик, можно перейти к настройке проекта для работы с загрузчиком HIDBootloader. Поскольку загрузчик занимает определённое место в памяти команд, то исполняемую программу надо «сдвинуть» так, чтобы не возникало конфликтов при совместной работе. Этот процесс описан в файле Readme Usage Notes for Bootloader with XC8, расположенном в папке C:\microchip\mla\v2015_08_10\apps\usb\device\bootloaders\firmware\pic18_non_j.

Во-первых, нужно установить смещение для программы. Для этого опять наведём мышку на папку нашего проекта (папка с изображением микросхемы) и щёлкнем правой кнопкой. В появившемся окне настроек проекта выберем самую нижнюю строку – Properties (рис. 4). Затем в окне Categories найдём строку Conf: [CDC_via_Bootloader_PICDEM_FSUSB] – это настройки нашей конфигурации, щёлкнем левой кнопкой мыши на этой строке, выделив строку, а затем таким же образом выделим строку XC-8 linker, которая связана с нашей конфигурацией. В выпадающем списке Option categories выбираем Additional options, в графу Code offset вписываем адрес 0x1000, с которого будет начинаться программа (рис. 15) и нажимаем кнопку Apply.

Во-вторых, в выпадающем списке Option categories выбираем Memory model, в графу ROM ranges помещаем запись default,-0-FFF,-1006-1007,-1016-1017, которая настроит компилятор таким образом, что эти адреса памяти не будут заняты командами из нашей программы (рис. 16) и нажимаем кнопку OK.

При таких параметрах программа будет работать только совместно с загрузчиком. Если такую прошивку загрузить через программатор, то работать она уже не будет.

Рис. 15. Установка смещения начала программы.

Рис. 16. Установка защиты адресов в памяти программ.

Теперь можно компилировать программу. Для этого нажимаем кнопку Clean and Built…(рис. 17).

Рис. 17. Компиляция проекта.

Если компиляция прошла успешно, то получаем сообщение в окне Output, которое расположено в самом низу среды разработки (рис. 18). Там же будет указан путь к нашему *.hex-файлу.

Рис. 18. Вид окна Output после успешной компиляции.

После успешной компиляции можно приступать к прошивке микроконтроллера.

Глава 5. Загрузка программы в микроконтроллер

Для начала откроем программу загрузчика на компьютере. Программа находится в папке C:\microchip\mla\v2015_08_10\apps\usb\device\bootloaders\utilities\bin\win\HIDBootloader.exe.

Подключаем плату PICDEM FS USB к блоку питания и к USB порту компьютера. После включения микроконтроллер находится не в режиме загрузки, поэтому на начальном экране программы компьютера будет надпись «Device not detected. Verify device is attached and in firmware update mode» (рис. 19).

Рис. 19. Начальный экран программы для компьютера.

Переводим плату в режим загрузки программы – нажимаем на кнопку S1 (reset) и, удерживая кнопку S2, отпускаем кнопку S1, затем через секунду отпускаем S2. Теперь программа на компьютере сможет связаться с платой PICDEM FS USB для загрузки программы пользователя (рис. 20). Выбираем файл *.hex, который был получен после компиляции проекта пользователя (рис. 21 и 22). Нажав на кнопочку с изображением «стрелка из листа в микросхему» загружаем hex-файл в микроконтроллер (рис. 23). В окне загрузчика на компьютере появляется синяя полоска, которая заполняет полосу по мере загрузки программы. Как только программ загружена, появляется надпись «You may now unplug or reset the device». После появления этой записи, перезагружаем микроконтроллер, нажав на кнопку Reset Device (рис. 24). Плата PICDEM FS USB тут же перезагружается, отсоединяется от компьютерного загрузчика, в окне загрузчика появляется надпись «Device Detached» (рис. 25). Плата переходит на связь с компьютером в режиме CDC-устройства.

Рис. 20. Компьютер связался с PICDEM FS USB.

Рис. 21. Открываем файл *.hex.

Рис. 22. Выбор файла для загрузки в микроконтроллер.

Рис. 23. Загружаем hex-файл в микроконтроллер.

Рис. 24. Перезагружаем микроконтроллер.

Рис. 25. Плата PICDEM FS USB отключилась от программатора.

Глава 6. Работа с платой PICDEM FS USB в режиме CDC

При подключении к компьютеру платы с прошивкой cdc_basic может потребоваться установка драйвера, который расположен в папке: C:\microchip\mla\v2015_08_10\apps\usb\device\cdc_basic\utilities\inf.

Для связи с платой можно воспользоваться терминальной программой, например, Hyper Terminal. Но в составе библиотеки MLA имеется программа для компьютера, которая сама находит плату и может связаться с платой PICDEM FS USB. Эта программа находится в папке: C:\microchip\mla\v2015_08_10\apps\usb\device\cdc_basic\utilities\bin.

Главное окно программы dynamic_cdc_demo.exe показано на рис. 26.

Рис. 26. Главное окно программы dynamic_cdc_demo.exe.

После присоединения платы PICDEM FS USB с прошивкой cdc_basic и обнаружения платы можно передавать данные на плату. Для этого нужно набрать цифры или буквы в поле Send Data. Затем нажать кнопку Send Data. Ответ от платы будет расположен в нижнем поле окна. К каждому набранному символу будет добавляться единица. При нажатии на кнопку S2 будет выводиться сообщение «Button pressed» (рис. 27).

Рис. 27. Пример работы программы dynamic_cdc_demo.exe.

Исходные тексты программы находятся в папке: C:\microchip\mla\v2015_08_10\apps\usb\device\cdc_basic\utilities\src.

Глава 7. Настройка программы cdc_basic

После того, как удалось установить связь между компьютером и платой PICDEM FS USB, можно изменить исходный текст программы cdc_basic для улучшения понимания работы библиотеки. В тексте файла main.c имеется функция main, где, собственно говоря, и описаны все функции программы. Прежде всего, рассмотрим функцию APP_DeviceCDCBasicDemoTasks. Внутри этой функции обрабатывается информация, поступающая из USB. Функция описывается в файле app_device_cdc_basic.c. Если навести мышь на этот файл в проекте, то всплывающая подсказка напомнит его расположение на компьютере:

Рис. 28. Указание на место расположения файла.

В тексте функции в части связанной с обработкой кнопки есть вызов функции стека USB: putrsUSBUSART(buttonMessage).

В документе AN956 эта функция описывается так:

Функция putrsUSBUSART записывает строку данных, включая нулевой символ, в USB. Используйте эту функцию для передачи на хост символьной строки или строки данных, из памяти программ. Синтаксис:

void putrsUSBUSART (const rom char *data)

Входные данные: *data – указатель на строку данных, заканчивающуюся нулём. Если ноль не обнаружен, то только первые 255 байтов данных будут переданы на хост. Выходные данные: нет.

Значит, чтобы передать на компьютер другое сообщение, после нажатия кнопки на плате, во-первых, создадим своё сообщение, а во-вторых укажем этой функции адрес своего сообщения. Например, так:

Первое: в файле app_device_cdc_basic.c в секции VARIABLES находим строку

static char buttonMessage[] = "Button pressed.\r\n";

и добавляем свою строку

static char buttonMessage1[] = "You pressed S2 button.\r\n";

Второе: делаем небольшое изменение в функции putrsUSBUSART(buttonMessage); указывая на новое сообщение putrsUSBUSART(buttonMessage1).

Компилируем, прошиваем микроконтроллер и получаем другой ответ от платы PICDEM FS USB (рис. 29).

Рис. 29. Ответ на нажатие кнопки после изменения текста программы.

Далее в тексте программы попадается такая строка:

numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer));

В документе AN956 функция getsUSBUSART описывается следующим образом:

Функция getsUSBUSART копирует строку байтов, принятых через конечную точку USB – CDC bulk OUT в место, которое указано. Синтаксис:

byte getsUSBUSART(char *buffer, byte len)

Входной параметр *buffer должен указывать на буфер, который больше или равен размеру, указанному в параметре len. В этот буфер будут сохранятся полученные данные. Параметр len задаёт ожидаемое количество байтов. Выходные данные: byte – количество байтов, скопированных в буфер. Предварительные условия: Значение входного аргумента len должно быть равно или меньше размера конечной точки, принимающей данные bulk из USB-хоста в устройство CDC-класса. Это значение для конечной точки задаётся как CDC_BULK_OUT_EP_SIZE в файле usbcfg.h. CDC_BULK_OUT_EP_SIZE должно быть равно 8, 16, 32 или 64 байт.

Следовательно, readBuffer – это буфер приёма данных.

В другой строке описывается процесс прибавления единицы к полученным данным:

writeBuffer[i] = readBuffer[i] + 1;

Откуда мы делаем вывод, что writeBuffer – это буфер, в который записываются передаваемые данные.

А далее попадается функция, передающая данные:

putUSBUSART (writeBuffer,numBytesRead);

Переделав которую, можно передавать другое сообщение при получении символов из USB. Например, дописав сообщение:

static uint8_t Message [] = "Symbol received!\r\n";

и исправив функцию

putUSBUSART(writeBuffer,numBytesRead);

на

putUSBUSART(Message, sizeof (Message));

после каждого принятого символа будем получать сообщение Symbol received! (рис. 30).

Рис. 30. Ответ на получение символа после изменения текста программы.

В проекте также имеются файлы leds.c и adc.c, в которых описывается аппаратное присоединение светодиодов и аналого-цифрового преобразователя, а также некоторые функции для работы с этой аппаратурой.

Рекомендуемая литература

MPLAB_X_IDE_Users_Guide.pdf
PICDEM™ FS USB DEMONSTRATION BOARD USER'S GUIDE
MCHPFSUSB Firmware User`s Guide
MPLAB_XC8_Getting_Started_Guide.pdf
MPLAB_XC8_C_Compiler_User_Guide.pdf
AN956 Migrating Applications to USB from RS-232 UART with Minimal Impact on PC Software
help_mla_usb.pdf
PIC18F2455/2550/4455/4550 Data Sheet

Автор: инж. М.В. Богураев, boguraev@bk.ru.

Тип статьи:
Авторская
Источник:
0
18.02.2016
1215

Комментарии

Нет комментариев. Ваш будет первым!

Будь в курсе новостей!

Раз в неделю мы отправляем дайджест с самыми популярными статьями.