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
| как на этой схеме
|
|
| |
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 поразбираться. Может, даже материал для сайта на основе этого интересный выйдет
|
|
| |
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, но думаю погрешность в один градус здесь уместна)))
|
|
| |
|