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

Организуем программный 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.= 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.= 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                                                         'конец главного цыкла
'*******************************************************************************



 Читать далее >>>


Категория: Полезная информация | Добавлено: 14.11.2012
Просмотров: 15178 | Комментарии: 2 | Рейтинг: 5.0/5
Всего комментариев: 2
2 exersizze   (20.10.2013 17:36)
Да, скорей всего так и есть. Иначе каждое из условий будет выполняться одновременно.

1 Ev3658   (20.10.2013 14:23)
Я ещё чайник, начал в код сматриваться,
====================================== не могу понять это: ===========

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
=======================================================
===================== Может быть так?: ===============

If Pind.1 = 0 Then 'проверяем состояние кнопки и передаём данные в ПК
Incr Vhod
If Vhod = 1 Then
Flagpered = 1
Nomerkomand = 2
T = 10
End If
If Vhod = 2 Then
Flagpered = 1
Nomerkomand = 2
T = 20
End If
If Vhod = 3 Then
Flagpered = 1
Nomerkomand = 2
T = 200
End If
If Vhod > 3 Then Vhod = 0
Waitms 300
End If

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Направлятор
21.07.2017 - алексей1984:
у меня тоже модуль шлет 10 строк, лишние никак не могу отключить, не подскажите ...
Направлятор
21.07.2017 - алексей1984:
Помогите пожалуйста, собрал сей девайс, при включении проходит заставка, выходит...
Бесконтактный датчик температуры MLX90614
02.07.2017 - exersizze:
Да, заработает. Только программу перекомпилировать под 328 камень.
Управляем микроконтроллером с ПК по UART
23.06.2017 - belcof:
Привет.
Как настроить фьюзы от внутреннего и внешнего кварца для SinaProg...
Бесконтактный датчик температуры MLX90614
22.06.2017 - TSL:
Приветствую. Как я понял, собираем по схеме выше, и всё должно работать.
...
Устройство имитации звука светового меча
18.06.2017 - Dron_S:
Всем привет задержку звука при включении удалось победить))) вот что получилось ...
Регулятор температуры и влажности
17.06.2017 - max:
Не за что.
Регулятор температуры и влажности
17.06.2017 - alex222:
max
Спасибо вам огромное!!!
Регулятор температуры и влажности
17.06.2017 - max:
Вот: http://rgho.st/6HFCxxVgG