АвторСообщение



Пост N: 28
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг: 0
ссылка на сообщение  Отправлено: 27.02.07 15:08. Заголовок: Интерфейс 1-Wire



Обсуждение интерфейса 1-Wire


Евгений Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 104 , стр: 1 2 3 All [только новые]


постоянный участник




Пост N: 33
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 02.03.07 16:04. Заголовок: Re:


Ниже даю кусок кода для записи в блокнотную память
..............................................................................................

;---------------------------------------------------------------------------------------------
; Запись в блокнотную память (4EН) применяется для записи данных в блокнотную память, ранее
; адресованного устройства. По данной команде запись производится во второй и третий байты для
; DS1820 и во второй, третий и четвертый - для DS18B20.
; Нулевой и первый байты - данные о температуре (только чтение), второй байт - TH Register,
; третий байт - TL Register, с четвертого по седьмой байт запись невозможна (зарезервировано).
; Для DS18B20 в четвертый байт записывается слово конфигурации, байты с пятого по седьмой -
; зарезервированы (запись невозможна).
;---------------------------------------------------------------------------------------------
Write_pad:
movlw 4EH ; Вывод команды Write Scratchpad (4Eh)
movwf O_Byte ;
call Out_Byte ;

movf TH_Reg,W ; Вывод верхней границы температуры (TH Register),
movwf O_Byte ; для DS1820, DS18B20 регистр номер 2
call Out_Byte ;

movf TL_Reg,W ; Вывод нижней границы температуры (TL Register),
movwf O_Byte ; для DS1820, DS18B20 регистр номер 3
call Out_Byte ;

return ; Для случая DS18B20 убирается (продолжается запись в
; регистр номер 4 - configuration register) т.е выводятся
; три байта подряд.

movf Conf_Reg,W ; Запись данных в конфигурационный регистр (только для
movwf O_Byte ; DS18B20)
call Out_Byte ;

return ;

Как видите проще пареной репы. Запись всегда начинается во второй байт, дальше в третий, все. Это для DS1820. Для случая DS18B20 запись производится во второй, третий и четвертый байты. Конфигурацию регистра Conf_Reg можно глянуть в даташите. По умолчанию стоит 12-ти разрядное декодирование, т.е. я был не прав говоря что все пойдет без проблем. Проблемы будут , выход простой: или уменьшить разрядность да 9-ти, или (в зависимости от разрядности) ввести несколько дополнительных делений на два. Например для 9-ти разрядного преобразования результат считанный с датчика надо разделить на 2: считали 50, разделили на 2, получили 25 - это и есть температура. Для 10-ти разрядов: делим на два, делим на два, т.е. считали 100, поделили на 2, получили 50, поделили на 2, получили искомую температуру (25). И т.д. Для 12-ти разрядов надо поизвести четыре последовательных деления на два. Или по другому вместо одного сдвига вправо для 9-ти разрядного декодирования, сделать четыре сдвига вправо для 12-ти разрядного. И вся любовь. Можно, конечно, задаться целью вывести на индикацию и все четыре знака после запятой, но это уже другая история, на любителя.




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 40
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 05.03.07 13:53. Заголовок: Re:


Я тут еще раз даташит на DS18B20 посмотрел, погрешность у него такая же что и у DS1820 (+/-0,5 градуса) и если не принять специальных мер по калибровке (не ввести калибровочные коэффициенты), то смысла в выводе на индикатор лишних "цифирек" нет. Для калибровки нужен высокоточный образцовый термометр (дкмаю что у 90% радиолюбителей доступа к такому нет), отсюда практический вывод: переводим его в 9-ти разрядный режим и дело с концом. Для большинства применений погрешности в пол-градуса достаточно.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 105
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг: 0
ссылка на сообщение  Отправлено: 05.03.07 14:09. Заголовок: Re:


Alberto пишет:

 цитата:
высокоточный образцовый термометр

Такой термометр есть почти у каждого - это медицинский ртутный термометр. Сначала измеряется температура тела с помощью медицинского термометра, а затем с помощью DS18B20.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 45
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 05.03.07 14:37. Заголовок: Re:


Ну нет, не скажите. У него какие пределы? От 30 до 42 градусов с точностью 0,1 градуса, а Вам будет нужен от 0 до 100 градусов с лишним и с погрешностью (посмотрите даташит) в 0,001 градуса. Есть у Вас такой? А по одной точке (температура тела 36,6) Вы ничего не откалибруете. Даже если измерить температуру тела больного, умирающего друга (42 градуса) у Вас ничего не получится. "Циферки" бегать будут, а толку никакого.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 108
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг: 0
ссылка на сообщение  Отправлено: 05.03.07 14:40. Заголовок: Re:


Да, кстати, в 12-разрядном режиме, десятые доли градуса кодируются четырьмя битами, как потом правильно округлить результат?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 109
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг: 0
ссылка на сообщение  Отправлено: 05.03.07 14:49. Заголовок: Re:


Alberto пишет:

 цитата:
От 30 до 42 градусов с точностью 0,1

Я пока сделал только одно устройство с этим датчиком. Это был "Термометр-терморегулятор для инкубатора", его задача состояла в том чтобы поддерживать температуру в районе 38 градусов с точностью 0.2 градуса. Калибровал выше указанным способом.
Alberto пишет:

 цитата:
0 до 100 градусов с лишним и с погрешностью (посмотрите даташит) в 0,001 градуса.

Найти такой термометр практически нереально.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 48
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 05.03.07 16:10. Заголовок: Re:


Пётр пишет:

 цитата:
Найти такой термометр практически нереально.


И я о том же. У нас на работе когда-то был термометр от -50 до 200 градусов (если память не изменяет) с делением в 0,1 градуса, размером под 2 метра, а потом куда-то благополучно исчез , то ли из-за того что ртути много содержал (по санитарным нормам убрали), то ли еще по какой причине.
"If the DS18B20 is configured for 12-bit resolution, all bits in the temperature register will contain valid data. For 11-bit resolution, bit 0 is undefined. For 10-bit resolution, bits 1 and 0 are undefined, and for 9-bit resolution bits 2, 1 and 0 are undefined. Table 2 gives examples of digital output data and the corresponding temperature reading for 12-bit resolution conversions."
О-о, гляжу в книгу - вижу , раза три смотрел, а слона-то и не заметил. Тут же ясно написано: при 12-ти битной конфигурации все биты содержат действительную информацию, при 11-ти битной конфигурации - бит 0 не определен, при 10-ти битной - биты 0 и 1 неопределены, при 9-ти битной - биты 0, 1 и 2 неопределены. Значит в любом случае надо делить на 16 (делать 4 сдвига вправо), просто не надо учитывать младшие разряды. Это даже легче. Всегда получаем с датчика значение вплоть до десятитысячных (четыре знака после запятой). Значит знак температуры надо контролировать по битам 3-7 байта MSB, остальные биты (0-2) работают в связке с байтом LSB. Т.е.: сначала определяем знак температуры и сохраняем признак (отрицательная/положительная), дальше обнуляем биты 3-7 байта MSB (больше не нужны и чтобы не мешали), делаем четыре сдвига вправо двухразрядного регистра MSB-LSB (после сдвига байта LSB надо обнулять бит С, иначе при следующем сдвиге байта MSB будут "запариваться" его старшие биты, тут правда надо учитывать то, что это информация содержит значение температуры после запятой). Сегодня дома сяду, посмотрю, как можно оформить эту процедуру. По обстоятельствам или используем все знаки после запятой (вплоть до десятитысячных), или меньше (три, два или одно число). Лучше сделать с округлением результата.
Пётр пишет:

 цитата:
Да, кстати, в 12-разрядном режиме, десятые доли градуса кодируются четырьмя битами, как потом правильно округлить результат?


Конечно, надо бы попробовать, но у меня нет DS18B20, так что все дальнейшие (как и предыдущие) рассуждения это просто мои рассуждения. Я бы сделал так: контролировал бы сотые, а дальше уход в два сценария, если меньше пяти оставляем десятки без изменения, если пять и больше прибавляем единицу к десяткам.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 116
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг: 0
ссылка на сообщение  Отправлено: 06.03.07 12:25. Заголовок: Re:


Alberto пишет:

 цитата:
контролировал бы сотые, а дальше уход в два сценария

Я сделал по другому. Может это и неидеальный вариант, но зато рабочий.
_16                 movf          TEMP_READL,0 
andlw b'00001111'
addwf pcl,1
retlw 00h
retlw 01h
retlw 02h
retlw 02h
retlw 03h
retlw 03h
retlw 04h
retlw 05h
retlw 05h
retlw 06h
retlw 06h
retlw 07h
retlw 08h
retlw 08h
retlw 09h
retlw 09h


Перед вызовом этой подпрограммы в регистр TEMP_READL следует скопировать младший байт, считанный из DS18B20. В результате работы этой подпрограммы, в аккумуляторе будет число (т. е. десятые доли градуса) от 0 до 9, которое без каких либо преобразований можно вывести на индикатор.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 78
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 09.03.07 15:58. Заголовок: Re:


Ниже привожу список устройств, выпускаемых для шины 1-Wire (две первые цифры - групповой код):

01 (DS1990A), DS2401 Только сетевой адрес 1-Wire (серийный номер)
02 (DS1991), (DS1425) Мультиключ (Multikey) iButton, защищенная память объемом 1152 бит
04 (DS1994), DS2404 4-Кбит энергонезависимое ОЗУ (RAM) с часами, таймером и сигнальными таймерами (alarms)
05 DS2405 Один адресуемый ключ
06 (DS1993) 4-Кбит энергонезависимое ОЗУ
08 (DS1992) 1-Кбит энергонезависимое ОЗУ
09 (DS1982), DS2502 1-Кбит СППЗУ (EPROM)
0A (DS1995) 16-Кбит энергонезависимое ОЗУ
0B (DS1985), DS2505 16-Кбит СППЗУ
0C (DS1996), (DS1996x2),(DS1996x4) 64…256-Кбит энергонезависимое ОЗУ
0F (DS1986), DS2506 64-Кбит СППЗУ
10 (DS1920), DS1820, DS18S20 Датчик температуры с программируемыми пороговыми значениями температуры
12 DS2406, DS2407 1-Кбит СППЗУ, двухканальный адресуемый ключ
14 (DS1971), DS2430A 256-бит ЭСППЗУ (EEPROM) и 64-бит однократно программируемый (ОТР) регистр
18 (DS1963S) 4-Кбит энергонезависимое ОЗУ и процессор SHA-1
1A (DS1963L) 4-Кбит энергонезависимое ОЗУ со счетчиками циклов записи
1D DS2423 4-Кбит энергонезависимое ОЗУ с внешними счетчиками
1F DS2409 2-канальный адресуемый ответвитель для подсетей
20 DS2450 4-канальный АЦП
21 (DS1921), (DS1921H),(DS1921Z) Датчик/регистратор температуры Thermochron™
22 DS1822 Недорогой датчик температуры
23 (DS1973), DS2433 4-Кбит ЭСППЗУ
24 (DS1904), DS2415 Часы реального времени (RTC)
26 DS2438 Интеллектуальный монитор батарейного питания с датчиком температуры и АЦП
27 DS2417 Часы реального времени с прерыванием
28 DS18B20 Датчик температуры с регулируемым разрешением
2C DS2890 Одноканальный цифровой потенциометр
30 DS2760 Высокоточный монитор Li-Ion-батареи с датчиком температуры и тока, встроенный АЦП
33 (DS1961S), DS2432 1-Кбит ЭСППЗУ с процессором SHA-1
91 (DS1981) 512-бит СППЗУ (только по специальному заказу)
96 (DS1955), (DS1957B) Поддерживающий Java™ криптографический iButton (64-Кбайт ПЗУ, 64…134-Кбайт энергонезависимое ОЗУ)

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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 261
Зарегистрирован: 26.12.06
Откуда: Санкт-Ленинград
Рейтинг: 0
ссылка на сообщение  Отправлено: 09.03.07 18:44. Заголовок: Re:



 цитата:
DS1990A

Общеизвестен, как ключ TouchMemory, он же - "таблетка" (для домофонов и других систем контроля доступа).

Obligatus Servus Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 79
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 09.03.07 19:45. Заголовок: Re:


Dmitry Dubrovenko пишет:

 цитата:
Общеизвестен, как ключ TouchMemory


он самый , на основе информации от КЕА можете "слепить" такую же систему доступа за один вечер . А добавив сюда DS2415 можно добавить фиксацию времени или проход в строго определенное время, или по определенным дням... Возможности практически безграничны

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 71
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 09.03.07 22:33. Заголовок: Re:


Искал одно, нашел другое, думаю будет интересно

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 100
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 20.03.07 17:42. Заголовок: Re:


Я тут на досуге вот о чем подумал. Если при работе с одним датчиком температуры всегда считывать и его серийный номер (вернее только номер серии), то по нему можно определить и его принадлежность к конкретной серии (DS1820 - 10h, DS18B20 - 28h), а значит можно сделать так, чтобы программа в зависимости от типа датчика выбирала то ли считанные данные делить на два (один сдвиг вправо считанной температуры для случая DS1820) или делить на 16 для DS18B20 (сдвигать оба считанных байта, см. сообщение от 05.03.07). Т.е. можно сделать так что программа будет работать и с DS1820, и с DS18B20, т.е. будет универсальной. Правда знак температуры надо определять по одному из битов 3-7 байта байта MSB.
А если при этом еще применить четырехразрядный светодиодный индикатор с динамической индикацией (считали температуру, подали команду на преобразование температуры, в течении 1 сек (+/- 0,2 сек роли не играют) отображаем ранее считанную информацию, а в это время в датчике идет процесс преобразования температуры, далее все опять повторяется), то можно сделать малогабаритный и дешевый термометр с довольно высокими эксплуатационными характеристиками.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 86
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 20.03.07 18:57. Заголовок: Re:


Alberto пишет:

 цитата:
можно сделать так что программа будет работать и с DS1820, и с DS18B20, т.е. будет универсальной


Как раз, встала такая проблема, DS18S20 небыло.
С математикой еще не разобрался, но думал использовать первый полубайт
для вывода .5 или .0 , тоесть с точностью пол градуса, и хоронить его потом.
А следующие два полубайта преобразовывать, как в программе с DS18S20.

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 160
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг: 0
ссылка на сообщение  Отправлено: 20.03.07 19:22. Заголовок: Re:


vintik пишет:

 цитата:
первый полубайт
для вывода .5 или .0 , тоесть с точностью пол градуса

Если Вы будете использовать DS18B20, для того чтобы получить точность 0.5 градуса следует обнулить биты 0,1,2 в младшем байте.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 87
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 21.03.07 11:39. Заголовок: Re:


Может попробовать так,
в счетчик битов ввести число 4, на четвертом бите проверить RA4,
если бит4 =1 то .5
если бит4 =0 то .0
Затем в счетчик битов ввести число 8, и считать байт, операция деления отпадет,
дальше по программе..
Может ошибаюсь

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 88
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 21.03.07 12:01. Заголовок: Re:


Или,
поставить счетчик =12,
при совпадении с 4, снать инфу вывода RA4, сохранить в Flag
начиная с 5го бита, rlf Temp,F....???



Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 89
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 22.03.07 02:11. Заголовок: Re:


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


Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 26.03.07 11:22. Заголовок: Re:


Здравствуйте уважаемые посетители данной ветки! Есть вопросы по датчику DS18B20. У меня есть в наличии только такой датчик. Как я понял, то в отличие от DS1820 значение температуры в нём кодируется двумя байтами. Причём, код температуры - в младшем полубайте старшего байта и старшем полубайте младшего. Биты 0, 1, 2, 3 младшего байта - признаки дробного значения температуры: 0 бит - 0,0625 градуса, 1 бит - 0,125, 2 бит - 0,25, 3 бит - 0,5 градуса. В старшем полубайте старшего байта - знак температуры (+/-). Переписав подпрограмму вычисления значения и знака температуры у меня получилось следующее:
Скрытый текст



Можно применить и деление на 16, но тогда будет использовано больше команд.
Вопрос к тем, кто уже прошёл эту стадию, всё-ли правильно?
Измеритель температуры работает, но верно-ли?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 95
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 26.03.07 15:42. Заголовок: Re:


Может грубо, но так и в железе работает:
Скрытый текст


Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 96
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 26.03.07 17:29. Заголовок: Re:


И еще, при охдаждении датчика не правильно показывает половинки градуса.
Т.е. -10,5 => -10 => -11.5 => -11 => -12.5 => -12
А если убрать доли градуса, то нормально, работает

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 9
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 11:10. Заголовок: Re:


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


У кого найдётся возможность проверить в Протеусе и железе? Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 10
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 11:16. Заголовок: Re:


vintik
Как у Вас получается так красиво выложить листинг программы? У меня почему-то всё прибито к левой стороне.

На датчике надпись:

DALLAS
18B20
0445C2
280AG

Это DS18B20?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 98
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 11:33. Заголовок: Re:


RW1ZK пишет:

 цитата:
Как у Вас получается так красиво выложить листинг программы? У меня почему-то всё прибито к левой стороне.


Вы наверное не используете кнопочку "моноширинный текст", у меня шестая с права.
RW1ZK пишет:

 цитата:
Это DS18B20?


Похоже, а что, так и не заработал???

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 11
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 11:50. Заголовок: Re:


Работает... У меня как в той песне Высоцкого: "все извилины заплёл...". Написал отдельную подпрограмму (причём несколько вариантов) перекодировки данных. Остановился на последней. Работать должна правильно. Смущает datasheet на DS18B20, в котором указано, что температуре -55 соответствует значение b'11111100' & b'10010000'. При преобразовании получается -54. Ошибка? Для примера беру -25 (b'11111110' & b'01100000') - после преобразования -25, всё верно. Может всё-таки не -55, а -54.9375 градуса? В диапазоне положительных температур перекодировка работает корректно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 12
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 12:28. Заголовок: Re:


Максимальная положительная температура, которую показал девайс +127.5 !? (по datasheet не более +125). Заметил ещё один глюк: при понижении температуры с +100 в младшем разряде на индикаторе остаётся 0! (Для примера +99.00 или +99.50). Он не гасится! Т.Е. в программе необходимо предусмотреть гашение правого нуля. Да, пропустил: в п/п установки (или нет) признака добавления символа 1 (темп.>99 градусов) тоже заменить Temp_LSB на Temp_MSB.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 99
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 12:50. Заголовок: Re:


Поменял направление сдвига (rlf ->rrf), в положительном секторе стал
показывать корректно, но до +127, +128 показывает, как +95!?
В отрицательном секторе, вообще фигня какаято. На -1 показывает
-124, -2 > -125 и т.д.
Мне кажется, Вы теряете информацию при опросе DS, в материнской
программе, она лежит в одном байте, а в данном случае она разбивается
на два байта(если не ошибаюсь).
Пробовал только в Протеусе.


Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 13
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 12:52. Заголовок: Re:


Для гашения нуля необходимо в п/п вывода на индикацию пары символов ",0" или ",5" после вывода символа "5" и возврата из ENTER_BF прописать строки:Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 14
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 13:18. Заголовок: Re:


Странно... Ниже отдельная п/п перекодировки.
Скрытый текст


В регистры Temp_МSB и Temp_LSB загружаем значения из datasheet:

+125°C          0000 0111 1101 0000       07D0h  
+85°C 0000 0101 0101 0000 0550h*
+25.0625°C 0000 0001 1001 0001 0191h
+10.125°C 0000 0000 1010 0010 00A2h
+0.5°C 0000 0000 0000 1000 0008h
0°C 0000 0000 0000 0000 0000h
-0.5°C 1111 1111 1111 1000 FFF8h
-10.125°C 1111 1111 0101 1110 FF5Eh
-25.0625°C 1111 1110 0110 1111 FF6Fh
-55°C 1111 1100 1001 0000 FC90h


Мне кажется, что Протеус врёт. Девайс больше +127.5 не показывает. Показания замирают на вышеуказанном значении.
Просьба к модератору форума: было-бы неплохо иметь возможность прикреплять файлы, чтобы не засорять экран листингом программы.





Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 108
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 28.03.07 20:23. Заголовок: Re:


Вот как я передалал программу ds1820.asm из рассылки К.Е.А. Красным цветом отмечены мои "переделки" для работы с DS18B20:
 
;----------------------------------------------------------
; Определение и вывод на индикацию знака температуры (+/-).
;----------------------------------------------------------
btfsc Temp_MSB,7 ; Бит 7 равен "0"
goto MINUS ; "НЕТ" - переход на п/п MINUS
movlw 2Bh ; "ДА" - выводим символ "+"
bsf PortA,RS ;
call ENTER_BF ;

;----> Возврат по стеку из ПП ENTER_BF.
goto SDVIG ; Переход на п/п SDVIG
;
MINUS:
movlw 2Dh ; Выводим символ "-"
bsf PortA,RS ;
call ENTER_BF ;
;
;----> Возврат по стеку из ПП ENTER_BF.
;----------------------------------------------------------
; Перевод двоичного числа младшего байта температуры
; из отрицательной области температур в положительную.
;----------------------------------------------------------
comf Temp_MSB,F ; Инвертировать байт Temp_MSB

comf Temp_LSB,F ; Инвертировать байт Temp_LSB
incf Temp_LSB,F ; Увеличить байт Temp_LSB на единицу
btfsc Status,C ; Был перенос?
incf Temp_MSB,F ; "ДА" - инкрементировать байт Temp_MSB
;============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2
; и запись, в бит №0 регистра Flag, признака символов "0" или "5".
;--------------------------------------------------------------------------------------------
SDVIG clrf Flag ;
btfsc Temp_LSB,3 ; Бит 3 байта Temp_LSB равен "0"
bsf Flag,0 ; "НЕТ" - признак 0,5 градуса
; "ДА" - нет 0,5 градуса
bcf Temp_LSB,0 ;Обнуляем биты 0-3 байта Temp_LSB
bcf Temp_LSB,1 ;
bcf Temp_LSB,2 ;
bcf Temp_LSB,3 ;

swapf Temp_LSB,F ; Меняем местами полубайты байта Temp_LSB
swapf Temp_MSB,W ; Меняем местами полубайты байта Temp_МSB с занесением результата
; в регистр W
addwf Temp_LSB,F ; Складываем число в Temp_LSB с содержимым регистра W с сохранением
; результата в Temp_LSB
; Дальше по тексту программы

На данном этапе в ячейке Temp_LSB находится значение температуры в шестнадцатиричном формате готовое к двоично-десятичному преобразованию. Все. Буду очень признателен, если кто проверит на реальном устройстве. У меня нет датчика DS18B20.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 22
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.03.07 21:45. Заголовок: Re:


Alberto пишет:

 цитата:
Вот как я передалал программу ds1820.asm



Увы, к сожалению не фурычит. Прогнал в MPLAB. Ситуация следующая: В зоне температур от +125 до -0.5 градуса всё работает как часы...
Кавардак начинается ниже температуры -1 градус... Вместо -1 получается результат -2 градуса, вместо -10 выдаёт -11, вместо -25 -> -26. Но -55 получается чётко! Вот с этим подводным камнем столкнулся и я. И мне кажется, что я его обошёл (обошёл ли?). Теперь надо найти вариант уменьшения числа команд. Убедительная просьба проверить то, что получилось у меня.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 23
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.03.07 09:47. Заголовок: Re:


Ниже ещё один переработанный вариант под DS18B20. П/программа стала меньше на 3 команды, убран цикл подсчёта количества сдвигов.
Скрытый текст

Верхний предел измеренной температуры равен +127.5 градуса. С отрицательным значением проблема (мне бы на своё служебное место криогенную камеру, на худой случай холодильник...).

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 111
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 29.03.07 12:19. Заголовок: Re:


RW1ZK пишет:

 цитата:
Увы, к сожалению не фурычит. Прогнал в MPLAB.


Не может быть, я ее проганял в MPLAB'е, работает четко. Вот полный текст переработки, загоните в MPLAB, попробуйте. Подставлял числа с даташита. Все Ok.

;============================================================================================= 
LIST p=16F84a ; Используется м/контроллер PIC16F84A.
__CONFIG 03FF1H ; Бит защиты выключен, WDT выключен, XT-генератор.
;=============================================================================================
; Определение положения регистров специального назначения.
;=============================================================================================
IndF equ 00h ; Доступ к памяти через FSR.
PC equ 02h ; Счетчик команд.
Status equ 03h ; Регистр Status.
FSR equ 04h ; Регистр косвенной адресации.
PortA equ 05h ; Регистр Port A.
TrisA equ 05h ; Регистр Tris A-банк1.
PortB equ 06h ; Регистр Port B.
TrisB equ 06h ; Регистр Tris B-банк1.
;=============================================================================================
; Определение названия и положения регистров общего назачения.
;=============================================================================================
N equ 0Ch ; Счетчик битов.
Temp equ 0Dh ; Многофункциональный регистр временного хранения.
Temp_MSB equ 0Eh ; Байт знака температуры (старший байт).
Temp_LSB equ 0Fh ; Байт значения температуры (младший байт).
Flag equ 10h ; Регистр флагов.
Count equ 11h ; Многофункциональный счетчик.
LED0 equ 12h ; Регистры двоично-десятичного
LED1 equ 14h ; преобразования.
;=============================================================================================
; Определение места размещения результатов операций.
;=============================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;=============================================================================================
; Присваивание битам названий.
;=============================================================================================
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
DQ equ 4 ; Бит порта A для управления DS1820.
RW equ 0 ; Бит №0 регистра PortA (вывод RA0 - линия RW).
RS equ 1 ; Бит №1 регистра PortA (вывод RA1 - линия RS).
E equ 2 ; Бит №2 регистра PortA (вывод RA2 - линия E).
BF equ 7 ; Бит №7 регистра PortB.
;=============================================================================================
org 0 ; Начать выполнение программы
goto START ; с подпрограммы START.
;*********************************************************************************************



START:
movlw b'11111110' ; Здесь добавляем данные с даташита
movwf Temp_MSB ;

movlw b'01101111' ; В данном случае -25,0625 градуса
movwf Temp_LSB ;

;----------------------------------------------------------
btfsc Temp_MSB,7 ; Bit 7 igual a "0"
goto MINUS ; "NO"
movlw 2Bh ; "SI"
bsf PortA,RS ;
call ENTER_BF ;
;
;----> Возврат по стеку из ПП ENTER_BF.
goto SDVIG ;
;
MINUS movlw 2Dh ;
bsf PortA,RS ;
call ENTER_BF ;
;
;----> Возврат по стеку из ПП ENTER_BF.
;----------------------------------------------------------
; Перевод двоичного числа младшего байта температуры
; из отрицательной области температур в положительную.
;----------------------------------------------------------
comf Temp_MSB,F ;

comf Temp_LSB,F ;
incf Temp_LSB,F ;
btfsc Status,C ;
incf Temp_MSB,F ;
;
;============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2
; и запись, в бит №0 регистра Flag, признака символов "0" или "5".
;--------------------------------------------------------------------------------------------
SDVIG clrf Flag ;
btfsc Temp_LSB,3 ;
bsf Flag,0

bcf Temp_LSB,0
bcf Temp_LSB,1
bcf Temp_LSB,2
bcf Temp_LSB,3

swapf Temp_LSB,F ;
swapf Temp_MSB,W ;

addwf Temp_LSB,F

; В регистре Temp_LSB лежит готовое шестнадцатиричное значение.

;--------------------------------------------------------------------------------------------
; Установка (или нет) признака добавления (к показаниям) символа "1"
; (признак устанавливается при температуре от 100 градусов и выше).
;--------------------------------------------------------------------------------------------
movlw .100 ;
subwf Temp_LSB,W ; Temp_LSB - .100 = ? Результат - в W.
btfss Status,C ; Результат положительный или отрицательный?
goto BIN2_10 ; Если отрицательный, то признак добавления символа "1"
; не устанавливается (бит №7 регистра Flag=0).
bsf Flag,7 ; Если положительный, то устанавливается
; (бит №7 регистра Flag=1).

BIN2_10:
goto $


ENTER_BF:
return

end ; Конец программы.


Проверьте. Ошибки нет.
В Вашей программе уже есть ошибка. К байту Temp_LSB после инвертирования нужно прибавить единицу и если есть переполнение, то и к байту Temp_MSB, поднимите исходник, убедитесь.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 112
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 29.03.07 13:04. Заголовок: Re:


Вот здесь

http://up-file.com/download/8f551c467316/ds18b20.asm.html

я выложил полный текст программы Корабельникова Е.А., переделанный под DS18B20. Изменения выделены, погоняйте в MPLAB'е (там есть четыре заремированных строки, найдете без проблем). Я гонял вчера, работает четко. На работе у меня стоит испанская винда и работать корректно с русскими символами в MPLAB'е я не могу. Поэтому есть только те комментарии, что есть. Пробуйте.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 25
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.03.07 14:51. Заголовок: Re:


Alberto пишет:

 цитата:
Проверьте. Ошибки нет.



