USB HID термометр на ATmega8
Этот термометр выполнен на основе микроконтроллера ATmega8
и датчика температуры DS18B20
Программа для контроллера была написанна и отладена в среде 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 контролерах.
классик или тини.
автора
чем мотивировалось решение подвесить шину D- к питанию , а шину D+ прижать к земле
а не к примеру наоборот , как это считается хорошим тоном у других схемотехников
просветите чайника )
вывод такой
резистор R2 не нужен
его мегаомность сравнима с током утечки защитных и коммутационных цепей на выводе межки
он ничего не делает
Можно применить другой МК, семейства AVR, перекомпилировав прошивку.
YK-155, я прикреплял к статье архив с файлами, но он куда-то пропал.
Залил временно на дипозит
Вот только один маленький вопрос...
После компиляции проекта для Микроконтроллера в BASCOM *.hex файл имеет размер 10Kb, а в datasheete рамер Flash памяти микрухи atmega8-16Pi всего 8Kb отсюда появляется вопрос, а где взять ещё 2Kb??? или я в чём то ошибаюсь...
Заранее спасибо!!!=)
Это не Си, бейсик самому легко освоить!
резистор R2 не нужен
его мегаомность сравнима с током утечки защитных и коммутационных цепей на выводе межки
он ничего не делает
резистор определяет потенциал на выводе - по этому он необходимю В случае отсутствия будет случайное состояние на выводе или плавающий потенциал