Главная » Статьи » Полезная информация

Организуем программный USB в Bascom-AVR на примере USB-вольтметра. Часть 2

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

Do                                                          'начало главного цикла
  Resetcounter = 0
    While _usb_pin._usb_dminus = 0
      Incr Resetcounter
      If Resetcounter = 1000 Then
         Call Usb_reset()
      End If
   Wend


    If _usb_status._usb_rxc = 1 Then
      If _usb_status._usb_setup = 1 Then
            Call Usb_processsetup(_usb_tx_status)
       Elseif _usb_status._usb_endp1 = 1 Then
       'В этом месте мы принимаем данные от ПК
If _usb_rx_buffer(2) = 3 Then
             If _usb_rx_buffer(3) = 10 Then
                Vhod = 1
             End If
             If _usb_rx_buffer(3) = 20 Then
                Vhod = 2
             End If
             If _usb_rx_buffer(3) = 200 Then
                Vhod = 3
             End If
            End If
      End If
       _usb_status._usb_rtr = 1
       _usb_status._usb_rxc = 0
   End If


   If Flagpered = 1 Then
       If _usb_tx_status2._usb_txc = 1 Then
       Flagpered = 0
       'здесь мы передаём данные в контроллер
       _usb_tx_buffer2(2) = Nomerkomand
       _usb_tx_buffer2(3) = T
       _usb_tx_buffer2(4) = T
        Nomerkomand = 0                              'обнуляем переменные после передачи
        T = 0
        T = 0
       Call Usb_send(_usb_tx_status2 , 8)
     End If
   End If

'здесь смотря какая переменная vhod с такой ножки и снимаем напряжение  
If Vhod = 1 Then
   A = Getadc(5)
End If
If Vhod = 2 Then
   A = Getadc(4)
End If
If Vhod = 3 Then
   A = Getadc(3)
End If
'проверяем переменную vhod и умножаем на коэф.для отображения на индикаторе
If Vhod = 1 Then                   '10 вольт
  A = Per * A                       'этот выбираем из 10 вольт/1024=0 , 009765625
End If
If Vhod = 2 Then                   '20 вольт
 A = Vtor * A
End If
If Vhod = 3 Then                   '200 вольт
 A = Tret * A
End If

If Vhod = 1 Then        'проверяем переменную vhod и отпровляем данные в ПК
 Flagpered = 1           'это флаг для передачи данных,если он =1 по идёт передача данных
 Nomerkomand = 1
 T = A
End If
If Vhod = 2 Then
 Flagpered = 1
 Nomerkomand = 1
 T = A
End If
If Vhod = 3 Then
 Flagpered = 1
 Nomerkomand = 1
 T = A
End If

If Pind.= 0 Then      'проверяем состояние кнопки и передаём данные в ПК
 Incr Vhod
  If Vhod = 1 Then
   Flagpered = 1
   Nomerkomand = 2
   T = 10
   End If
   If Vhod = 1 Then
   Flagpered = 1
   Nomerkomand = 2
   T = 20
   End If
   If Vhod = 1 Then
   Flagpered = 1
   Nomerkomand = 2
   T = 200
   End If
  If Vhod > 3 Then Vhod = 1
  Waitms 300
End If
Incr Indic
'в програмном USB крайне нежелательно делать задержки иначе может "отвалиться" USB
'хотя я делал и задержки до 1 секунды.
If Indic = 200 Then     'indic переменная для вывода информации на индикатор
Cls
Locate 1 , 4
Lcd "VHOD" ; Vhod
Locate 2 , 4
Lcd A ; "Volt"
Indic = 0
End If
Loop
End                                                         'конец главного цикла
'*******************************************************************************



Строки

Resetcounter = 0
    While _usb_pin._usb_dminus = 0
      Incr Resetcounter
      If Resetcounter = 1000 Then
         Call Usb_reset()
      End If
    Wend

Не трогаем, они нужны для определения подключения к компьютеру.

 Смотрим строки: 

If _usb_status._usb_rxc = 1 Then
      If _usb_status._usb_setup = 1 Then
            Call Usb_processsetup(_usb_tx_status)
       Elseif _usb_status._usb_endp1 = 1 Then
       'В этом месте мы принимаем данные от ПК
 ' _usb_rx_buffer(2)
  End If
       _usb_status._usb_rtr = 1
       _usb_status._usb_rxc = 0
End If

 Здесь usb_rx_buffer(…) это массив в который мы будем принимать данные. Стоит учесть что usb_rx_buffer(2) будет первый байт принимаемого массива, так же как и при передаче массива_usb_tx_buffer2(2), это специфика драйвера.


Смотрим далее

If Flagpered = 1 Then
   If _usb_tx_status2._usb_txc = 1 Then
    Flagpered = 0
      'здесь мы передаём данные в контроллер
      _usb_tx_buffer2(2) = Nomerkomand
      _usb_tx_buffer2(3) = T
      Nomerkomand = 0                        'обнуляем переменные после передачи
      T = 0
      Call Usb_send(_usb_tx_status2 , 8)
    End If
End If

 Здесь переменная Flagpered нужна для передачи данных, если она равна 1, то будем передавать денные. А массив usb_tx_buffer2(…) как раз и передаёт эти данные. 

 Переменная Nomerkomand имеет диапазон от 1 до 2, если она равна 1, то переменная Т передаёт измеренное напряжение, а если она равна 2, то переменная Т передаёт предел измерения т.е. 10,20,200 вольт.
 При приёме данных сначала принимаем первый байт из массива _usb_rx_buffer(...) и если он равен 3, то смотрим второй байт массива и в зависимости от его значения (10,20,200) меняем переменную VHOD на 1,2,3 тем самым переключая пределы измерения.
 Дальше по тексту программы видно что идёт измерение напряжения, далее умножаем на коэффициенты для отображения в «нормальном» виде на индикаторе и передачи в контроллер.  Также выполнена обработка нажатия кнопки, в котором мы соответственно выбираем с какого порта будем измерять и передаём эти данные в компьютер и там же мы выводим номер входа с которого снимаем и собственно измеренное напряжение. А чтобы данные не моргали на индикаторе я ввёл переменную Indic, которая увеличивается при каждом «круге» цикла и когда она сравняется с 200 по данные отобразятся на индикаторе, далее она обнулится и всё повторится заново. 
 Вот с главным циклом принципе и всё, осталось настроить конечные для приёма и передачи данных. Подробнее про них можно прочитать в приведённых ранее ссылках.

'здесь настраиваем конечные точки для USB
...............
Data &H15 , &H00                                            ' Logical_minimum(0)
Data &H26 , &HFF , 0                                        ' Logical_maximum(255)
Data &H95 , &H08                                            ' Report_count(8)
...............

 Параметры Logical_minimum и Logical_maximum определяют допустимый интервал значений, хранящийся в буфере конечной точки. Параметр Report_count определяет число байт, передаваемых или принимаемых за одну посылку. Допустимое значение 1…8. В нашем устройстве, передаётся и принимается 8 байт за посылку.
 

 И последнее:

Data 22 , 22 , _usb_desc_string
Data "A" , "L" , "E" , "K" , "S" , " " , "8" , "3" , "8" , "3"
_usb_proddescriptor:
Data 20 , 20 , _usb_desc_string  'здесь указываем количество букв в заголовке удвоенное на 2
Data "V" , "O" , "L" , "T" , " " , "M" , "E" , "T" , "R"


 Это то что будет отображаться при подключении и в диспетчере в компьютере. Тут в принципе всё понятно, как пишутся буквы. Единственное, что следует сказать, числа указанные в Data должны быть в 2 раза больше количества букв, и всегда являться чётным числом. Пример если написано слово «Пример» то Data будет выглядеть так Data 12 , 12. Пробелы тоже считаются.


в диспетчере устройств:



А так как у нашего вольтметра есть дисплей, измеренные показания выводятся и на него



 С программой для контроллера всё, теперь перейдём к программе для компьютера.

Поехали дальше >>>


Категория: Полезная информация | Добавлено: 14.11.2012
Просмотров: 13425 | Рейтинг: 4.4/7
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: