Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » DS18B20 - помогите пожалуйста


DS18B20 - помогите пожалуйста

Сообщений 31 страница 60 из 62

31

Друзья! прошу помощи, т.к. уже отчаялся и не знаю что делать.

есть датчик ds18b20 и atmega162 ,подключено по схеме ниже, но  результат одинаковый и в протеусе и в железе,  показания всегда -0, грешил на датчик - перепробовал 5 разных датчиков, пробовал ту же схему на atmega8, вообщем результат одинаковый - показания температуры -0 градусов. Подскажите пожалуйста в какую сторону копать.

Спасибо!

http://s1.uploads.ru/t/zV4Li.png

текст программы

Код:
$regfile = "m162DEF.dat"                                    ' >>> BASCOM <<<
$crystal = 16000000

Config Lcd = 16 * 2                                         'configure lcd screen$sim
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5


Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Byte
Dim T2 As Byte

Do

Config 1wire = Portc.0
1wreset
1wwrite &HCC ‘ Âûäàåì Êîìàíäó ×òåíèÿ Ïçó
1wwrite &H44 ‘ Çàïóñê Èçìåðåíèÿ
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE ‘ Êîìàíäà ×òåíèÿ Îçó Äàò÷èêà
Byte0 = 1wread()
Byte1 = 1wread()
If Byte1 >= 248 Then
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16
T2 = Byte1 * 16
T1 = T1 + T2
Locate 2 , 1
Lcd Signtemperatura ; T1 ; "C"
Waitms 500

Loop

Отредактировано sysmes (2012-08-09 07:57:47)

0

32

1. выбросить Протеус и собрать в железе
у меня 4 проекта с подобной программой и на разных МК
и всё работает

в программе все задержки для 8 мгц, а у Вас 16 мгц
пробуйте немного увеличить задержку, на 5-150 ms
и обязательно почитайте описание на эту микросхему

0

33

Александр Д. написал(а):

в программе все задержки для 8 мгц, а у Вас 16 мгц


Спасибо! Помогло!

Отредактировано sysmes (2012-08-09 11:16:00)

0

34

Посмотрите этот код пожалуйста:

Код:
$regfile = "2313def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200


Config 1wire = Portd.0                  'Пин, на который повешан DS1820

'****************************Задаём перемнные***********************************

Dim Signtemperatura As String * 1 , Celsium As String * 5 , Fahrenhei As String * 5
Dim Byte0 As Byte , Byte1 As Byte , T As Byte
Dim Temp As Byte , Faren As Byte
Dim Faren0 As Single

'***************************Назначаем процедуры*********************************

Declare Sub Gettemp

'*************************Основной цикл программы*******************************

Do

Call Gettemp                            'Вызываем процедуру Gettemp

Print Celsium
Print                                   'выводим результат преобразвания Celsium
Print Fahrenhei                         'выводим результат преобразвания Fahrenhei
Loop
End



Sub Gettemp                             'процедура Gettemp
1wreset
1wwrite &HCC                            ' Выдаем команду чтения ПЗУ
1wwrite &H44                            ' Запуск измерения
Waitms 1000                             ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE                            ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                        ' Читаем нулевой байт
Byte1 = 1wread()                        ' Читаем первый байт
If Byte1 >= 248 Then                    ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16                       ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T = Byte1 * 16                          ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
Temp = Temp + T                        
Faren0 = Temp * 1.8
Faren = Faren0 + 32
Celsium = Signtemperatura + Str(temp) + "C"
Fahrenhei = Signtemperatura + Str(faren) + "F "
End Sub

Датчик ds1820
показывает "0"
Подключал к Arduino - все работает.

Отредактировано emaylov (2012-09-17 17:02:29)

0

35

Поправил
Dim Faren0 As Byte

Тоже самое.

Вывожу
Print Byte0
Print Byte1

Выводит "0"

Повесил датчик на PortB.0

Print Byte0 - Меняется
Print Byte1 - "0"

Понял. Тут все дело в ds1820

вот мудреный алгоритм Ссылка

Легче разориться на ds18b20  :angry:

Отредактировано emaylov (2012-09-18 15:41:47)

0

36

Приветствую! Третий день бьюсь над этим кодом(софт часы с термометром), всё работает, но температура может иногда показать ,что то невразумительное. Пробовал всё - от питания датчика , до всяких извращений с кодом, никакой реакции. Если кто сталкивался - подскажите. Заранее спасибо!

Код:
$regfile = "m8def.dat"                                   ' мега8
$crystal = 1000000
$hwstack = 60                                               '  аппаратный стек
$swstack = 60                                               '  программный стек
$framesize = 100                                            '  область  необходимая для преобразований

Config Portb = Output , Portd = Output
 Dim Tochka As Byte
Dim I As Byte , X As Byte , Cifri(4) As Byte
Config Clock = Soft                                         'конфигурируем софтовые часы
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : Enable Timer0

Config Timer1 = Counter , Edge = Falling , Prescale = 1 : Enable Interrupts       ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!
Config Portc.3 = Input : Set Portc.3
Config Portc.4 = Input : Set Portc.4
Config Portc.5 = Output : Звук Alias Portc.5
Config Portc.0 = Input
Dim Byte0 As Byte
Dim Byte1 As Byte

Dim T As Byte
Dim T1 As Byte
Dim T2 As Byte

Dim Счёт As Word
Dim W As Byte
Dim W1 As Byte
Dim E As Byte
Dim A As Byte , B As Byte , C As Byte , D As Byte

 Config 1wire = Portc.0
Sound Звук , 100 , 100
Waitms 20
Sound Звук , 50 , 100
Waitms 20
Sound Звук , 80 , 90

Main:
Счёт = 0
Waitms 200
Gosub Бег

Do




If Pinc.4 = 0 Then
Do
Incr _min : _sec = 00
If _min > 59 Then : _min = 00 : Incr _hour : End If
If _hour > 23 Then _hour = 00 : Waitms 150
Loop Until Pinc.4 = 1
End If
If Pinc.3 = 0 Then
Do
Incr _hour : If _hour > 23 Then _hour = 00 : Waitms 150
 Loop Until Pinc.3 = 1
End If
A = _min Mod 10
B = _min / 10
C = _hour Mod 10
D = _hour / 10

Incr Счёт
Waitms 100
If Счёт => 50 Then Goto Термо
If _min = 0 And _sec = 0 Then Sound Звук , 150 , 100
If _min = 30 And _sec = 0 Then Sound Звук , 100 , 150

Loop

Термо:
Счёт = 0


1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт

T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
 Gosub Бег
Do
 I = T1

C = I Mod 10 : D = I / 10 : B = 10 : A = 11

 Portd.7 = 1
Incr Счёт
 Waitms 100
If Счёт > 50 Then Goto Main
If _min = 0 And _sec = 0 Then Sound Звук , 150 , 100
If _min = 30 And _sec = 0 Then Sound Звук , 100 , 150

Loop

'конец основного цикла
Pulse:                                                      'подпрограмма прерываний таймера0
Cifri(1) = D : Cifri(2) = C : Cifri(3) = B : Cifri(4) = A
Portb = &HFF
Incr X : If X > 3 Then X = 0
Portd = Lookup(cifri(x + 1) , Dta)
Reset Portb.x
 Tochka = _sec Mod 2
If Portb.1 = 0 And Tochka = 0 Then Set Portd.7 Else Reset Portd.7


Return
'возвращаемся на место откуда прервали программу
Dta:
'таблица с данными о цифрах зажигает по порядку : 0123456789
Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H63 , &H39 , &HED , &HF9


Бег:
Stop Timer0
Portb = &H00

Portd = &H01
Waitms 150
Portd = &H03
Waitms 150
Portd = &H06
Waitms 150
Portd = &H0C
Waitms 150
Portd = &H30
Waitms 150
Portd = &H21
Waitms 150
Portd = &H01
Waitms 150
Start Timer0

Return

0

37

Нужно проверять CRC и не отображать результат если не совпало.

0

38

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

Нужно проверять CRC и не отображать результат если не совпало.

Самое обидное, что в навесном виде работало, а в нормальном на плате со сбоями, а вот с crc ни разу не сталкивался...

0

39

Помогите с 1wire
Как посчитать насколько сдвинуть регистр?

0

40

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

Помогите с 1wire
Как посчитать насколько сдвинуть регистр?

За это большое спасибо!
Проверил, стало ясно ,что датчик мухлюет , но легче не стало, потому , что  в другой схеме он работает чётко.
Повторюсь, питание к нему подведено нормально.

0

41

Дело вероятно не в датчике, а в том что МК работает на достаточно низкой тактовой частоте и если при чтении из датчика произойдет прерывание, это может исказить результат. Для начала увеличьте тактовую частоту до 4, а еще лучше до 8 МГц. Кроме того сократите до минимума подпрограмму обработки прерывания от таймера. К примеру эту строку

Код:
Cifri(1) = D : Cifri(2) = C : Cifri(3) = B : Cifri(4) = A

можно перенести в основной код расположив их после строки

Код:
C = I Mod 10 : D = I / 10 : B = 10 : A = 11

0

42

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

Дело вероятно не в датчике, а в том что МК работает на достаточно низкой тактовой частоте и если при чтении из датчика произойдет прерывание, это может исказить результат. Для начала увеличьте тактовую частоту до 4, а еще лучше до 8 МГц. Кроме того сократите до минимума подпрограмму обработки прерывания от таймера. К примеру эту строку

можно перенести в основной код расположив их после строки

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

0

43

У меня раз глючил из-за длинного провода к датчику,который лежал в канале с другими проводами. Феритовые кольца на обоих концах провода помогли.

0

44

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

Дело вероятно не в датчике, а в том что МК работает на достаточно низкой тактовой частоте и если при чтении из датчика произойдет прерывание, это может исказить результат.

Кстати - да !
Походу, используемый в этих датчиках протокол 1Wire не любит "вмешательства извне"...
Можно попробовать до окончания опроса датчиков отключать прерывания.

Столкнулся с подобным в одной из разработок...
В результате пришлось отказаться от прерываний совсем и работать в RealTime...

0

45

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

У меня раз глючил из-за длинного провода к датчику,который лежал в канале с другими проводами. Феритовые кольца на обоих концах провода помогли.

Насколько длинными ?
У меня работали стабильно до 20м (дальше пока не пришлось).

0

46

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

У меня раз глючил из-за длинного провода к датчику,который лежал в канале с другими проводами. Феритовые кольца на обоих концах провода помогли.

У меня датчик находится на плате в 1,5 см от контроллера, в коде поставил звуковое оповещение при ошибке датчика, и по проверке crc, и то и другое срабатывает... странно.

0

47

Володя написал(а):

kip написал(а):У меня раз глючил из-за длинного провода к датчику,который лежал в канале с другими проводами. Феритовые кольца на обоих концах провода помогли.У меня датчик находится на плате в 1,5 см от контроллера, в коде поставил звуковое оповещение при ошибке датчика, и по проверке crc, и то и другое срабатывает... странно.

Работа с этим датчиком - уровень детского сада (без обид).
Тут Александр разжевал до состояния пюре Исследование Ds18b20 (датчик температуры) ;)
Опробуйте вашу схему в Протеусе для начала.

Отредактировано Nord (2017-01-28 21:43:04)

0

48

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

Работа с этим датчиком - уровень детского сада (без обид).
Опробуйте вашу схему в Протеусе для начала.

Я выше уже писал - все эти детали работали в навесном, а в нормальном не хочуть... :crazyfun:

0

49

Володя написал(а):

Я выше уже писал - все эти детали работали в навесном, а в нормальном не хочуть...

Чудес на свете не бывает (с) не мое
Можно попробовать заменить на другой датчик из той же коробки.
Они только с виду одинаковые... ;)
Пришлось как-то перепробовать штук 8-10 для достижения необходимой точности...

0

50

Оно вроде бы сейчас и не горит, но не найти причину не интересно. Огромное спасибо за советы, всегда извлекается , что то полезное :)

0

51

Володя написал(а):

Оно вроде бы сейчас и не горит, но не найти причину не интересно.

Можно еще "поиграться" с задержками при опросе датчика.

+1

52

Убирал совсем, и увеличивал до 1,5 с не помогло, судя по непонятным знакам приходят значения выше 100

0

53

Володя написал(а):

Убирал совсем, и увеличивал до 1,5 с не помогло, судя по непонятным знакам приходят значения выше 100

В листинге #36 указано:

Config 1wire = Portc.0
...
1wreset
...


Можно попробовать:
1.
1wreset PORTC.0          - указываем ногу порта однозначно
Это может помочь при общей загруженности МК (мы же не знаем остальную часть схемы №) ).

2.
Возможно, где-то в теле программы есть операции с портом С, нарушающие протокол...

0

54

да, у меня PC.5 выход звука, а так только кнопки установки времени, завтра попробую сменить конфигурацию 1 wire...

0

55

Друзья, кто нибудь пользовался командой поиска аварии hEC ? Что то у меня не получается, помогите!

0

56

Что не получается?
Команды баскома могут только искать датчики (строка 2795 файла mcs.lib)

Код:
  Ldi R21,&HF0                       ; ROM search

Нужно либо самому написать код поиска, или изменить его в mcs.lib.

0

57

Та я думал проще, подал команду поиска аварии, мне и ответил датчик. Он у меня то один. Похоже геморно это. Проще силами мк всё это организовать, жаль.
кстати, у меня строка 2351, оно?http://s9.uploads.ru/t/Cdw9c.png

0

58

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

кстати, у меня строка 2351

Значит разные версии баскома.

Если датчик один то проще периодически считывать с него температуру.

0

59

А как изменить библиотеку? можно в блокноте подправить и сохранить?

0

60

Короче всё гораздо проще, как я думал. Если датчик один, то достаточно послать команду поиска аварии, и после  таймслот чтения. Если через 10uS шина упала на ноль, значит температура вышла за пределы лимита. А с библиотекой фигня получается.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » DS18B20 - помогите пожалуйста