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

Организуем программный 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
Просмотров: 13959 | Комментарии: 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
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.