PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » Простое USB HID устройство на ATmega8.


Простое USB HID устройство на ATmega8.

Сообщений 1 страница 16 из 16

1

Данный пример, показывает как создать свое USB HID устройство на микроконтроллере.
Этот USB девайс, демонстрирует передачу данных от компьютера, микроконтроллеру и обратно.

Схема устройства.

http://s017.radikal.ru/i440/1409/e1/cde1d9e71d59.gif

Конфигурация контроллера.

http://s002.radikal.ru/i200/1003/30/8136dddeb248.png

Как видно из схемы, USB устройство выполнено на микроконтроллере ATmega8 и содержит минимум деталей - все возложено на микроконтроллер, включая и обработку USB посылок.
При поступлении команды от компьютера, микроконтроллер зажигает или гасит светодиод HL1.
А при нажатии кнопки SB1 в устройстве, микроконтроллер передаст команду через шину USB компьютеру.
Программа для контроллера разработана в среде BASCOM-AVR.
Код программы (компилятор - BASCOM-AVR версии 2.0.7.7 или новее).

Код:
$regfile = "m8def.dat"
$crystal = 12000000

$hwstack = 40
$swstack = 40
$framesize = 50

$include "USB\USB_Config.bas"
$include "USB\Const_swusb-includes.bas"

Dim Buttons_current As Byte
Dim Buttons_last As Byte

Config Portb = Input
Config Portb.0 = Output
Config Portc = Input
Portb.0 = 0

' Разрешаем прерывания.
Enable Interrupts

Do

   Call Usb_refresh()

   ' Получены данные от компьютера.
   If _usb_status._usb_rxc = 1 Then
      If _usb_status._usb_setup = 1 Then
         ' Обработка системных сообщений нулевой конечной точки.
         Call Usb_processsetup(_usb_tx_status(1))
      Elseif _usb_status._usb_endp1 = 1 Then
         ' Пришёл пакет данных из компьютера в 1 конечную точку.
         Toggle _usb_rx_buffer(2)
         Portb = _usb_rx_buffer(2)                          ' Запись данных в порт.
      End If
      ' Признак готовности принять следующий пакет данных.
      _usb_status._usb_rtr = 1
      _usb_status._usb_rxc = 0
   End If


   Buttons_current = Pinc
   Buttons_current = Buttons_current And 1
   If Buttons_current <> Buttons_last Then
     If _usb_tx_status2._usb_txc = 1 Then
       Buttons_last = Buttons_current
       If Buttons_current <> 0 Then
         _usb_tx_buffer2(2) = 40
       Else
         _usb_tx_buffer2(2) = 20
       End If
       Call Usb_send(_usb_tx_status2(1) , 1)       ' Передача в компьютер одного байта.
     End If
   End If


Loop

End

$include "USB\USB_Descriptor.bas"
$include "USB\USB_Subroutines.bas"

Устройство управляется этой программой, написанной на PureBasic.

http://s019.radikal.ru/i615/1308/c9/34dd9814808a.png

Ее исходный текст (компилятор - PureBasic версии 5.20 или новее).

Код:
#USB_PID=1
#USB_VID=$1234
Global W_DeviceHandle=0, R_DeviceHandle=0

XIncludeFile "HID_Module.pbi"