Работает на УРА!
Вот так наверное будет лучше:
Скрытый текст

На две команды меньше.
За ссылку спасибо. С меня и крабы!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 100
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.03.07 11:22. Заголовок: Re:


RW1ZK пишет:

 цитата:
Мне кажется, что Протеус врёт. Девайс больше +127.5 не показывает.




Симулятор, он и есть симулятор, и конечно же необходима проверка в железе.
По тому, я всегда оговаривался, что симулировал в Рroteus, или железе.

Alberto пишет:

 цитата:
я выложил полный текст программы Корабельникова Е.А., переделанный под DS18B20.


Скачал Ваш исходник, проверил в Рroteus, и все бы хорошо, если бы не
ошибка на температуре -32.
Показывает:
-31 = -31
-32 = -16 ???
-33 = -33
Проверялось в Протеусе, по этому желательно перепроверить Вашими, доступными
методами.
Ели можно, то выложу проект для Протеуса, в котором есть исходник(.ASM), для
работы и с 1820 и с 18b20, инициализация ЖКИ, которая работает и в Протеусе,
и в железе.
Спрашиваю по тому, что выложенная информация, на файлообменнике, так или
иначе, становится общедоступной.
К сожалению, я так и не запустил инициализацию ЖКИ по флагу BF в Протеусе,
хотя в железе все работает отлично. Это пример того, что симулятор остается
симулятором, не более, но все же, жизнь немного облегчает ИМХО.


Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 115
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг: 0

Награды: Отлично!',
ссылка на сообщение  Отправлено: 30.03.07 14:29. Заголовок: Re:


В тексте программы есть четыре заремированные строки, что то типа
movlw      b'11111110' 
movwf Temp_MSB
movlw b'01101111'
movwf Temp_LSB

в них я подставлял значения из даташита (попробуйте в MPLAB'е, не так красиво как в Протеусе, но... если понять принцип, то надежнее однозначно). А по поводу Протеуса, Вы сами сказали - "симулятор". Главное понять принцип и то, что нужно получить. У меня нет DS18B20, поэтому в железе проверить не могу, но могу дать 99,9% гарантии что все работает (оставлю 0,01% на опечатки). Подождем, может у кого-либо есть данный датчик и он сможет проверить работу программы в реальном устройстве.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 28
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.03.07 15:17. Заголовок: Re:


vintik пишет:

 цитата:
Скачал Ваш исходник, проверил в Рroteus, и все бы хорошо, если бы не
ошибка на температуре -32.
Показывает:
-31 = -31
-32 = -16 ???
-33 = -33



Прогнал в MPLAB. Действительно так! Вместо -32 получается -16!!!

Temp_LSB b'00000000'
Temp_MSB b'11111110'

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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 101
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.03.07 15:41. Заголовок: Re:


Alberto пишет:

 цитата:
У меня нет DS18B20, поэтому в железе проверить не могу


У меня есть, но проверить вжелезе тоже не могу,- нет такой температуры
RW1ZK пишет:

 цитата:
Прогнал в MPLAB. Действительно так!


            comf       Temp_MSB,F  ; Все биты байта Temp_MSB инвертируются 
comf Temp_LSB,F ; биты младшего байта температуры инвертируются
incf Temp_LSB,F ; биты младшего байта температуры инвертируются
btfsc Status,2 ; Был перенос?
incf Temp_MSB,F ; "ДА" - инкремент регистра Temp_MSB
; и к результату прибавляется 1.

Попробуйте проверять битом Z.
Не знаю почему, но бит С Status, на перенос не реагирует.

Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 102
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.03.07 18:17. Заголовок: Re:


RW1ZK пишет:

 цитата:
Теперь всё верно.



А чтож верно, Вы в морозилку датчик помещали!??
С половинками градуса...., перед инверсией наверное нужно
сдвинуть влево оба байта, тогда третий бит в LSB останется живой,
а на третий MSB нам начхать , его заменит второй, неся
ту же информацию.
А если сдвинуть два раза, то и точность можно увеличить, ИМХО.

Пошевелил извилиной, хоть она и прямая , но выдала, что
двигать лучше вправо, тогда останеся живой седьмой бит LSB,
который несет в себе инфу.
Или переписывать в другой регистр через RLF и Status,C.


Я не МАГ, я только учусь. Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 104 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия