Главная » Статьи » Swordfish

USB HID + Visual Basic 6 все просто(часть 2)
USB HID + Visual Basic 6

Разбор программы для PIC

Вместо предисловия:
Продолжим разбор полетов. Как было сказано в аннотации часть вторая посвещается разбору программы для PIC.
После генерации плагином EasyHID у нас есть готовый кусок кода для связки PICа с внешним миром.
Code
{
*****************************************************************************
* Name : USBPROJECT.BAS *
* Author : [select VIEW...EDITOR OPTIONS] *
* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
* : All Rights Reserved *
* Date : 13.01.2010 *
* Version : 1.0 *
* Notes : *
* : *
*****************************************************************************
}

// device and clock...  
Device = 18F4550
Clock = 48
   
// 20Mhz crystal, 48Mhz internal (FS USB)
Config
  PLLDIV = 5,
  CPUDIV = OSC1_PLL2,
  USBDIV = 2,
  FOSC = HSPLL_HS,
  VREGEN = ON

// this is the programs descriptor, generated by EasyHID - you
// can find it in the same folder as this program...
#option USB_DESCRIPTOR = "USBProjectDesc.bas"

// import the HID module...
Include "usbhid.bas"

// an example TX report structure, which contains a message
// string and two word values - the variable TXReport will overlay
// the structure over the USB dual port RAM buffer...
Structure TTXReport
  Message As String
  ValueA As Word
  ValueB As Word
End Structure
Dim TXReport As TTXReport Absolute TXReportRAM  

// an example RX report structure, which contains some bit
// value and a configuration byte - the variable RXReport will overlay
// the structure over the USB dual port RAM buffer...
Structure TRXReport
  LED0 As Bit
  LED1 As Bit
  Configuration As Byte
End Structure  
Dim RXReport As TRXReport Absolute RXReportRAM

// rather than using the above structures, you can read and write data
// directly into a buffer array - choose which method you prefer - examples
// are given in the main program block...
Dim Buffer(32) As Byte

// connect to USB...
Repeat
  Service
Until Attached

// the main program loop shows two different ways in which you can read and
// write HID data. The ReadReport() and WriteReport() techniques are very useful
// when sending and receiving highly structured data (for example, string, bits,  
// words etc). If you just want to send and receive blocks of bytes, then
// ReadArray() and WriteArray() are probably more useful - you can of course
// use both ways!
While true
   
  // this is one way you can read some HID data...
  If DataAvailable Then
  ReadReport
  // the data is now in our RX structure - for example, PORTD.0 = RXReport.LED0 etc...
  // Alternatively, you can access the buffer directly as an array. For example,
  // HID.RXReport(0), HID.RXReport(1)...
  EndIf

  // rather than using ReadReport(), as shown above, you can read data directly  
  // into a buffer array. For example,
  If DataAvailable Then
  ReadArray(Buffer,10)
  EndIf

  // this is one way you can write some HID data...
  TXReport.Message = "Hello World"
  TXReport.ValueA = $1234
  TXReport.ValueB = $0000
  WriteReport
   
  // rather than using WriteReport(), as shown above, you can write data directly
  // into a buffer array. For example,
  Buffer(0) = 0
  Buffer(1) = 1
  WriteArray(Buffer,2)
   
  // if the USB_SERVICE option has been disabled, you MUST poll the USB
  // connection every 1 ms or so to keep it alive and handle pending
  // transactions on the bus...
  Service
Wend

Code
// Устанвка процессора и тактовой частоты
// Ни чего не меняем здесь т.к. 48 это частота внутреннего кварцевого генератора для работы с USB
Device = 18F4550
Clock = 48

// 20Mhz crystal, 48Mhz internal (FS USB) Требуется наличие внешнего кварца на 20MHZ
Config
PLLDIV = 5,
CPUDIV = OSC1_PLL2,
USBDIV = 2,
FOSC = HSPLL_HS,
VREGEN = ON

Типовая схема включения PIC с USB приведена ниже

джампер на схеме выбор режима питания (USB) или внешнее. Вместо кварца, кондюков, резистора можно использовать готовое решение. Резонатор серия ZTT 20MHz. Кондюк между VUSB и землей обязателен. Сколько первый раз промучился думая почему не работает (В нете в некоторых схемах он не указан). Остальная обвязка уже по Вашему усмотрению.
Code
// этот дескриптор генерируется программой EasyHID на основании Ваших задач
// его можно найти в каталоге с программой
#option USB_DESCRIPTOR = "USBProjectDesc.bas"

// импортируем(подключаем) HID модуль(библиотеку)...
Include "usbhid.bas"

здесь то же нечего менять
Code
// Так как SWORDFISH язык стуктурированный здесь прописаны структуры для приема - передачи
//для удобства восприятия и работы с переменными
// Пример отчета структуры передачи, которая содержит сообщение
// строку и два значения слова
Structure TTXReport
  Message As String
  ValueA As Word
  ValueB As Word
End Structure
Dim TXReport As TTXReport Absolute TXReportRAM  

// Пример отчета структуры приема, которая содержит два бита состояния
// и бит конфигурации
Structure TRXReport
  LED0 As Bit
  LED1 As Bit
  Configuration As Byte
End Structure  
Dim RXReport As TRXReport Absolute RXReportRAM

// при использовании вышеуказанных структур могут быть не понятны или сложны
// поэтому есть вариант читать и записывать данные непосредственно в буферной массив
//примеры приведены в основном блоке программы ...
Dim Buffer(32) As Byte //Массив для приема-передачи данных через массив

Code
// connect to USB...(Соединение с USB)
Repeat
  Service
Until Attached

// Основной цикл программы показывает две различных способв, которыми вы можете читать и
// записывать HID данных. ReadReport () и WriteReport () методы являются очень полезными
// при отправке и получении четко структурированных данных (например, строки, биты,
// слова и т.д.). Если вы просто хотите, чтобы отправлять и получать блоки байтов, используйте
// ReadArray () и WriteArray () используется для работы в обоих направлениях!

Code
// Это один из способов которым Вы можете прочитать HID данных ...
  If DataAvailable Then
  ReadReport
// Прием данных в зависимосиот нашей RX структуры - например,
// PORTD.0 = RXReport.LED0
// PORTD.1 = RXReport.LED1
// MyStatus=RXReport.Configuration т.д. ..
// В качестве альтернативы, вы можете получить доступ буфера непосредственно в виде массива. Например,
// HID.RXReport (0), HID.RXReport (1) ...
  EndIf

Code
//Вместо использования ReadReport (), как показано выше, Вы можете читать данные непосредственно
// в буфер массива. Например,
  If DataAvailable Then
  ReadArray(Buffer,10) // считать 10 байт в массив
  EndIf

Это все что касается чтения от PC, теперь займемся записью

Code
// Это один из способов записи HID данных на основе структуры...
  TXReport.Message = "Hello World"
  TXReport.ValueA = $1234
  TXReport.ValueB = $0000
  WriteReport

Code
// Второй способ записи HID с помощью массива...
  Buffer(0) = 0 // заполняем массмв
  Buffer(1) = 1
  WriteArray(Buffer,2) // передаем два бита из массива

Code
// Если параметр USB_SERVICE был отключен, вы должны опрашивать USB
// подключение каждую 1 мс или около того, чтобы сохранить соединение шины
  Service // пусть лучше останется


Ну вроде бы и все.

В архиве лежит типовой кусок кода для SWORDFISH и VisualBasic 5-6.

Архив с тестовым проджектом будет выложен в третьей части статьи
Продолжение следует ......

Испытательная лаборатория электрофизических измерений https://alisveta.by/ — обслуживание и ремонт трансформаторных подстанций, ремонт повреждений кабеля, электрофизические измерения (ЭФИ), внедрение АСКУЭ, высоковольтные испытания оборудования и средств защиты, поверка трансформаторов тока.




Категория: Swordfish | Добавил: DAlexV (14.01.2010)
Просмотров: 11745 | Теги: PICBASIC, HID, USB, бейсик для PIC, Pic Basic, Visual Basic 6, Swordfish, Программирование, процессор | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]