Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Прошивка устройства.






В скачанных файлах в папке MCUusb_bootloader найдите файл main.hex – это usb-bootloader, его нужно залить в МК с помощью внешнего программатора. После заливки также нужно правильно установить фьюзы, в окне программатора STK500 должно выглядеть так:

Рисунок 12 прошивка устройства через универсальную плату STK500

Если вы пользуетесь другой программой, то можете просто ввести значения фьюз-битов HIGH и LOW (смотрите на скрин).

После удачной прошивки, можно попробовать прошить устройство через бутлоадер. Как он работает? При включении МК (просто при подаче питания, или после ресета) сразу запускается бутлоадер, он проверяет условие, если оно истинно, то запускается инициализация бутлоадера (комп при этом находит устройство). В качестве условия у нас будет «Логический вход 1 = 0″, то есть, чтобы запустить бутлоадер, нужно замкнуть Логический вход 1 на GND и нажать на устройстве кнопку RESET, в диспетчере устройство должно появиться новое HID устройство, так же не требующее драйверов:

 

Рисунок 13 отображение устройства в диспетчере устройств

 

Такс, теперь в папке MCUUSB_Controldefault запускаем файл boot.bat, должно выскочить окошко, в котором будут бегать циферки:

 

Рисунок 14 рабочее окно boot.bat

Если окно сразу же закрылось, тогда вы сделали что то не правильно. Если же все ок, тогда внешний программатор для этого устройства Вам уже не понадобится. Теперь можете отключить Логический вход 1 от GND. И на всякий случай, нажмите RESET. В диспетчере устройств так же должно появиться HID устройство (комп напишет что найдено новое). Убедитесь, что в диспетчере появилось именно это устройство.

Рисунок 15 Окно свойств HID-совместимого устройства

 

Хост – это то, что будет управлять устройством, в нашем случае – компьютер. Управление устройством с ПК я опишу более подробно.

Для программистов Delphi написать прогу управления HIDом не составит проблем так как в инете куча инфы. А вот программистам C++ Builder не все так сладко, но, как оказалось, не так все и плохо))). В инете я нарыл библиотеку hidlibrary.h, вот с ее помощью мы будет работать с HID устройством.

Скачайте исходники и запустите USB Control.cbproj (C++ Builder 2010).

В файле hidlibrary.h в самом верху есть строка

  const char idstring[] = “vid_0010& pid_0001”;

Да-да, это те же самые ID, которые мы указывали в usbconfig.h. Если будете менять VID and PID, то не забывайте отредактировать эту строку. Кроме данной строки в файле hidlibrary.h нам больше ничего редактировать не нужно, можете его закрыть.

Открываем main.cpp, вверху указан относительный адрес к файлу usbconfig.h», это нужно чтобы библиотека HID знала имя вендора и продукта.

  #include “../MCU/USB_Control/usbdrv/usbconfig.h”

Создадим форму, на форме будет один CheckListBox для управления логическими выходами, 2 ScrollBar для управления ШИМ каналами, один ListBox для отображения логических входов, один Label для отображения состояния АЦП и один таймер. Должно получиться вот такое:

 

Рисунок 16 рабочее окно программы для создания формы CheckListBox

Переименуйте СкрулБары в ScrollBar_PWM1 и ScrollBar_PWM2, в их свойствах установите Max=1023.

Создадим структуру

  #pragma pack (push, 1) struct status_t{ unsigned char logical_outputs; unsigned char logical_inputs; unsigned char ADC_DATA; unsigned short int PWM1; unsigned short int PWM2; }; struct status_t DeviceStatus; #pragma pack (pop)

#pragma pack нужна чтобы компилятор не выравнивал структуру. В logical_outputs хранятся состояние всех логических выходов, в побитном режиме, то есть, первый бит хранит состояние первого выхода, второй – второго и так до седьмого. Аналогично logical_inputs хранит состояние логических входов. В ADC_DATA хранится состояние АЦП, минимальное значение 0, максимальное – 255. В PWM1 хранится состояние первого ШИМ выхода (плавная регулировка напряжения), в PWM2 – состояние второго, минимальное значение 0, максимальное – 1023.

В программе ПК нужно считать с микроконтроллера эту структуру, ну и далее обработать принятые данные. Чтобы установить новые значения выходов, нужно сначала записать в структуру новые значения, а потом отправить измененную структуру на микроконтроллер. При установке новых значений нужно редактировать только первый, 4 и 5 элементы, редактирование остальных двух не даст никакого эффекта.

Далее создаем экземпляр класса

  HIDLibrary < status_t> hid;

И добавляем функцию connect().

  int connect(void) { int i, n, res=0; string exampleDeviceName = “”;   exampleDeviceName += vendorName; exampleDeviceName += “ “; exampleDeviceName += productName;   n = hid.EnumerateHIDDevices();   for (i=0; i< n; i++) // ищем наше устройство { hid.Connect(i);   // GetConnectedDeviceName() возвращает string, // где через пробел указаны vendor и product Name. // Сравниваем, если совпало – значить устройство наше if (hid.GetConnectedDeviceName() == exampleDeviceName) { res = 1; break; } } return res; }

Теперь данные с HID-устройства можно запросить с помощью функции hid.ReceiveData, указав в качестве параметра указатель на структуру, только перед запросом нужно проверить, подключено ли устройство:

  if (connect()) hid.ReceiveData(& DeviceStatus);

Аналогично можно передать данные в устройство:

  if (connect()) hid.SendData(& DeviceStatus);

А теперь давайте допишем нашу программу (или просто скачайте исходники, там все готовое))).

Добавьте где нить в коде (лучше сразу после структуры) эти строки:

  char vendorName[] = {USB_CFG_VENDOR_NAME, 0}; char productName[] = {USB_CFG_DEVICE_NAME, 0};

Так как нужно будет работать с отдельными битами, объявим несколько дефайнов:

  #define sbi(reg, bit) reg |= (1< < bit) // установить бит #define cbi(reg, bit) reg & = ~(1< < bit) // сбросить бит #define ibi(reg, bit) reg ^= (1< < bit) // инвентировать бит #define CheckBit(reg, bit) (reg& (1< < bit)) // проверить бит

В свойствах таймера укажите Enabled = True, Interval = 500. Щелкните по нем дважды и в обработчике напишите

  if (! connect()) return; // Выходим, если устройство не подключено   hid.ReceiveData(& DeviceStatus); // Читаем данные с устройства   for (char i = 0; i < 7; i++) CheckListBox_LogOuts-> Checked[i] = CheckBit(DeviceStatus.logical_outputs, i);   ScrollBar_PWM1-> Position = DeviceStatus.PWM1; ScrollBar_PWM2-> Position = DeviceStatus.PWM2;   ListBox_LogInputs-> Clear(); for (char i = 0; i < 7; i++) ListBox_LogInputs-> Items-> Add(“ Лог. Вход “+IntToStr(i+1)+” = “ +BoolToStr(CheckBit(DeviceStatus.logical_inputs, i))); Label_ADC-> Caption = DeviceStatus.ADC_DATA;

Думаю, тут все понятно и объяснений не требует.

Кликните дважды по CheckListBox, в обработчике напишите

  for (char i = 0; i < 7; i++) { if (CheckListBox_LogOuts-> Checked[i]) sbi(DeviceStatus.logical_outputs, i); else cbi(DeviceStatus.logical_outputs, i); } if (connect()) hid.SendData(& DeviceStatus);

Тут копируется состояние чекбоксов в элемент структуры, после чего структура отправляется в МК.

Осталось сделать управление ШИМ выходами. Кликните один раз по ScrollBar_PWM1, зажмите Shift и выбирите ScrollBar_PWM2, короче нужна выделить 2 скрулбара, слева откройте события (Events) и в OnChange укажите тот же обработчик, что и в CheckListBox, а в обработчике пред последней строкой добавьте:

  DeviceStatus.PWM1 = ScrollBar_PWM1-> Position; DeviceStatus.PWM2 = ScrollBar_PWM2-> Position;

Все, можно компилировать!


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал