Пост 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-ти разрядного. И вся любовь. Можно, конечно, задаться целью вывести на индикацию и все четыре знака после запятой, но это уже другая история, на любителя.
Пост N: 40
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 05.03.07 13:53. Заголовок: Re:
Я тут еще раз даташит на DS18B20 посмотрел, погрешность у него такая же что и у DS1820 (+/-0,5 градуса) и если не принять специальных мер по калибровке (не ввести калибровочные коэффициенты), то смысла в выводе на индикатор лишних "цифирек" нет. Для калибровки нужен высокоточный образцовый термометр (дкмаю что у 90% радиолюбителей доступа к такому нет), отсюда практический вывод: переводим его в 9-ти разрядный режим и дело с концом. Для большинства применений погрешности в пол-градуса достаточно.
Пост N: 105
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг:
0
Отправлено: 05.03.07 14:09. Заголовок: Re:
Alberto пишет:
цитата:
высокоточный образцовый термометр
Такой термометр есть почти у каждого - это медицинский ртутный термометр. Сначала измеряется температура тела с помощью медицинского термометра, а затем с помощью DS18B20.
Пост N: 45
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 05.03.07 14:37. Заголовок: Re:
Ну нет, не скажите. У него какие пределы? От 30 до 42 градусов с точностью 0,1 градуса, а Вам будет нужен от 0 до 100 градусов с лишним и с погрешностью (посмотрите даташит) в 0,001 градуса. Есть у Вас такой? А по одной точке (температура тела 36,6) Вы ничего не откалибруете. Даже если измерить температуру тела больного, умирающего друга (42 градуса) у Вас ничего не получится. "Циферки" бегать будут, а толку никакого.
Пост 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 градуса.
Пост 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, так что все дальнейшие (как и предыдущие) рассуждения это просто мои рассуждения. Я бы сделал так: контролировал бы сотые, а дальше уход в два сценария, если меньше пяти оставляем десятки без изменения, если пять и больше прибавляем единицу к десяткам.
Перед вызовом этой подпрограммы в регистр TEMP_READL следует скопировать младший байт, считанный из DS18B20. В результате работы этой подпрограммы, в аккумуляторе будет число (т. е. десятые доли градуса) от 0 до 9, которое без каких либо преобразований можно вывести на индикатор.
Пост N: 79
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 09.03.07 19:45. Заголовок: Re:
Dmitry Dubrovenko пишет:
цитата:
Общеизвестен, как ключ TouchMemory
он самый , на основе информации от КЕА можете "слепить" такую же систему доступа за один вечер . А добавив сюда DS2415 можно добавить фиксацию времени или проход в строго определенное время, или по определенным дням... Возможности практически безграничны
Пост 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 сек роли не играют) отображаем ранее считанную информацию, а в это время в датчике идет процесс преобразования температуры, далее все опять повторяется), то можно сделать малогабаритный и дешевый термометр с довольно высокими эксплуатационными характеристиками.
Пост N: 86
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 20.03.07 18:57. Заголовок: Re:
Alberto пишет:
цитата:
можно сделать так что программа будет работать и с DS1820, и с DS18B20, т.е. будет универсальной
Как раз, встала такая проблема, DS18S20 небыло. С математикой еще не разобрался, но думал использовать первый полубайт для вывода .5 или .0 , тоесть с точностью пол градуса, и хоронить его потом. А следующие два полубайта преобразовывать, как в программе с DS18S20.
Пост N: 87
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 21.03.07 11:39. Заголовок: Re:
Может попробовать так, в счетчик битов ввести число 4, на четвертом бите проверить RA4, если бит4 =1 то .5 если бит4 =0 то .0 Затем в счетчик битов ввести число 8, и считать байт, операция деления отпадет, дальше по программе.. Может ошибаюсь
Пост N: 89
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 22.03.07 02:11. Заголовок: Re:
Alberto оказался прав, делением на 8 можно перейти с 18S20 на 18B20 практически не затронув материнской программы. Скрытый текст
;---------------------------------------------------------- ; Определение и вывод на индикацию знака температуры (+/-). ;---------------------------------------------------------- btfsc Temp_MSB,7 ; В бите №0 старшего байта температуры 0 или 1 ?
bsf Flag,5 ;DS18B20 -> Flag,5 =1 call IN_BYTE ; Чтение младшего байта температуры. ;----> Возврат по стеку из ПП IN_BYTE. movwf Temp_LSB ; Запись принятого байта в регистр Temp_LSB. bcf Flag,5 ;Сброс бита чтобы не мешался. call IN_BYTE ; Чтение старшего байта температуры.
IN_BYTE btfss Flag,5 ;Если DS18B20, то пятый бит =1, если DS18S20 =0 goto IN_BYTE_2 movlw .11 ; Запись количества бит принимаемого movwf N ; байта в регистр N. clrf Temp goto IN_BYTE_1 IN_BYTE_2 movlw .8 ; Запись количества бит принимаемого movwf N ; байта в регистр N. clrf Temp ; Очистка регистра принимаемого байта.
Пост 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 градуса. В старшем полубайте старшего байта - знак температуры (+/-). Переписав подпрограмму вычисления значения и знака температуры у меня получилось следующее: Скрытый текст
;*********************************************************************************************** ; Выбор 6-го слева знакоместа 2-й строки ;*********************************************************************************************** DISPLAY movlw b'11000101' ; Выбор ячейки DD RAM с адресом 45h, что соответствует ; установке курсора в 6-е слева знакоместо 2-й строки call ENTER_BF ; "Плавающая" задержка со стробом под команду 11000101 ;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов .0 или .5 ;*********************************************************************************************** clrf Flag ; Flag=0 btfsc Temp_LSB, 3 ; В бите 3 младшего байта 1 или 0 ? bsf Flag, 0 ; 1 - признак символа 5 btfsc Temp_MSB, 7 ; В бите 7 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS movlw 2BH ; 0, на индикацию bsf PORTA, RS ; выводится + call ENTER_BF ; Задержка goto PLUS ; Делим MINUS movlw 2DH ; На индикацию выводится bsf PORTA, RS ; символ - call ENTER_BF ; Задержка ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в Temp_LSB ; признак символа "5" в Flag, 0 ;*********************************************************************************************** comf Temp_LSB, f ; Инвертируем все биты temp_LSB incf Temp_LSB, f ; Увеличим его на 1 comf Temp_MSB, f ; Инвертируем все биты temp_MSB PLUS swapf Temp_LSB, f ; Поменяем местами старший и мл. п/байты Temp_LSB swapf Temp_MSB, w ; и Temp_MSB iorwf Temp_LSB, f ; результат операции в Temp_LSB bcf Temp_LSB, 7 ; Температуры больше +125 не будет;*********************************************************************************************** ; Установка (или нет) признака добавления (к показаниям) символа "1" ; (признак устанавливается при температуре от 100 градусов и выше) ;*********************************************************************************************** ; программа по тектсту исполняется далее
Можно применить и деление на 16, но тогда будет использовано больше команд. Вопрос к тем, кто уже прошёл эту стадию, всё-ли правильно? Измеритель температуры работает, но верно-ли?
Пост N: 95
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 26.03.07 15:42. Заголовок: Re:
Может грубо, но так и в железе работает: Скрытый текст
[MINUS movlw 2DH ; На индикацию выводится bcf Temp_LSB, 3 bcf Temp_LSB, 2 bcf Temp_LSB, 1 bcf Temp_LSB, 0 bsf PortA, RS ; символ - call ENTER_BF ; Задержка ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в Temp_LSB ; признак символа "5" в Flag, 0 ;*********************************************************************************************** comf Temp_LSB, f ; Инвертируем все биты temp_LSB incf Temp_LSB, f ; Увеличим его на 1 comf Temp_MSB, f ; Инвертируем все биты temp_MSB PLUS bcf Temp_LSB, 3 bcf Temp_LSB, 2 bcf Temp_LSB, 1 bcf Temp_LSB, 0 swapf Temp_LSB, f ; Поменяем местами старший и мл. п/байты Temp_LSB swapf Temp_MSB, w ; и Temp_MSB iorwf Temp_LSB, f ; результат операции в Temp_LSB bcf Temp_LSB, 7 ; Температуры больше +125 не будет ;-------------------------------------------------------------------------------------------- ; Установка (или нет) признака добавления (к показаниям) символа "1" /pre]
Пост N: 96
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 26.03.07 17:29. Заголовок: Re:
И еще, при охдаждении датчика не правильно показывает половинки градуса. Т.е. -10,5 => -10 => -11.5 => -11 => -12.5 => -12 А если убрать доли градуса, то нормально, работает
;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов 0 или 5 ;*********************************************************************************************** movlw .4 ; Используем 4 сдвига movwf N ; влево clrf Flag ; Flag=0 btfsc Temp_LSB, 3 ; В бите 3 младшего байта 1 или 0 ? bsf Flag, 0 ; 1 - признак символа 5 btfsc Temp_MSB, 7 ; В бите 3 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS movlw 2BH ; 0, на индикацию bsf PORTA, RS ; выводится + call ENTER_BF ; Задержка goto PLUS ; Делим MINUS movlw 2DH ; На индикацию выводится bsf PORTA, RS ; символ - call ENTER_BF ; Задержка ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в temp_MSB ; признак символа "5" в flag, 0 ; В строке LOOP_16 заменить Temp_LSB на Temp_MSB ;*********************************************************************************************** comf Temp_MSB, f ; Инвертируем Temp_MSB comf Temp_LSB, f ; и Temp_LSB PLUS bcf STATUS, C ; Сброс флага переноса-заёма rlf Temp_MSB, f ; Сдвиг сташего rlf Temp_LSB, f ; и младшего байта влево btfsc STATUS, C ; Перенос был? incf Temp_MSB, f ; Да, увеличим на 1 значение Temp_MSB decfsz N, f ; Нет, продолжим goto PLUS ; деление
У кого найдётся возможность проверить в Протеусе и железе? Спасибо!
Пост 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 градуса? В диапазоне положительных температур перекодировка работает корректно.
Пост 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.
Пост N: 99
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 28.03.07 12:50. Заголовок: Re:
Поменял направление сдвига (rlf ->rrf), в положительном секторе стал показывать корректно, но до +127, +128 показывает, как +95!? В отрицательном секторе, вообще фигня какаято. На -1 показывает -124, -2 > -125 и т.д. Мне кажется, Вы теряете информацию при опросе DS, в материнской программе, она лежит в одном байте, а в данном случае она разбивается на два байта(если не ошибаюсь). Пробовал только в Протеусе.
Пост N: 13
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 28.03.07 12:52. Заголовок: Re:
Для гашения нуля необходимо в п/п вывода на индикацию пары символов ",0" или ",5" после вывода символа "5" и возврата из ENTER_BF прописать строки:Скрытый текст
Пост N: 14
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 28.03.07 13:18. Заголовок: Re:
Странно... Ниже отдельная п/п перекодировки. Скрытый текст
;*********************************************************************************************** list p=16F84a ; Используется PIC16F84A #include <p16F84A.inc> ; Файл, описывающий специфические переменные, ; соответствующие процессору __CONFIG 03FF1H ; WDT выключен, бит защиты не установлен ;*********************************************************************************************** RS EQU 1 ; Вывод RA1 - линия RS Temp EQU 10H ; Регистр хранения кода знака температуры Flag EQU 11H ; Регистр временного хранения Temp_LSB EQU 12H ; Младший регистр температуры Temp_MSB EQU 13H ; Старший регистр температуры N EQU 14H ; Количество сдвигов при преобразовании кода ;*********************************************************************************************** ORG 0x000 ; Начальный адрес ;*********************************************************************************************** clrf PORTA ; Настройка портов clrf PORTB ; bsf STATUS, RP0 ; clrf PORTA ; clrf PORTB ; bcf STATUS, RP0 ; ;*********************************************************************************************** clrf Temp ; Очистим clrf Temp_LSB ; clrf Temp_MSB ; clrf N ; всё bsf N, 2 ; N=4 ;*********************************************************************************************** movlw b'11010000' ; Загрузим регистры movwf Temp_LSB ; температуры movlw b'00000111' ; значением movwf Temp_MSB ; +125 градусов ;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов 0 или 5 ;*********************************************************************************************** clrf Flag ; Flag=0 btfsc Temp_LSB, 3 ; В бите 3 младшего байта 1 или 0 ? bsf Flag, 0 ; 1 - признак символа 5 btfsc Temp_MSB, 7 ; В бите 7 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS movlw 2BH ; 0, на индикацию movwf Temp ; выводится + bsf PORTA, RS ; call ENTER_BF ; Задержка goto PLUS ; Делим MINUS movlw 2DH ; На индикацию movwf Temp ; выводится bsf PORTA, RS ; символ - call ENTER_BF ; Задержка ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в temp_MSB ; признак символа "5" в flag, 0 ; код выводимого знака температуры (+/-) в Temp ;*********************************************************************************************** comf Temp_MSB, f ; Инвертируем Temp_MSB comf Temp_LSB, f ; и Temp_LSB PLUS bcf STATUS, C ; Сброс флага переноса-заёма rlf Temp_MSB, f ; Сдвиг сташего rlf Temp_LSB, f ; и младшего байта влево btfsc STATUS, C ; Перенос был? incf Temp_MSB, f ; Да, увеличим на 1 значение Temp_MSB decfsz N, f ; Нет, продолжим goto PLUS ; деление goto $ ; ;*********************************************************************************************** ENTER_BF return ;*********************************************************************************************** END ; Конец программы
В регистры Temp_МSB и Temp_LSB загружаем значения из datasheet:
Мне кажется, что Протеус врёт. Девайс больше +127.5 не показывает. Показания замирают на вышеуказанном значении. Просьба к модератору форума: было-бы неплохо иметь возможность прикреплять файлы, чтобы не засорять экран листингом программы.
Пост 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.
Пост 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 получается чётко! Вот с этим подводным камнем столкнулся и я. И мне кажется, что я его обошёл (обошёл ли?). Теперь надо найти вариант уменьшения числа команд. Убедительная просьба проверить то, что получилось у меня.
Пост N: 23
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 29.03.07 09:47. Заголовок: Re:
Ниже ещё один переработанный вариант под DS18B20. П/программа стала меньше на 3 команды, убран цикл подсчёта количества сдвигов. Скрытый текст
;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов 0 или 5 ;*********************************************************************************************** clrf Flag ; Flag=0 btfsc Temp_LSB, 3 ; В бите 3 младшего байта 1 или 0 ? bsf Flag, 0 ; 1 - признак символа 5 btfsc Temp_MSB, 7 ; В бите 7 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS movlw 2BH ; 0, на индикацию bsf PORTA, RS ; выводится + call ENTER_BF ; Задержка goto PLUS ; Преобразвание положительного числа MINUS movlw 2DH ; На индикацию выводится bsf PORTA, RS ; символ - call ENTER_BF ; Задержка ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в temp_MSB ; признак символа "5" в flag, 0 ; В п/п установки (или нет) признака добавления (к показаниям) символа "1" ; и в строке LOOP_16 заменить Temp_LSB на Temp_MSB ;*********************************************************************************************** comf Temp_MSB, f ; Инвертируем все биты Temp_MSB comf Temp_LSB, f ; и Temp_LSB PLUS swapf Temp_MSB, w ; Меняем местами ст. и мл. п/б Temp_MSB -> W andlw 0F0H ; Убьём мл. п/байт W movwf Temp_MSB ; Перекинем W в Temp_MSB swapf Temp_LSB, w ; Меняем местами ст. и мл. п/б Temp_LSB -> W andlw 0FH ; Убьём ст. п/байт W addwf Temp_MSB, f ; Конечный результат в Temp_MSB ;***********************************************************************************************
Верхний предел измеренной температуры равен +127.5 градуса. С отрицательным значением проблема (мне бы на своё служебное место криогенную камеру, на худой случай холодильник...).
Пост 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
; В регистре 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, поднимите исходник, убедитесь.
я выложил полный текст программы Корабельникова Е.А., переделанный под DS18B20. Изменения выделены, погоняйте в MPLAB'е (там есть четыре заремированных строки, найдете без проблем). Я гонял вчера, работает четко. На работе у меня стоит испанская винда и работать корректно с русскими символами в MPLAB'е я не могу. Поэтому есть только те комментарии, что есть. Пробуйте.
Пост N: 25
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 29.03.07 14:51. Заголовок: Re:
Alberto пишет:
цитата:
Проверьте. Ошибки нет.
Работает на УРА! Вот так наверное будет лучше: Скрытый текст
PLUS clrf Flag ; Flag=0 btfsc Temp_LSB, 3 ; Бит 3 Temp_LSB = 1? bsf Flag, 0 ; Да, признак 0.5 градуса swapf Temp_LSB, w ; Поменяем местами п/б Temp_LSB -> W andlw 0FH ; Убьём старший п/б W movwf Temp_LSB ; W -> Temp_LSB swapf Temp_MSB, w ; Поменяем п/б Temp_MSB -> W addwf Temp_LSB, f ; Результат преобразования в Temp_LSB
На две команды меньше. За ссылку спасибо. С меня и крабы!
Пост 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 в Протеусе, хотя в железе все работает отлично. Это пример того, что симулятор остается симулятором, не более, но все же, жизнь немного облегчает ИМХО.
в них я подставлял значения из даташита (попробуйте в MPLAB'е, не так красиво как в Протеусе, но... если понять принцип, то надежнее однозначно). А по поводу Протеуса, Вы сами сказали - "симулятор". Главное понять принцип и то, что нужно получить. У меня нет DS18B20, поэтому в железе проверить не могу, но могу дать 99,9% гарантии что все работает (оставлю 0,01% на опечатки). Подождем, может у кого-либо есть данный датчик и он сможет проверить работу программы в реальном устройстве.
Пост 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'
Рабочий девайс у меня есть. В зоне положительных температур проверен, глюков нет. А по отрицательным проверить не смогу, тем более до таких температур. Зима закончилась...
Пост N: 102
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 18:17. Заголовок: Re:
RW1ZK пишет:
цитата:
Теперь всё верно.
А чтож верно, Вы в морозилку датчик помещали!?? С половинками градуса...., перед инверсией наверное нужно сдвинуть влево оба байта, тогда третий бит в LSB останется живой, а на третий MSB нам начхать , его заменит второй, неся ту же информацию. А если сдвинуть два раза, то и точность можно увеличить, ИМХО.
Пошевелил извилиной, хоть она и прямая , но выдала, что двигать лучше вправо, тогда останеся живой седьмой бит LSB, который несет в себе инфу. Или переписывать в другой регистр через RLF и Status,C.
Все даты в формате GMT
3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет