Главная » Статьи » Полезная информация |
Организуем программный USB в Bascom-AVR на примере USB-вольтметра. Часть 1
Давний приятель сайта Aleks8383 прислал мега полезную статью, о том как запустить программный USB на микроконтроллерах AVR. Информация о том как это сделать в Bascom-AVR хоть уже и имеется в интернетах, но тем не менее материал заслуживает всяческих похвал :) описание кода очень детальное и разобрано все по косточкам.
Так как информации для впитывания получилось много (да и подсветка синтаксиса занимает очень много места), пришлось разделить материал на три отдельных статьи. В первых двух будет основательный разбор кода, организующего программный USB со стороны микроконтроллера. В третьей - разбор компьютерной программы для нашего новоиспеченного USB-девайса.
автор Aleks8383: У меня есть небольшой опыт по работе с USB и BascomAVR чем и хочу поделиться.
В первую очередь понадобиться скачать драйвер товарища Ollopa отсюда.
А перевод этой статейки здесь (файл swusb.lbx в папку LIB BascomAVR ,а файл swusb-includes.bas должен быть всегда в папке с проектом).
USB Вольтметр. Для наглядности сделаем вольтметр который будет мерить напряжение и передавать показания в ПК. Управлять пределами можно будет как кнопкой так и из программы, пределы будут к примеру 10,20,200 вольт. Теперь рассмотрим схему нашего вольтметра Разъём USB подключается по схеме с стабилитронами, также подключаем кварц на 12Мгц(т.к шина USB работает на тактовой частоте 12Мгц).Подключаем кнопку для переключения пределов и входов, так же прикрепляем к нашей конструкции индикатор для отображения напряжения и разъём для программирования. Схема готова, перейдём к программе для контроллера. Начало программы стандартное - частота кварца и т.д. там нечего не трогаем. Далее идут строки
Const _usb_dplus = 2
Const _usb_dminus = 4 Первая строка обозначает что ножка D+ USB разъема будет подключена к 2 ножке порта D контроллера (INT0), кстати D+ всегда подключается к INT0 и менять нельзя. А вот вторая строка обозначает что D- будет подключена к 4 ножке порта D, её можно подключить к любой ножке порта D. Далее идут строки
Const _usb_vid = &HAAAC 'устанавливаем VID
Const _usb_pid = &HEF01 'Устанавливаем PID Это уникальные идентификаторы для этого устройства, по ним устройство будет определяться в Windows. Два устройства с одинаковыми Vid и Pid идентификаторами подключены к одному компьютеру подключены не могут быть, это вызовет конфликт в системе. Далее смотрим на строки
'*************************** End Of USB Configuration **************************
Dim Resetcounter As Word 'эти две перемеые Dim Idlemode As Byte 'нетрогать они для драйвера 'В этом месте можно настраивать периферию и порты Dim Flagpered As Byte 'Флаг Для Передачи Данных Dim Nomerkomand As Byte 'Номер Команды Config Portb = Output 'Порт Б Настраиваем На Выход Config Portc = Input 'Порт С Настраиваем На Вход Config Pind.1 = Input 'порт Д 1 на вход ,кнопка Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Настраиваем Ацп 'Настраиваем Индикатор Config Lcdpin=Pin,Rs=Portb.0,E=Portb.1,Db4=Portb.2,Db5=Portb.3,Db6=Portb.4,Db7=Portb.5 Config Lcd = 16 * 2 Cursor Noblink Cursor Off Start Adc 'Включаем АЦП Dim A As Word Dim Vhod As Byte 'переменная для переключения входов Dim Indic As Byte Dim T As Byte Dim Per As Single Dim Vtor As Single Dim Tret As Single Vhod = 1 'Устанавливаем первоначально вход 1 Indic = 1 'первоначальное значение для переменной для индикации Per = 0.009765625 Vtor = 0.01953125 Tret = 0.1953125 Первые две строки не трогаем они для работы драйвера. А далее уже можно настраивать периферию и порты, что собственно сделано. Далее идёт главный цикл, где мы и пишем свою программу ,передаём и принимаем данные .
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 'конец главного цыкла '******************************************************************************* | |
Просмотров: 21456 | Комментарии: 2 | Рейтинг: 5.0/5 |
Всего комментариев: 2 | |||
| |||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки