Пятница, 19.04.2024, 22:55
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Форум » Мастерская » Идеи, предложения и их реализация. » ATmega16+DS1820+LCD
ATmega16+DS1820+LCD
SpaceДата: Среда, 07.04.2010, 01:46 | Сообщение # 1








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Короче тема такая. Написал прогу с этим проблем не было. Но вот с подключением сего датчика есть, либо я что-то запамятовал сделать. Вообщем согласно его циколёвке подключаю его, а в результате вижу ноль на дисплее, если перевернуть его и подключить выводится 90 и при нагреве датчика цифра становится меньше. В чём может быть причина такой работы???
фьюзы(кварц 8МГц):
spien, ckort, sut0, sut1, cksel0-1, cksel3, bootsz0-1
Прога:
Code
$regfile = "m16def.dat"                    ' используем ATmega16
$crystal = 8000000                    ' частота установленного кварца 8 mHz

$lib "lcd4.lbx"                    'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

' указываем конфигурацию подключения дисплея к портам МК

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой

'Настройка ADC

Config Adc = Single , Prescaler = Auto , Reference = Internal
Enable Interrupts                    ' разрешаем прерывания

'Переменные

Dim Датчик0 As Integer , Датчик1 As Integer , Датчик2 As Integer
Dim Ацп0 As Integer , Ацп1 As Integer , Ацп2 As Integer
Dim Двигатель As Integer , Улица As Integer , Салон As Integer
Dim Z As Single , Z1 As Single , Z2 As Integer

Do

Cls                    'команда очистки дисплея

Start Adc
Ацп0 = Getadc(0)
'Ацп1 = Getadc(1)
'Ацп2=  Getadc(2)

Z = 2.56 / 1024
Z1 = Ацп0 * Z
Z2 = Z1 * 100

Locate 1 , 3                    ' позиция курсора
Lcd "аіёґaїe»Д" ; Z2 ;                    'выводим результат преобразования на дисплей

Locate 2 , 1                    ' позиция курсора
Lcd "©»ёеa24"                    'выводим результат преобразования на дисплей

Locate 2 , 10                    ' позиция курсора
Lcd "Ca»oЅ31"                    'выводим результат преобразования на дисплей

Waitms 250

Loop

End
 
noblakoДата: Среда, 07.04.2010, 06:57 | Сообщение # 2








Зарегистрирован 11.01.2009
Группа: Новички
Сообщений: 2
Город: Челябинск
Статус: Offline
Пишу на асм и прогу вашу не понимаю -(, но бросается в глаза обильное применение АЦП. К Вам встречный вопрос: Разве DS1820 не цифровой датчик? При чем тут АЦП?
 
SpaceДата: Среда, 07.04.2010, 22:40 | Сообщение # 3








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
да цифровой, вот это я и не посмотрел

Добавлено (07.04.2010, 22:40)
---------------------------------------------
нашёл прогу на сайте радио кота, пишут, что работает, но у меня почему-то выводится 3 градуса всего и взависимоти от нагрева или охлаждения повышается или уменьшается, кто нибудь возился вообще с такими датчиками???

Code
$regfile = "m16def.dat"
$crystal = 8000000
$lib "lcd4.lbx"
Config 1wire = Portc.7                    'порт, куда садим ногами два датчика типа ds18b20
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой
Cursor Off                    'выключить курсор дисплея
Config Timer1 = Timer , Prescale = 64                       'конфигурируем таймер и ставим его делитель 64. таймер будет переполнятся 2 раза в секунду
On Timer1 Pulse:                    'при переполнении таймера запустить подпрограмму Pulse
Enable Interrupts                    'разрешить прерывания
Enable Timer1                    'разрешить таймер1
'--------задаем переменные------------------
Dim S05 As Byte
Dim W As Word
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 2
Dim T1 As Single
Dim T2 As Integer
Dim Ttemp As Byte
Dim Hh As Byte
Dim Mm As Byte
Dim X As Byte
'-----------считываем 64 битные номера датчиков----------------

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Do
  Dsid2(1) = 1wsearchnext()
Loop Until Err = 1
Cls
'_________________________основной цикл программы________________________________________________________
Do
If S05 >= 6 Then                    'если щетчик таймер насчитал 3 секунды (таймер срабатывает 2 раза в секунду при 8 мГц
S05 = 0                    'обнуляем щетчик таймер
Gosub Convallt                    'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid1(1)
X = 1                    'переменная номера строки дисплея
Gosub Temperature                    'переходим на подпрограмму подсчета и вывода температуры на дисплей
1wverify Dsid2(1)
X = 2
Gosub Temperature
End If
   Loop
End
'_________________________________________________________________________________
Convallt:
  1wreset                    ' reset the bus
  1wwrite &HCC                    ' skip rom
  1wwrite &H44
' Waitms 500
Return                    ' возврат в основной цикл на место, откуда пришли
'----------------
Temperature:
If Err = 0 Then
1wwrite &HBE
Byte0 = 1wread()                    ' Читаем нулевой байт
Byte1 = 1wread()                    ' Читаем первый байт
If Byte1 >= 248 Then                    ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16                    ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                    ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
Hh = Fix(t1)                    'отсекаем от температуры все после запятой
Ttemp = T1 * 10                    '
Mm = Ttemp Mod 10                    'берем десятичную часть температуры
Locate X , 1                    'указываем куда вывести на дисплей
Lcd Signtemperatura ; T1 ; "C"                    'выводим целую часть потом рисуем точку потом десятую часть температуры
End If
Return
'-----------------
Pulse:                    'подпрограмма обработки переполнения таймера1
Incr S05                    ' S05 = S05+1
Return
 
DeepBlackДата: Среда, 07.04.2010, 22:46 | Сообщение # 4








Язык программированя: C/C++
Зарегистрирован 27.07.2009
Группа: Модераторы
Сообщений: 189
Город: Зеленоград
Статус: Offline
Ссылку кинь, где на радиокоте смотрел.
 
SpaceДата: Среда, 07.04.2010, 22:49 | Сообщение # 5








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
а мне надо позарез сделать такой контролёр, т. к. в машине система охлаждения со срабатыванием запаздывает приходится своё городить

Добавлено (07.04.2010, 22:49)
---------------------------------------------
сори не на радио коте хотя и там смотрел(вот)
брал код отсюда(сообщенеи от пользователя Pasha)

 
DeepBlackДата: Среда, 07.04.2010, 23:03 | Сообщение # 6








Язык программированя: C/C++
Зарегистрирован 27.07.2009
Группа: Модераторы
Сообщений: 189
Город: Зеленоград
Статус: Offline
не понимаю бейсик( на C написать такое легче...
Посмотри вот тут http://radiokot.ru/articles/13/index.shtml описан интерфейс 1-Wire, на котором твой датчик работает.

И еще, по какой схеме датчик подключен. По полной, или с паразитным питанием?

 
SpaceДата: Среда, 07.04.2010, 23:05 | Сообщение # 7








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
как на этой схеме
Прикрепления: 2350587.gif (16.0 Kb)
 
DeepBlackДата: Среда, 07.04.2010, 23:12 | Сообщение # 8








Язык программированя: C/C++
Зарегистрирован 27.07.2009
Группа: Модераторы
Сообщений: 189
Город: Зеленоград
Статус: Offline
Не знаю, как у вас там на бейсике че делается, но чисто алгоритм я бы выбрал такой
Code
             
     1wreset                   ' начальный сброс (обязательно, 500мс)
     1wwrite &HCC          ' пропуск ПЗУ (обращаемся не к конкретному устройству а вообще, т.к. датчик один)    
                     ' пропустили цикл с  поиском устройств   

'... а дальше имеющийся опрос и вывод

Code
If Err = 0 Then
1wwrite &HBE
Byte0 = 1wread()                    ' Читаем нулевой байт
Byte1 = 1wread()                    ' Читаем первый байт
If Byte1 >= 248 Then                    ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16                    ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                    ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
Hh = Fix(t1)                    'отсекаем от температуры все после запятой
Ttemp = T1 * 10                    '
Mm = Ttemp Mod 10                    'берем десятичную часть температуры
Locate X , 1                    'указываем куда вывести на дисплей
Lcd Signtemperatura ; T1 ; "C"                    'выводим целую часть потом рисуем точку потом десятую часть температуры
End If
Return    

------------------------------------------------------------------
Я такую штуку года 2 назад на Асме писал... не очень хорошо помню.

Сообщение отредактировал DeepBlack - Среда, 07.04.2010, 23:16
 
SpaceДата: Среда, 07.04.2010, 23:15 | Сообщение # 9








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
ды был бы аналоговый датчик всё было бы круто и прога уже была готова, а с цифровым датчиком не сталкивался ни когда. Думаю проще будет взять lm35 чем с этим возиться
 
DeepBlackДата: Среда, 07.04.2010, 23:19 | Сообщение # 10








Язык программированя: C/C++
Зарегистрирован 27.07.2009
Группа: Модераторы
Сообщений: 189
Город: Зеленоград
Статус: Offline
ну смотри, такой датчик есть смысл подключать если на линии много таких (там до 255 можно вешать на 1 провод) или ресурсы того требуют.
Если срочно, бери проверенный метод, конечно. Ну а на досуге можно и с 1-Wire поразбираться. Может, даже материал для сайта на основе этого интересный выйдет wink
 
SpaceДата: Среда, 07.04.2010, 23:42 | Сообщение # 11








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
ггг.... вроде норм терь
изменил здесь
Code
T1 = Byte0 / 2                    ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 3                    ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

вместо 16 поставил 2 и 3 теперь показывает 25 градусов, сравнил с градусником на часах он показывает 23,9, но думаю погрешность в один градус здесь уместна)))
 
Форум » Мастерская » Идеи, предложения и их реализация. » ATmega16+DS1820+LCD
  • Страница 1 из 1
  • 1
Поиск: