PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » USB термометр на ATmega8 и PIC18F4550


USB термометр на ATmega8 и PIC18F4550

Сообщений 1 страница 30 из 47

1

Вот схема HID термометра с интерфейсом USB.

http://s020.radikal.ru/i717/1303/08/f2320ecf1932.gif

Он выполнен на микроконтроллере ATmega8-16PI фирмы Atmel.
В этом контроллере нет встроеного аппаратного модуля USB и связь с компьютером по этому интерфейсу, возложена на программу, написаную в среде Bascom (бейсик).
При прошивке контроллера, нужно выставить такую конфигурацию (прога AvrProg). Если у вас нет возможности прошить микроконтроллер, то есть другой вариант термометра, подключаемый через COM порт компьютера. Термометр на DS18B20 (подключение через COM порт)

http://s002.radikal.ru/i200/1003/30/8136dddeb248.png

Для получения данных из термометра, была разработана программа для компьютера, код которой показан ниже

Код:
 ; Для компиляции программы, нужна библиотека HID_Lib http://pure-basic.narod.ru/libs.html#HID_Lib
#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
 Dim In.c(4)  ; Байтовый массив, используемый как бцфер приёма данных.
 Temp.w       ; Переменная типа Word.
 
 Repeat
   If DeviceHandle   ; Установлена ли связь с USB термометром?
     In(0)=0
     HID_Lib_ReadDevice(DeviceHandle, @In(), 3) ; Чтение данных из USB термометра
       Temp=In(2)
       Temp<<8                                  ; Сдвиг влево на 8 пизиций
       Temp | In(1)
       Result.f=Temp/16
       If Result<150 And Result>-58           ; Отсеиваем возможные глюки!
         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 ; Прерывание главного цикла при закрытии окна

Для компиляции проги, нужна библиотека HID_Lib и компилятор PureBasic, версии 4.40 или выше.

Скрин проги.
http://s004.radikal.ru/i207/1003/b7/97bec50b4475.png

Скачать файлы

0

2

под windows7 работать не хочет... :((((

0

3

IYV написал(а):

под windows7 работать не хочет...

Исправил.
Ссылка в первом посте темы.

0

4

Огромное спасибо!  :cool: все отлично работает!:)

0

5

USB термометр с передачей данных через интернет

http://s011.radikal.ru/i317/1012/03/460b3ebd17b9.png

0

6

Аналогичный USB HID термометр на PIC18F4550

http://s47.radikal.ru/i118/1101/95/f1d77f0d96be.jpg

Программа для контроллера написана в среде mikroBasic 7.0.0.2
Программа для компа не изменилась и её можно найти в первом посте этой темы.

Скачать файлы.

0

7

Немного доработал программу и получится "говорящий термометр". :D
Он произносит вслух текущую температуру, но для правильной работы, должен быть установлен голосовой движок с поддержкой русского, например "Светлана". :idea:

Скачать файлы http://pure-basic.narod.ru/forum_files/ … Volume.rar
Для компиляции нужна библиотека PureTTS.

0

8

Где взять сам термометр!?

0

9

Дмитрии написал(а):

Где взять сам термометр!?

Нужно самому собрать его. Естественно что нужно хоть немного дружить с паяльником.
В этой теме представлено два варианта термометров.
Первый на микроконтроллере ATmega8 и его схема размещена в первом сообщении данной темы.
Второй на микроконтроллере PIC18F4550. Его схема и программа для микроконтроллера находится в шестом сообщении темы.

0

10

задам глупый вопрос где можно преобрести сам микроконтроллер? просто я не встречал специализированных магазинов  :(

0

11

На многих сайтах их можно купить (пришлют почтой).
Достаточно набрать в поисковике ATmega8 купить.

Кроме того, они должны быть почти в любом магазине, торгующем радиодеталями. Может кто-то на рынке продает.

0

12

Доброго времени суток, Пётр!
Можете выложить конфигурацию контроллера для программы PonyProg 2000, с AVRProg есть  проблемы. Заранее благодарен!

0

13

dimosic777 написал(а):

Можете выложить конфигурацию контроллера для программы PonyProg 2000

Никогда не прошивал ATmega8 с помощью пони....
Посмотрите конфигурацию контроллера в журнале "Радио" 2007, № 1, стр. 31.
Скорее всего она должна подойти.

0

14

Пётр написал(а):

Посмотрите конфигурацию контроллера в журнале "Радио" 2007, № 1, стр. 31.
Скорее всего она должна подойти

Прошил контроллер с этой конфигурацией, включил термометр, а он показывает 3,5 градуса. Держишь датчик пальцами, набегает 4,2 градуса.
Пробовал другую конфигурацию - эффект тот-же.
При сборке использовал датчик DS1820 без буквы В. В магазине сказали что они одинаковые. Может это влиять или нет?

0

15

dimosic777 написал(а):

При сборке использовал датчик DS1820 без буквы В. В магазине сказали что они одинаковые.

Они разные.
Для того чтобы устройство работало с DS1820, нужно изменить программу.

0

16

Пётр написал(а):

Они разные.
Для того чтобы устройство работало с DS1820, нужно изменить программу.

Если не составит труда подкорректируйте прогу и сообщите куда благодарить.

0

17

Я бы подкорректировал бы, но нет у меня DS1820, а есть только с буквой B.
Корректировать нужно этот участок кода:

Код:
Procedure Thread(*x) ; Эта процедура работает в отдельном потоке
 Shared DeviceHandle
 Dim In.c(4)  ; Байтовый массив, используемый как бцфер приёма данных.
 Temp.w       ; Переменная типа Word.
 
 Repeat
   If DeviceHandle   ; Установлена ли связь с USB термометром?
     In(0)=0
     HID_Lib_ReadDevice(DeviceHandle, @In(), 3) ; Чтение данных из USB термометра
       Temp=In(2)
       Temp<<8                                  ; Сдвиг влево на 8 пизиций
       Temp | In(1)
       Result.f=Temp/16     ; ЗДЕСЬ НУЖНО ВНЕСТИ ИЗМЕНЕНИЯ.
       If Result<150 And Result>-58           ; Отсеиваем возможные глюки!
         SetGadgetText(1,StrF(Result,1)+" °C")      ; Отображение температуры в окне
       EndIf
   EndIf
   Delay(100)
 ForEver
 
EndProcedure

Можно попробовать в место деления на 16, поделить на 8 или 4.

0

18

Пётр написал(а):

Можно попробовать в место деления на 16, поделить на 8 или 4.

Нашёл в магазине DS18В20, поставил и сразу всё заработало. Большое спасибо!!!

0

19

Пётр
А файлы для программы к ПК Вы не вылаживаете???

0

20

В первом сообщении темы, код программы для ПК, который можно скопировать в редактор кода и скомпилировать.
В архивах, файлы с расширением pb это исходные тексты программ для компьютера.

EXE файлы в архиве, это скомпилированные программы из кода файлов с расширением pb.

0

21

Жаль только это устройство невидит вот эта прога ThermoHID( http://www.thermohid.co.uk/ )
цены бы девайсу небыло бы .
(хотя по идее должна работать ) .

0

22

voyajer написал(а):

Жаль только это устройство невидит вот эта прога ThermoHID

Скорее всего не совпадает PID и VID устройства (решается правкой исходника и повторной компиляцией).
И наверное протокол обмена тоже разный.

0

23

Собрал устройство по указанной выше схеме. Pic18f4550, термометр ds18B20, резистор 10кОм, 4 конденсатора 100нФ, кварцевый резонатор на 12МГц. Устройство определяется, программа пишет "Термометр подключен", но вот температура всегда 0,0 С.
Подскажите пожалуйста, в чем может быть проблема?

0

24

Возможно перепутаны местами выводы датчика DS18B20.

0

25

Выводы? Там 3 вывода же. Питание, земля и вывод данных. Как их перепутать то?:) Высылаю скрин схемы.
http://fotoifolder.ru/view_foto/8awqk_ok4swf/

0

26

Термометр проверялся только в протеусе или в железе тоже?

0

27

В железе тоже. Спаял схему, только там был pic18f2550. Выводы все подключил правильно, ориентировался по даташиту. Но при подключении схемы к программатору ds18b20 быстро нагревался градусов до 60-80 (проверял тактильно). Поэтому и решил собрать схему в протеусе, проверить её работу.

0

28

qweete написал(а):

Спаял схему, только там был pic18f2550

Он отличается от PIC18F4550.

qweete написал(а):

Но при подключении схемы к программатору ds18b20 быстро нагревался градусов до 60-80

Это может быть из-за того, что перепутаны выводы питания датчика, либо из-за его неисправности. Чтобы не грелся, можно включить резистор, номиналом 100 Ом, между положительным выводом источника питания и выводом питания датчика.

0

29

Хм..а по схеме в протеусе можете что-то подсказать? Вроде и соединил все правильно, и компоненты все те, а все время 0 по Цельсию...

По железу - соединил все точно правильно..возможно датчик неисправный дали в магазине...

0

30

Если бы был бы проект в протеусе, то посмотрел бы как он работает.

qweete написал(а):

возможно датчик неисправный дали в магазине

Согласитесь, датчик не должен так греться.
Значит в чем-то есть проблема и возможно датчик бракованный попался.

qweete написал(а):

все время 0 по Цельсию...

Это значит что из датчика не поступают данные в контроллер.
По умолчанию в переменной будет число 0.

0


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » USB термометр на ATmega8 и PIC18F4550