Главная » Статьи » Полезная информация |
В первой части статьи мы остановились на основном цикле программы:
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.1 = 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"
в диспетчере устройств: А так как у нашего вольтметра есть дисплей, измеренные показания выводятся и на него С программой для контроллера всё, теперь перейдём к программе для компьютера. | |
Просмотров: 13425 | Рейтинг: 4.4/7 |
Всего комментариев: 0 | |
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |