Разделы

В сети

Пользователей: 183
Из них просматривают:
Аналоги: 88. Даташиты: 24. Инструкции: 1. Новости: 24. Остальное: 1. Программы: 1. Профиль пользователя: 7. Теги: 1. Форум: 36.
Участников: 2
Гостей: 181

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

USB HID термометр на ATmega8

Написал proger 05.06.2010 14:50:00 (Просмотров: 34506)

Этот термометр выполнен на основе микроконтроллера ATmega8

и датчика температуры DS18B20



 

Схема USB HID

Программа для контроллера была написанна и отладена в среде Bascom-AVR 1.11.9.8 с использованием USB драйвера swusb.LBX Программа для компьютера была разработана и отладена в среде PureBasic с использованием библиотеки HID_Lib.  Для установки библиотеки, нужно извлечь содержимое архива  в папку со средой PureBasic.

 

Код программы для компьютера

 

#USB_PID=$EF04 : #USB_VID=$AAAA
#NO_Device="Нет связи с термометром"
LoadFont(2,"Arial",22,#PB_Font_Bold)
 
Procedure FindDevice_Timer() ; Периодическая (каждые 400 мс.) проверка доступности термометра
Shared DeviceHandle
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Есть ли требуемое USB HID устройство?
 If Test<>Old_Test
  Old_Test=Test
  If Test
     HID_Lib_CloseDevice(DeviceHandle)
     DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Подключение к USB HID устройству
     SetGadgetText(0,"Термометр подключён")
  Else
     HID_Lib_CloseDevice(DeviceHandle)                   ; Разрыв связи с USB HID устройством
     DeviceHandle=0
     SetGadgetText(0,#NO_Device)
     SetGadgetText(1,"OFF")
  EndIf
 EndIf
EndProcedure
 
Procedure Thread(*x) ; Эта процедура работает в отдельном потоке
 Shared DeviceHandle
 Repeat
   If DeviceHandle   ; Установлена ли связь с USB термометром?
     In.l=0
     HID_Lib_ReadDevice(DeviceHandle, @In, 3) ; Чтение данных из USB термометра
       In=In>>8                               ; Сдвиг вправо на 8 позиций
       Result.f=In/16
       If Result-50           ; Отсеиваем возможные глюки!
         SetGadgetText(1,StrF(Result,1)+" °C")      ; Отображение температуры в окне
       EndIf
   EndIf
   Delay(100)
 ForEver
EndProcedure
 
; Открываем окно
OpenWindow(0,0,0,170,70,"USB_Termo", #PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
 StickyWindow(0,1)
 TextGadget(0,4,4,162,16,#NO_Device,#PB_Text_Center)
 StringGadget(1,16,24,140,40,"OFF",#PB_Text_Center|#PB_String_ReadOnly)
   SetGadgetFont(1,FontID(2))
   SetGadgetColor(1,#PB_Gadget_FrontColor,$DF0000)
FindDevice_Timer()
HideWindow(0,0)
 
AddWindowTimer(0,1,400)    ; Запуск таймера
CreateThread(@Thread(),0)  ; Создание отдельного потока из процедуры Thread()
 
Repeat ; Главный цикл проги Repeat - Until
   Event=WaitWindowEvent() ; Идентификатор события
   If  Event=#PB_Event_Timer
     If EventTimer()=1
       FindDevice_Timer()  ; Вызов процедуры по таймеру, каждые 400 мс.
     EndIf
   EndIf
Until Event=#PB_Event_CloseWindow ; Прерывание главного цикла при закрытии окна

 

 

Скриншот скомпилированой программы

скриншот

 

Для компиляции, требуется версия 4.40 или 4.41 компилятора PureBasic.

Скачать бесплатную демоверсию PureBasic441

 

В папке "Examples", вы найдёте примеры устройств на PIC и AVR контролерах.

Скачать программы с их исходными текстами

10
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

 USB HID термометр на ATmega8
Старший сотрудник
Старший сотрудник
Дата регистрации: 07.01.2010
Откуда:
Сообщений: 124
не в сети
Программировать сам научился без универа.
Это не Си, бейсик самому легко освоить!
Отправитель Нити

Разное

Интересно

Во время ремонта телевизора не ставьте настольную лампу на его корпус.
Она обязательно упадёт и отобьёт горловину кинескопа.

Похожие статьи