Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1292
Главная » Статьи » Мои статьи

Как подружить BASCOM AVR с USB? (AN #178 - Software implementation of USB in AVR)
Уважаемый Пётр использовал библиотеку программного обеспечения USB господина Ollopa. Господин Ollopa был так добр, что опубликовал версию LBX своей библиотеки. Хотя библиотека и работает, она не протестирована на все 100% и пока не поддерживается. Со временем появится коммерческая версия (LIB), которая будет поддерживаться. Эта библиотека программного обеспечения USB и образцы кода, можно использовать в USB устройствах для большинства AVR чипов -

Спасибо Петр, за этот замечательный материал!
 
 
 
Программная реализация USB в AVR.
 
 Для программной реализации интерфейса USB, использован драйвер мистера Ollopa http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=7537
USB драйвер (файл swusb.LBX ) нужно скопировать в папку LIB программы BASCOM-AVR. Пример HID джойстика был переделан в демонстрационное устройство и USB термометр.
 
Demo - device.
 
Демонстрационное устройство, позволяет производить двухсторонний обмен произвольной информацией с компьютером. Его схема показана на рисунке.
 
 
Программа имеет довольно большой размер (почти 1000 строк), поэтому будут рассмотрены лишь фрагменты, отвечающие за конфигурацию USB драйвера и обмен информацией. В оригинальной программе был заменён HID дескриптор устройства, типа джойстик, на HID дескриптор нестандартного устройства, позволяющий производить обмен произвольной информацией. Также была активирована вторая конечная точка и настроена на приём информации от компьютера. Именно HID дескриптор определяет тип устройства. От него зависит, будет ли устройство, клавиатурой, мышкой, джойстиком и т. д. В рассматриваемом демонстрационном устройстве, HID дескриптор имеет вид:
 
Data 33 ' Length = 33 bytes
Data &H06 , &H00 , &HFF ' Usage_page(vendor Defined Page 1)
Data &H09 , &H01 ' Usage(vendor Usage 1)
Data &HA1 , &H02 ' Collection(logical)

Data &H09 , &H01 ' Usage(pointer)
Data &H15 , &H00 ' Logical_minimum(0)
Data &H25 , &HFF ' Logical_maximum(255)
Data &H75 , &H08 ' Report_size(8)
Data &H95 , &H01 ' Report_count(1)
Data &H81 , &H02 ' Input(data , Var , Abs)

Data &H09 , &H01 ' Usage(pointer)
Data &H15 , &H00 ' Logical_minimum(0)
Data &H26 , &HFF , 0 ' Logical_maximum(255)
Data &H75 , &H08 ' Report_size(8)
Data &H95 , &H01 ' Report_count(1)
Data &H91 , &H02 ' Output(data , Var , Abs)

Data &HC0 ' End_collection
 
В первой строке, указанно число байт дескриптора. Вторая и третья строка, описывает тип устройства. В нашем случае, это нестандартное HID устройство. Далее следует описание входной и выходной конечных точек. Параметры Logical_minimum и Logical_maximum определяют допустимый интервал значений, хранящийся в буфере конечной точки. Параметр Report_count определяет число байт, передаваемых или принимаемых за одну посылку. Допустимое значение 1…8. В демонстрационном устройстве, передаётся и принимается, только по один байт за посылку.
 
Конфигурация конечных точек производится с помощью этого кода.
 
' Address of optional endpoints (Must be > 0. comment-out to not use)
Const _usb_endp2addr = 1
Const _usb_endp3addr = 2
' Valid types are 0 for control or 3 for interrupt
Const _usb_endp2type = 3
Const _usb_endp3type = 3
' Directions are: 0=Out, 1=In. Ignored by control endpoints
Const _usb_endp2direction = 1
Const _usb_endp3direction = 0
' Polling interval (ms) for interrupt endpoints. Ignored by control endpoints
' (Must be at least 10)

Const _usb_endp2interval = 200
Const _usb_endp3interval = 100
 
Уникальные идентификаторы устройства - Vendor ID and Product ID, задают в строках:
 
Const _usb_vid = &HAAAA
Const _usb_pid = &HEF22
 
Приём и передача данных, выполняются в главном цикле программы.
 
 
Do
     Resetcounter = 0
     ' Check for reset here
     While _usb_pin._usb_dminus = 0
          Incr Resetcounter
          If Resetcounter = 1000 Then
               Call Usb_reset()
          End If
     Wend


     ' Check for received data
     If _usb_status._usb_rxc = 1 Then
          If _usb_status._usb_setup = 1 Then
               ' Process a setup packet/Control message
               Call Usb_processsetup(_usb_tx_status)
          Elseif _usb_status._usb_endp1 = 1 Then
               ' Input data endpoints
               Portb = _usb_rx_buffer(2) ' Copy USB data in Portb
          End If
          ' Reset the RXC bit and set the RTR bit (ready to receive a new packet)
          _usb_status._usb_rtr = 1
          _usb_status._usb_rxc = 0
     End If

     Buttons_current = Pinc
     Buttons_current = Buttons_current And 3
     If Buttons_current <> Buttons_last Then 
     ' Queue data to be sent on endpoint 2 (HID report)
          If _usb_tx_status2._usb_txc = 1 Then
               Buttons_last = Buttons_current
               _usb_tx_buffer2(2) = Buttons_current
              Call Usb_send(_usb_tx_status2 , 1) ' Send data in PC
          End If
     End If

Loop


End При поступлении новых данных от компьютера, будет установлен флаг _usb_endp1 в переменной _usb_status. Поступившие данные хранятся в массиве _usb_rx_buffer. В демонстрационной программе, за одну посылку, принимается только один байт данных, что описано в HID репорте. Этот байт копируется в Portb микроконтроллера. Для передачи данных из микроконтроллера в компьютер, данные записываются в массив _usb_tx_buffer2. После этого вызывается функция Usb_send. Её второй аргумент – число передаваемых байт. Но перед этим, проверяется готовность USB драйвера к передаче данных, путём проверки флага _usb_txc, переменной _usb_tx_status2. Для работы с демонстрационным устройством, была разработана компьютерная программа HID_Example_IO.exe
 
 
 USB thermometer.
 
 
USB термометр создан на основе кода демонстрационного устройства. Основные изменения были внесены в главный цикл программы.
 
Config 1wire = Portc.5
Dim 1wire_array(9) As Byte
Dim W_1wire As Word
Dim Dsid1(8) As Byte
Dim Flaginputtermo As Byte

Dim Resetcounter As Word
Dim Idlemode As Byte

Enable Interrupts

W_1wire = 1wirecount()
Dsid1(1) = 1wsearchfirst()
1wreset ' reset the bus
1wwrite &HCC' skip rom
1wwrite &H44 ' Convert T
Timer1= 0
Flaginputtermo = 0

Do
     Resetcounter = 0

     'Check for reset here
     While _usb_pin._usb_dminus= 0
          Incr Resetcounter
          If Resetcounter = 1000 Then
               Call Usb_reset()
          End If
     Wend


     'Check for received data
     If _usb_status._usb_rxc = 1 Then
          If _usb_status._usb_setup = 1 Then
               'Process a setup packet/Control message
               Call Usb_processsetup(_usb_tx_status)
          Elseif _usb_status._usb_endp1 = 1 Then
               ' Input data endpoints
          End If
          'Reset the RXC bit and set the RTR bit (ready to receive a new packet)
         _usb_status._usb_rtr = 1
         _usb_status._usb_rxc = 0
     End If

     If Flaginputtermo = 1 Then
               Flaginputtermo =
               1wverify Dsid1(1)
               1wwrite &HBE
               1wire_array(1) = 1wread(9)
               1wreset ' reset the bus
               1wwrite &HCC ' skip rom
               1wwrite &H44 ' Convert T
          'Queue data to be sent on endpoint 2 (HID report)
          If _usb_tx_status2._usb_txc = 1 Then
               _usb_tx_buffer2(2) = 1wire_array(1)
               _usb_tx_buffer2(3) = 1wire_Array(2)
              Call Usb_send(_usb_tx_status2 , 2) ' Send data (2 bytes) in PC
          End If
     End If

Loop

End
 
Из главного цикла удалён код, принимающий данные от компьютера и добавлен код, опроса датчика DS18B20. Данные из датчика нужно считывать не чаще одного раза за 750 миллисекунд. Чтобы не задерживать работу главного цикла на такой относительно большой промежуток времени, была использована переменная Flaginputtermo как флаг. В прерывании от таймера Timer1, происходящем примерно один раз в секунду, в переменную записывается число 1, что служит признаком необходимости чтения данных из датчика. По окончанию чтения, данные копируются из массива 1wire_array в массив _usb_tx_buffer2 и вызывается функция Usb_send, передающая данные (2 байта) через шину USB в компьютер. В HID репорт было внесено небольшое изменение (выделено зелёным цветом), связанное с необходимостью передачи 2 байт за посылку.
 
Data 33 ' Length = 33 bytes
Data &H06 , &H00 , &HFF ' Usage_page(vendor Defined Page 1)
Data &H09 , &H01 ' Usage(vendor Usage 1)
Data &HA1 , &H02 ' Collection(logical)

Data &H09 , &H01 ' Usage(pointer)
Data &H15 , &H00 ' Logical_minimum(0)
Data &H25 , &HFF ' Logical_maximum(255)
Data &H75 , &H08 ' Report_size(8)
Data &H95 , &H02 ' Report_count(2)
Data &H81 , &H02 ' Input(data , Var , Abs)

Data &H09 , &H01 ' Usage(pointer)
Data &H15 , &H00 ' Logical_minimum(0)
Data &H26 , &HFF , 0 ' Logical_maximum(255)
Data &H75 , &H08 ' Report_size(8)
Data &H95 , &H01 ' Report_count(1)
Data &H91 , &H02 ' Output(data , Var , Abs)

Data &HC0 ' End_collection
 
Для отображения температуры на экране компьютера, была разработана программа USB_thermometer.exe
 
 
Программы для компьютера были созданы в среде PureBasic http://purebasic.com/
Для их компиляции, нужен PureBasic, версии 4.40 или 4.41.
Бесплатную демо-версию, которого, можно скачать с официального сайта http://purebasic.com/download.php
Для безошибочной компиляции, нужно установить библиотеку HID_Lib (файл "HID_Lib for PureBasic 4.41.exe" в архиве).
 
 

Подборка статей по виртуальному USB Oloppa:

  • USB барометр
  • USB термометр на ATmega8 и PIC18F4550
  • USB часы
  • USB джойстик на ATmega8
  • Простое USB HID устройство на ATmega8
  • СТРЕЛОЧНЫЙ ИНДИКАТОР ЗАГРУЗКИ ЦП И ОПЕРАТИВНОЙ ПАМЯТИ ПК
  • ОРГАНИЗУЕМ ПРОГРАММНЫЙ USB В BASCOM-AVR НА ПРИМЕРЕ USB-ВОЛЬТМЕТРА. ЧАСТЬ 1-3
  • AVR-Software-USB mit Bascom     
 
Удачного вам ЮСБ-ирования!!!
 
Категория: Мои статьи | Добавил: bascom (27.05.2010)
Просмотров: 27607 | Комментарии: 18
Всего комментариев: 181 2 »
18 Ev3658  
0
У меня не заработал через USB хаб, но через удленитель 5 метров с USB порта ПК определилось как: "USB устройство ввода". В диспетчере устройств "HID-совместимое устройство".
Я прошивал Amega44, фьюзы на кварц 111110 (не критично), оказалось, нужно вместо "0:divide clock by 8 enabled" установить "1:Divide Clock by 8 Disable".

17 clactiort  
0
Добавлю в избранное, спс

15 Андрей  
0
Добавлю, что состояние кнопки при этом отображаеться правильно

14 Андрей  
0
Собрал HID_Example_IO. Винда успешно определила устройство, установила драйвер, но при включении LED1-4 (нажимаю галочки) программа зависает. Сразу скажу - в точке D- относительно земли показывает 2,83V. И еще, в исходный код программы МК внес изменения согласно статье "USB термометр на 2 датчика" - http://bascom.at.ua/publ/usb_termometr_na_2_datchika/1-1-0-33 - поменял в строчке Const _usb_ifaceendpoints = 2 на 1 т.к. у меня Windows7

16 bascom  
0
Посмотрите конструкцию "Кошачий глаз" на этом же сайте. Он работает и в 7 без проблем.

12 Андрей  
0
Здравствуйте!
Использую BASCOM-AVR IDE Version : 1.11.8.1
проект DEMO-device не компилируеться из-за ошибок. В чем может быть причина? ошибки в обеих модулях.
файл HID_Example_IO.bas - строка 655 ошибка 242
файл swusb-includes.bas - ошибка 222 во многих строках.

13 bascom  
0
Компилятор BASCOM-AVM должен быть версии начиная с 1.11.9.3. Важно, чтобы он поддерживал длинные цепочки переименования и вычисления констант.

10 YCP  
0
Доброго времени суток=) Попробовал на 16Мгц не работает... Зато с 12 Мгц все работает=)) господин Оллопа не обманул=)))

11 bascom  
0
Я уже писал, что библиотека заточена под 12 и 15 МГц. Не удивительно, что с 16 произошло фиаско. Надо бы попробовать на 15, да нет нигде поблизости... Кстати, не забываем в исходниках править частоту кварца.

8 YCP  
0
При частоте 12 Мгц... Но мне кажется, что девайс должен запуститься и при частоте 16Мгц, как проверю дам знать...
Прежняя ошибка заключалась в том что были не правильно подключены ножки D+ и D-, после исправления я не опробывал устройства на частоте 16Мгц вполне возможно что девайс должен работать как надо...=)

9 bascom  
0
Посмотрите исходники библиотеки господина Оллопа. Там чётко видно, что пока обрабатуются только 12 и 15 МГц! Но вдруг и на 16 запустится? biggrin

6 YCP  
0
Доброе время суток=) Это снова я... Наконец я довел до ума, демо HID устройство все работает как часы. Спасибо за помощь...

7 bascom  
0
На какой частоте вы запустили девайс?

5 AkTeDRiN  
0
Просто жесть.
Бейсик не перестаёт убивать таланты.
Когда-то видел резидент под MS-DOS скомпиленный на QBASIC, но это на порядок круче...

4 bascom  
0
В ссылке в конце нужно было точку лишнюю убрать. Уже поправил. Насчёт кварца я вас огорчу. В текущей версии библиотеки мистера Оллопа можно использовать или 12 или 15 МГц.

1-10 11-13
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2024