Procedure FindDevice_Timer()
Static Old_Test
Test=HID::TestDevice(#USB_PID, #USB_VID)
 If Test<>Old_Test
  Old_Test=Test
  If Test 
     HID::CloseDevice(W_DeviceHandle)
     HID::CloseDevice(R_DeviceHandle)
     W_DeviceHandle=HID::OpenDevice(#USB_PID, #USB_VID)
     R_DeviceHandle=HID::OpenDevice(#USB_PID, #USB_VID)
     SetGadgetText(1,"Подключено HID устройство")
  Else
     HID::CloseDevice(W_DeviceHandle)
     HID::CloseDevice(R_DeviceHandle)
     W_DeviceHandle=0 : R_DeviceHandle=0
     SetGadgetText(1,"Устройство не обнаруженно ( PID — "+Hex(#USB_PID)+"H;  VID — "+Hex(#USB_VID)+"H) ")
     SetGadgetText(5,"Нет")
  EndIf
 EndIf
EndProcedure

Procedure SendDevice(Command.w)
 If W_DeviceHandle
   HID::WriteDevice(W_DeviceHandle, @Command,2)
 Else
   MessageRequester("", "Нет связи с устройством!", #MB_OK|#MB_ICONWARNING)
 EndIf
EndProcedure

Procedure Thread(*xx)
Dim InBuffer.b(2)
 Repeat
   If R_DeviceHandle
     HID::ReadDevice(R_DeviceHandle, @InBuffer(), 2)
       If InBuffer(1)=20
         SetGadgetText(5,"Да")
       ElseIf InBuffer(1)=40
         SetGadgetText(5,"Нет")
       EndIf
   EndIf
   Delay(10)
 ForEver
EndProcedure

HID::HID_Init()

OpenWindow(0,0,0,320,100,"Пример работы с HID устройством",#PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
   TextGadget(1,10,10,300,16,"Устройство не обнаруженно ( PID — "+Hex(#USB_PID)+"H;  VID — "+Hex(#USB_VID)+"H )",#PB_Text_Center)
   ButtonGadget(2,40,70,120,24,"Зажечь светодиод")
   ButtonGadget(3,170,70,120,24,"Погасить светодиод")
   TextGadget(4,50,40,98,16,"Кнопка нажата?")
   StringGadget(5,140,36,40,20,"Нет",1|#PB_String_ReadOnly)
FindDevice_Timer()
HideWindow(0,0)
SetTimer_(WindowID(0),1,200,@FindDevice_Timer())
CreateThread(@Thread(),0)
Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Gadget
    Select EventGadget()
      Case 2
        SendDevice($AA00)
      Case 3
        SendDevice($5500)
    EndSelect
  EndIf
Until Event=#PB_Event_CloseWindow

HID::HID_End()

Скачать файлы (компьютерная программа, прошивка для микроконтроллера и их исходные тексты).


Дальнейшее развитие темы - USB HID устройство на ATmega32U4, с использованием аппаратного модуля USB. Простое USB HID устройство на ATmega32U4 (Arduino Pro Micro)

USB HID устройство на STM32F103C8T6 Простое USB HID устройство на STM32F103C8T6

0

2

Ты программы сам писал ?

0

3

Да, а что?
Что-то работает не так как должно?

0

4

Дело в том, что для меня это все очень смутно пока. У мменя есть девайс который управляется через LPT, но хочу переделать на USB. Возникает два сложных вопроса:
1- как именно работает USB в самом процессоре(посредством прошивки или есть аппаратная поддержка) и как общатся с ним через USB ?
2- Как написать прошивку и на чем ?
и еще: какое максимальное количество диодов(портов) можно зажечь на этом процессоре ?
P.S. когда-то занимался програмированием ATMELов но на ассемблере

Отредактировано Xodes (25.11.2011 18:24:25)

0

5

Xodes написал(а):

1- как именно работает USB в самом процессоре(посредством прошивки или есть аппаратная поддержка) и как общатся с ним через USB ?

Посмотрите журналы "Радио" № 10 и 11 за 2011 год.
Там есть примеры.

Xodes написал(а):

2- Как написать прошивку и на чем ?

Это зависит от того, какой язык программирования лучше знаете.

Xodes написал(а):

какое максимальное количество диодов(портов) можно зажечь на этом процессоре ?

Оно равно числу свободных ножек МК. Но ведь ничего не мешает взять МК с большим числом ножек или сделать расширитель порта на сдвиговом регистре.

0

6

Часть постов была перенесена в отдельную тему. USB часы

0

7

Здравствуйте подскажите пожалуйста. Я собрал схему, но у меня не получается прошить МК Атмегу. Нужен ли мне программатор?

0

8

Alexander написал(а):

но у меня не получается прошить МК Атмегу. Нужен ли мне программатор?

А как вы прошивали без программатора?

+1

9

Я всё понял просто я думал что можно собрать данный девайс без программатора.

0

10

Как запрограммировать эту микросхему если bascom-avr не видит мой программатор avrisp mkII? Мой программатор видит только avr studio5.

0

11

Так ты не напрямую, прошивку скомпилируй, hex файлик заливай через что угодно.

0

12

Спасибо понял, прошил:)

0

13

Alexander написал(а):

bascom-avr не видит мой программатор avrisp mkII

Разве это не он?

http://s55.radikal.ru/i147/1211/76/05d487884343.png

0

14

Пётр
есть просьба в помощи при программировании ATmega8 для HID устройства. Вы мне помощь а я вам оплату гарантирую.

0

15

А где можно взять файл формы .pbf к этой программе PureBasic ?

0

16

"Нарисовать" форму и переделать код под нее и будет *.pbf файл.

0


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » Простое USB HID устройство на ATmega8.