Пост 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.
Пост N: 103
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 19:08. Заголовок: Re:
Alberto пишет:
цитата:
Зачем Вам их сдвигать влево?
При измерении минусовой температуры происходит ошибка с половинками градуса, это третий бит LSB, а он, теряется при преобразовании в положительное число, или, преобразуется не корректно. Выше, об этом уже писалось, просмотрите всю тему. А вообще, этот вопрос уже решен, только другим способом, но и этот вариант интересен, если увеличить точность
Пост N: 117
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 30.03.07 19:47. Заголовок: Re:
vintik пишет:
цитата:
это третий бит LSB, а он, теряется при преобразовании в положительное число
почему? Вот кусок кода
SDVIG: clrf Flag ; Очистить регистр флагов btfsc Temp_LSB,3 ; Определить знак температуры. Бит 3 регистра Temp_LSB равен "0"? bsf Flag,0 ; "НЕТ" - установить признак отрицательной температуры (бит 3 = "1") ; "ДА" - программа выполняется дальше 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_MSB с сохранением ; результата в регистре W
addwf Temp_LSB,F ; Сложить значение в регистре Temp_LSB с содержимым ; регистра W с сохранением результата в нем же, т.е. ; своеобразный аналог четырех сдвигов вправо обоих регистров
где видно что сначала определяется признак наличия половинки градуса и при его наличии выставляется флаг (bsf Flag,0). Другое дело что текст описания не откорректирован, это моя вина, просто как я уже писал Винда у меня испанская и в MPLAB'е у меня вот такая картинка и ничего поделать не могу (компьютер на работе, винда лицензионная, испанская). Как Вы проверяли программу? Я прогнал в MPLAB'е, никаких проблем. Ничего не теряется. Вкратце опишу процедуру преобразования отрицательных чисел (считаем что по биту 7 байта Temp_MSB знак уже определен): имеем -25,0625 - это 1111 1110 0110 11111 инвертируем его: 0000 0001 1001 0000 инкрементируем: 0000 0001 1001 0001 определяем наличие половинки градуса (бит 3 байта Temp_LSB, выделено красным), выставляем признак наличия (bsf Flag,0), меняем местами тетрады обоих байтов: 0001 0000 0001 1001, из них берем то, что выделено красным, получаем 0001 1001 - это 25. Где Вы увидели потерю половинки байта? Проделайте те же процедуры для любого другого значения... и привидите мне аргументированное (с примерами) возражение. Еще раз прошу прощения за то, что не исправил комментарии, но это объективные причины и тут я бессилен.
Пост N: 104
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 20:49. Заголовок: Re:
Не знаю что происходит, но, при охлаждении датчика температура высвечивается в порядке: -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 В исходнике (DS1820.asm) такого нет, работает корректно: -1,0 -1,5 -2,0 -2,5 -3,0 -3,5
Поверте мне наслово.
И дело не в комментариях, а в работе, извините, если чемто огорчил, но в математике пока никакой, надеюсь пока
Пост N: 105
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 30.03.07 21:25. Заголовок: Re:
RW1ZK, вот ссылка на адаптированный под DS18B20 исходник, попробуйте его, что он Вам покажет, и сравните с работой сегоднешнего. Я свой охлаждал в морозилке, или нагревал паяльником.
Пост N: 30
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 30.03.07 21:28. Заголовок: Re:
vintik пишет:
цитата:
А чтож верно, Вы в морозилку датчик помещали!??
Увы, нет. Конструкция осталась на служебном месте и проверить смогу только в понедельник вечером. Таблица кодировки отрицательных чисел следующая: -0.5 -> FFF8H -1.0 -> FFF0H -1.5 -> FFE8H -2.0 -> FFE0H -2.5 -> FFD8H -3.0 -> FFD0H И так далее... Ниже злополучный кусок кода. Подставляя в Temp_MSB и Temp_LSB значения от FFF8H и меньше всё получается верно. Скрытый текст
;*********************************************************************************************** movlw b'11111000' ; Загрузим movwf Temp_LSB ; регистры movlw b'11111111' ; movwf Temp_MSB ; ;*********************************************************************************************** ; Определение знака температуры (+ или -) и признака символов .0 или .5 ;*********************************************************************************************** btfsc Temp_MSB, 7 ; В бите 7 старшего байта 1 или 0 ? goto MINUS ; 1, переход в п/п MINUS bsf Znak, 0 ; выводится + goto PLUS ; MINUS bcf Znak, 0 ; выводится - ;*********************************************************************************************** ; Подпрограмма обработки двух принятых байтов с данными температуры ; результат работы подпрограммы: код, соответствующий значению температуры в Temp_LSB ; признак символа "5" в _5, 0 ;*********************************************************************************************** comf Temp_MSB, f ; Инвертируем все биты Temp_MSB comf Temp_LSB, f ; и Temp_LSB incf Temp_LSB, f ; увеличим на 1 Temp_LSB btfsc STATUS, Z ; Есть перенос? incf Temp_MSB, f ; Да, увеличим на 1 Temp_MSB PLUS clrf _5 ; Очистим регистр признака 0.5 btfsc Temp_LSB, 3 ; Бит 3 Temp_LSB = 1? bsf _5, 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
Прогоните в MPLAB. Конечный результат соответствует исходному коду. P.S. Файл скачал, можно убивать.
Пост N: 55
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 31.03.07 02:38. Заголовок: Re:
Уважаемые коллеги. Перечитал то что написано, после чего настроение резко улучшилось, так как я убедился в том, что происходит не “тусовка”, а предметный разговор думающих людей, которые реально стремятся решить конкретную техническую задачу и разговаривают на одном языке, причем, вполне корректно. Между прочим, это достаточно большая редкость и это нужно всячески ценить. То, что имеются какие-то “непонятки” и люди еще до конца “не притерлись” друг к другу, абсолютно нормально и естественно (эти дела “с реактивным свистом” не делаются). Я бы сильно удивился, если бы этого не было. Так или иначе, именно это и есть реальная работа (нормальный, рабочий процесс), которая рано или поздно принесет свои “девиденды”. Не ошибается только тот, кто не работает. Банально? Вне всякого сомнения, но это и есть истина, только уставшая. “Первопроходцем” быть всегда трудно, и для этого, как минимум, нужно иметь “хулиганские” задатки и быть не из робкого десятка. А вот это уже очень серьезно и весомо. Это называется “бойцовским” характером, который в магазине не купишь ни за какие деньги, но который каждый в себе может воспитать, если не будет шарахаться от каждого чиха и не будет занимать наблюдательную (выжидательную) позицию. Ну получил “фингал”. Эка невидаль. Весь мир на “фингалах” учится, потому и развивается. Так, по определению, лучше всего “мозги прошибает”. Те, кто не понимают этой аксиомы, многое теряют. Для того чтобы ее по-настоящему понять, нужно заполучить целую “партию фингалов” (по другому как-то не получается), причем, с олимпиийским спокойствием и осознанным “бросанием на амбразуру”. Потом их будет меньше. Лично мне, очень приятно видеть этот процесс “вживую” в том смысле, что из этого однозначно будет толк (он, кстати, уже есть). Пожелание: обратите внимание на словосочетание “олимпийское спокойствие” и побольше внимания четкой, ясной и однозначной аргументации, так как много “недоразумений” возникает из-за “разнобоя”, связанного с неоднозначностью и недомолвками.
Пост N: 165
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг:
0
Отправлено: 31.03.07 18:00. Заголовок: Re:
Alberto пишет:
цитата:
что значит подружить
Программа "Cyra.exe " не русифицирует винду, а просто исправляет кодировку. Она вносит небольшие изменения в реестр, позволяющие использовать кодировку "Windows-1251". Поможет ли это в Вашем случае, я не знаю, но попробовать стоит. Если не поможет, есть ещё один способ - просто перетащить шрифты с Русской винды в Испанскую. Сделать это можно с помощью проги "PBFSetup.exe" , но предварительно нужно сохранить шрифты из испанской винды, на всякий случай. Скачать архив
Пост N: 121
Зарегистрирован: 12.02.07
Откуда: Аргентина, Линкольн
Рейтинг:
0
Награды:
Отправлено: 31.03.07 18:20. Заголовок: Re:
Пётр пишет:
цитата:
просто перетащить шрифты с Русской винды в Испанскую
это не помогло. Спасибо за программу , сейчас качаю. Буду пробовать. Есть еще один выход: поставить две винды, но тогда шефа могут поставить в "интересную позу" за использование пиратской копии , а потом он тоже самое сделает со мной , а это уже совсем не смешно .
Пост N: 31
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 03.04.07 12:57. Заголовок: Re:
Заметил ещё один глюк программы ds1820.asm. При выводе температуры меньше 10 градусов остаётся незначащий ноль. Для его гашения необходимы изменения в тексте программы: Скрытый текст
;*********************************************************************************************** ; Вывод (или нет) на индикацию символа "1" (выводится при Т=100 градусов и выше) ;*********************************************************************************************** btfss Flag, 7 ; Бит №7 регистра Flag =0 или =1 ? goto C_00_99 ; Если =0, то символ "1" на индикацию не выводится movlw 31H ; Если =1, то символ "1" (31H) bsf PORTA, RS ; на индикацию выводится call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию goto plus_0 ; Если температура больше 100, то выводим второй байт ;*********************************************************************************************** ; Вывод на индикацию двух символов результата измерения (в диапазоне от 0 до 99 градусов) ;*********************************************************************************************** C_00_99 movlw 30H ; Гасим xorwf LED1, w ; незначащий btfsc STATUS, Z ; ноль goto minus_0 ; Вывод второго байта без незначащего нуля plus_0 movf LED1, w ; Вывод на индикацию байта, bsf PORTA, RS ; записанного в регистре LED1 call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию minus_0 movf LED0, w ; Вывод на индикацию байта, bsf PORTA, RS ; записанного в регистре LED0 call ENTER_BF ; "Плавающая" задержка со стробом под вывод ; данных на индикацию ;***********************************************************************************************
Пост N: 56
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 03.04.07 15:05. Заголовок: Re:
Иван, это не глюк. Просто, на этом этапе работы, я не ставил себе целью гашение незначащих нулей. Обычно, такого рода “обслуга” задействуется на конечной стадии конструирования устройства, после того, как все более “глобальные” задачи последовательно решены. Так что Вы сработали на опережение, что, как сами понемаете, вовсе не есть плохо. Я же планирую сначала перевести программы DS1820_3 и _4 на шаг измерения 0,1 градус и после этого погасить незначащие нули. Если Ваша процедура оптимальна, то она будет использована. Спасибо за активное участие в обсуждении заявленной темы. Успехов Вам в работе!
Пост N: 108
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 03.04.07 15:46. Заголовок: Re:
Тоже пытался убрать:
Решил проблему через флаги, чистит нули и с передеди и с зади: Скрытый текст
;--------------------------------------------------------------------------------------------- ; Порязрядное распределение полубайтов. ;--------------------------------------------------------------------------------------------- swapf LED0,W ; Запись старшего полубайта LED0 andlw 0Fh ; в младший полубайт LED1 movwf LED1 ; btfss Status,Z ;Если байт LED1 =/= 0, то отмечаем Flag,2 = 1 bsf Flag,2 ; для последующего удаления незначащего "0" в десятках movfw LED0 ; Запись младшего полубайта LED0 andlw 0Fh ; в младший полубайт LED0 movwf LED0 ; goto ASC ; Переход в ПП ASC. ;---------------------------------------------------------------------------------------------
;============================================================================================= ; Вывод на индикацию двух символов результата измерения (в диапазоне от 00 до 99 градусов). ;============================================================================================= C_00_99 movf LED1,W ; Вывод на индикацию байта, btfsc Flag,7 ;Если есть сотня градусов, то независимо, goto ED1 ;выводится "0" цифра десятков btfss Flag,2 ;Если Flag,2 = 0, то цифра десятков goto ED ; на табло не выводится ED1 bsf PortA,RS ; записанного в регистре LED1. call ENTER_BF ; задержка со стробом под вывод ; данных на индикацию. ED movf LED0,W ; Вывод на индикацию байта, bsf PortA,RS ; записанного в регистре LED0. call ENTER_BF ; задержка со стробом под вывод ; данных на индикацию. ;=============================================================================================
Пост N: 38
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
0
Отправлено: 10.04.07 14:01. Заголовок: Re:
Сваял программу (на основе рассылки в рамках самоучителя) для чтения и вывода на ЖКИ содержимого ПЗУ температурных датчиков серии DSxxxx. Со своим датчиком DS18B20 проверил, работает ОК. Скрытый текст
;*********************************************************************************************** ; Read_PZU.asm Программа считывания данных из ПЗУ датчиков температуры DS..... ; и вывода на ЖКИ HD44780 (4-x разрядный интерфейс) ; в формате HEX (COD->XX XX XX XX XX XX XX XX<-CRC) ;*********************************************************************************************** ; Вывод DQ DS..... подключается к выводу RA4 ; Между RA4 и шиной питания резистор 4,7-5,1 кОм ; DS..... с активным питанием ; вывод 1 - общий ; вывод 2 - сигнальный, ; вывод 3 - питание (+5в) ;*********************************************************************************************** list p=16f84a ; Используется PIC16f84A #include <p16f84A.inc> ; Файл, описывающий специфические переменные, ; соответствующие процессору __CONfIG 03FF1H ; WDT выключен, бит защиты не установлен ;*********************************************************************************************** N EQU 0CH ; Счетчик битов, регистр временного хранения N1 EQU 0DH ; Счетчик байтов Temp EQU 0EH ; Многофункциональный регистр временного хранения Count EQU 0FH ; Счетчик количества проходов задержки 10 мкс Buff1 EQU 10H ; Байт типа устройства Buff2 EQU 11H ; 1-й байт серийного номера Buff3 EQU 12H ; 2-й байт серийного номера Buff4 EQU 13H ; 3-й байт серийного номера Buff5 EQU 14H ; 4-й байт серийного номера Buff6 EQU 15H ; 5-й байт серийного номера Buff7 EQU 16H ; 6-й байт серийного номера Buff8 EQU 17H ; Байт контрольной суммы (CRC) LED0 EQU 18H ; Младший байт выводимого числа LED1 EQU 19H ; Старший байт выводимого числа DQ EQU 4 ; Бит порта A для управления DS18B20 RW EQU 0 ; Вывод RA0 - линия RW RS EQU 1 ; Вывод RA1 - линия RS E EQU 2 ; Вывод RA2 - линия Е BF EQU 7 ; Флаг занятости BF RB7 ;*********************************************************************************************** ORG 0x000 ; Вектор сброса процессора ; Начальный адрес clrf PORTA ; Сброс защёлок порта А clrf PORTB ; и порта В bsf STATUS, RP0 ; 1-й банк clrf PORTA ; Выводы портов А clrf PORTB ; и портов В на выход bcf STATUS, RP0 ; 0-й банк ;*********************************************************************************************** ; Инициализация DS..... ;*********************************************************************************************** DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное состояние: за счет ; подтягивающего резистора, на линии устанавливается 1 call PIN_LO ; Установка на линии нуля movlw .60 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=60х10=600мкс.) call PIN_HI ; Установка вывода в высокоимпедансное состояние: за счет ; подтягивающего резистора, на линии устанавливается 1 movlw .7 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=7х10=70мкс.) ;*********************************************************************************************** ; Определение отклика на импульс сброса ;*********************************************************************************************** btfsc PORTA, DQ ; На линии DQ 0 или 1 (отклик есть или нет)? goto DQ_INIT ; Если отклика нет (1), то снова начинается ; исполнение процедуры инициализации movlw .50 ; Если отклик есть, то установка ; количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=50х10=500мкс.) ;*********************************************************************************************** ; Передача команды Read ROM для чтения ПЗУ DS..... ;*********************************************************************************************** movlw 033H ; Запись команды чтения ПЗУ (Read ROM) movwf Temp ; в регистр Temp movlw .8 ; Запись количества бит передаваемого movwf N ; байта в регистр N METKA_1 rrf Temp, f ; Сдвиг вправо содержимого передаваемого байта btfss STATUS, C ; В бите С "лежит" 0 или 1 ? goto OUT_0 ; Если С=0, то переход в ПП передачи нуля goto OUT_1 ; Если С=1, то переход в ПП передачи единицы METKA_2 decfsz N, f ; Уменьшение на 1 содержимого счетчика битов goto METKA_1 ; Если результат не =0, то переход на метку METKA_1 ;*********************************************************************************************** ; Чтение 8 байтов из ПЗУ DS..... ;*********************************************************************************************** movlw Buff1 ; В FSR записывается адрес movwf FSR ; регистра Buff1 movlw .8 ; Определение количества movwf N1 ; считываемых байтов SNOVA movlw .8 ; Запись количества бит принимаемого movwf N ; байта в регистр N clrf Temp ; Очистка регистра принимаемого байта IN_BYTE call PIN_LO ; Формирование на линии уровня 0 call PIN_HI ; Формирование на линии уровня 1 nop ; Калибровочный NOP ;*********************************************************************************************** ; Запись, в бит С, уровня текущего бита, выдаваемого DS..... в линию ;*********************************************************************************************** btfss PORTA, DQ ; На линии 0 или 1 ? bcf STATUS, C ; Если на линии 0, то в бите С выставляется 0 btfsc PORTA, DQ ; Если на линии 1 (а также после исполнения предыдущей ; команды), то еще одна проверка состояния линии bsf STATUS, C ; Если на линии 1, то в бите С выставляется 1 ; Если на линии 0 (а также после исполнения предыдущей ; команды), то программа исполняется далее ;*********************************************************************************************** ; Последовательное заполнение битами регистра Temp ;*********************************************************************************************** rrf Temp, f ; Сдвиг содержимого регистра Temp вправо (через C) movlw .4 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=4х10=40мкс.) decfsz N, f ; Уменьшение на 1 содержимого счетчика битов goto IN_BYTE ; Если результат не=0, то переход ; на прием следующего бита movf Temp, w ; Если =0, то копирование принятого байта в регистр w movwf INDF ; Копирование содержимого регистра w ; в текущий регистр Buff... incf FSR, f ; Запись в fSR адреса следующего регистра Buff... decfsz N1, f ; Декремент счетчика байтов goto SNOVA ; Приняты все байты? Нет, продолжим goto INIT_LCD ; Да, вывод в ЖКИ ;*********************************************************************************************** ; Передача бита с уровнем "0" ;*********************************************************************************************** OUT_0 call PIN_LO ; Переход в ПП установки уровня 0. Начало передачи movlw .6 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=6х10=60мкс.) call PIN_HI ; Переход в ПП установки уровня 1. Конец передачи goto METKA_2 ; Переход на исполнение процедуры декремента ; и анализа содержимого счетчика битов ;*********************************************************************************************** ; Передача бита с уровнем "1" ;*********************************************************************************************** OUT_1 call PIN_LO ; Переход в ПП установки уровня 0. Начало передачи call PIN_HI ; Переход в ПП установки уровня 1. (передача 1) movlw .6 ; Установка количества проходов по 10мкс call PAUSE_X ; Переход в ПП задержки (задержка=6х10=60мкс.) goto METKA_2 ; Переход на новый цикл передачи бита ;*********************************************************************************************** ; Инициализация ЖКИ ;*********************************************************************************************** INIT_LCD movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000 movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000 movlw b'00001100' ; Установка: дисплей включен, видимое отображение ; курсора выключено call ENTER_BF ; "Плавающая" задержка со стробом под команду 00001100 movlw b'00000001' ; Установка: очистка дисплея со сбросом данных, ; установка курсора в начало 1-й строки call ENTER_BF ; "Плавающая" задержка со стробом под команду 00000001 ;*********************************************************************************************** ; Вывод в первую строку надписи "COD->" ;*********************************************************************************************** movlw .5 ; Количество выводимых в строку movwf Count ; символов в Count WR_1 movf Count, w ; Копируем Count в w sublw .5 ; 5-Count call TEXT ; В п/п TEXT bsf PORTA, RS ; Вывод на индикацию текущего символа call ENTER_BF ; Задержка decfsz Count, f ; Вывод следующего goto WR_1 ; символа ;*********************************************************************************************** ; Вывод первых четырёх принятых байтов ;*********************************************************************************************** movlw .4 ; Определение количества movwf N1 ; считываемых байтов movlw Buff1 ; В FSR записывается адрес movwf FSR ; регистра Buff1 call OUTPUT ; В п/п преобразования и вывода на ЖКИ ;*********************************************************************************************** ; Вывод во вторую строку последних четырёх байтов ;*********************************************************************************************** movlw b'11000000' ; Выбор ячейки DD RAM с адресом 40Н call ENTER_BF ; 2-я строка 1-е слева знакоместо movlw .4 ; Определение количества movwf N1 ; считываемых байтов movlw Buff5 ; В FSR записывается адрес movwf FSR ; регистра Buff5 call OUTPUT ; В п/п преобразования и вывода на ЖКИ ;*********************************************************************************************** movlw b'11001011' ; Выбор ячейки DD RAM с адресом 4ВН call ENTER_BF ; 2-я строка 12-е слева знакоместо ;*********************************************************************************************** ; Вывод во вторую строку надписи <-CRC ;*********************************************************************************************** movlw .5 ; Количество выводимых в строку movwf Count ; символов в Count WR_2 movf Count, w ; Копируем Count в w sublw .5 ; 5-Count call TEXT1 ; В п/п TEXT1 bsf PORTA, RS ; Вывод на индикацию текущего символа call ENTER_BF ; Задержка decfsz Count, f ; Вывод следующего goto WR_2 ; символа ;*********************************************************************************************** goto $ ; Баста карапузики! ;*********************************************************************************************** ; п/п преобразования данных в код ЖКИ HD44780 ;*********************************************************************************************** OUTPUT movf INDF, w ; Скопируем данные в w movwf N ; и во временный регистр N andlw 0FH ; Убьём старший п/байт movwf LED0 ; Младший п/байт в LED0 movlw 0AH ; Запись в регистр w числа 0AH subwf LED0, w ; Вычесть из w значение LED0 btfsc STATUS, C ; Выводим цифру или символ? goto ASC_LED0 ; Символ movlw 30H ; Запись в регистр w числа 30H iorwf LED0, f ; Логическое "ИЛИ" содержимого w и LED0 METKA_3 swapf N, w ; Поменяем местами п/байты временного регистра N andlw 0FH ; Убьём старший п/байт movwf LED1 ; Младший п/байт в LED1 movlw 0AH ; Запись в регистр w числа 0AH subwf LED1, w ; Вычесть из w значение LED1 btfsc STATUS, C ; Выводим цифру или символ? goto ASC_LED1 ; Символ movlw 30H ; Запись в регистр w числа 30H iorwf LED1, f ; Логическое "ИЛИ" содержимого w и LED1 goto DISPLAY ; Проверка и преобразование закончено, на вывод ASC_LED0 movlw 37H ; Запись в регистр w числа 37Н addwf LED0, f ; Для выводимого символа значение LED0 увеличть на 37Н goto METKA_3 ; Проверка для LED1 ASC_LED1 movlw 37H ; Запись в регистр w числа 37Н addwf LED1, f ; Для выводимого символа значение LED1 увеличть на 37Н return ; Возврат из п/п ;*********************************************************************************************** ; п/п вывода преобразованных данных на ЖКИ ;*********************************************************************************************** DISPLAY movf LED1, w ; вывод bsf PORTA, RS ; готовых call ENTER_BF ; данных movf LED0, w ; на bsf PORTA, RS ; индикацию call ENTER_BF ; Задержка movlw 20H ; Вывод на индикацию bsf PORTA, RS ; символа "пусто" call ENTER_BF ; Задержка incf FSR, f ; Запись адреса следующего регистра Buff... decfsz N1, f ; Декремент счётчика байтов. Всё вывели? goto OUTPUT ; Нет, продолжим return ; Возврат из п/п ;*********************************************************************************************** ; ПП "плавающей" задержки на основе анализа состояния флага занятости BF ;*********************************************************************************************** ENTER_BF movwf Temp ; Переправка старшего п/байта регистра W на линии movwf PORTB ; RB4...7 ;*********************************************************************************************** ; Запуск в работу старшего п/байта (строб) ;*********************************************************************************************** nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на линии Е "1" nop ; Задержка в 1 м.ц bcf PORTA, E ; Установка на линии Е "0" swapf Temp, w ; Смена п/байтов с сохранением результата операции в W movwf PORTB ; Переправка младшего п/байта регистра W на линии ; RB4...7 ;*********************************************************************************************** ; Запуск в работу младшего п/байта (строб) ;*********************************************************************************************** nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на линии Е "1" nop ; Задержка в 1 м.ц bcf PORTA, E ; Установка на линии Е "0" ;*********************************************************************************************** ; Проверка состояния флага занятости BF ; Подготовка к проверке ;*********************************************************************************************** bsf STATUS, RP0 ; Переход в 1-й банк movlw b'11110000' ; Запись в W "11110000" movwf PORTB ; RB4...7 работают на вход, а RB0...3 работают на выход bcf STATUS, RP0 ; Переход в 0-й банк bcf PORTA, RS ; Установка на линии RS "0" (режим команд) bsf PORTA, RW ; Линия RW в "1" (режим чтения данных) nop ; Задержка в 1 м.ц bsf PORTA, E ; Установка на лини Е "1" POVTOR nop ; Задержка в 1 м.ц ;*********************************************************************************************** btfsc PORTB, BF ; Проверка состояния флага занятости BF goto POVTOR ; Если BF=1, то продолжение задержки до тех пор, пока ; BF не установится в "0" (программа исполняется далее) clrf PORTA ; Сброс в "0" всех защелок порта А (RW=0, RS=0, E=0) bsf STATUS, RP0 ; Переход в 1-й банк clrf PORTB ; Все выводы порта В работают на выход bcf STATUS, RP0 ; Переход в 0-й банк return ; Возврат по стеку ;*********************************************************************************************** ; Формирование на линии уровня "1" за счет подтягивающего резистора ;*********************************************************************************************** PIN_HI bsf STATUS, RP0 ; Переход в банк 1 bsf PORTA, DQ ; Настройка вывода RA4 на работу "на вход" bcf STATUS, RP0 ; Переход в банк 0 return ; Возврат по стеку ;*********************************************************************************************** ; Формирование на линии уровня "0" средствами микроконтроллера ;*********************************************************************************************** PIN_LO bcf PORTA, DQ ; Установка 0 на выходе защелки вывода RA4 bsf STATUS, RP0 ; Переход в банк 1 bcf PORTA, DQ ; Настройка вывода RA4 на работу "на выход" bcf STATUS, RP0 ; Переход в банк 0 return ; Возврат по стеку ;*********************************************************************************************** ; Подпрограмма задержки ;*********************************************************************************************** PAUSE_X movwf Count ; Копирование количества проходов из w в Count ;*********************************************************************************************** ; Пауза в 10 мкс. ;*********************************************************************************************** PAUSE_10 nop ; goto $+1 ; Одноразрядный, goto $+1 ; вычитающий goto $+1 ; счетчик decfsz Count, f ; с "врезкой" goto PAUSE_10 ; return ; Возврат по стеку ;*********************************************************************************************** TEXT addwf PCL, f ; Приращение РС на величину содержимого w retlw 43H ; "C" retlw 4FH ; "O" retlw 44H ; "D" retlw 2DH ; "-" retlw 3EH ; ">" ;*********************************************************************************************** TEXT1 addwf PCL, f ; Приращение РС на величину содержимого w retlw 3CH ; "<" retlw 2DH ; "-" retlw 43H ; "C" retlw 52H ; "R" retlw 43H ; "C" ;*********************************************************************************************** END ; Конец программы
Пост N: 109
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 10.04.07 18:25. Заголовок: Re:
RW1ZK пишет:
цитата:
Сваял программу (на основе рассылки в рамках самоучителя) для чтения и вывода на ЖКИ содержимого ПЗУ температурных датчиков серии DSxxxx. Со своим датчиком DS18B20 проверил, работает ОК.
ЗдОрово Заготовки действительно суперские, а самое главное универсальные. можно ваять чего хош Тоже, сдалал термометр-термостат, на основе материалов самоучителя, управляется одной кнопкой. Жаль, что нет возможности обмена файлами, всетаки копировать текст, а потом его корректировать, не совсем то
Пост N: 110
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 10.04.07 19:19. Заголовок: Re:
Полностью солидарен с Вами ( _vintik@mail.ru ), ICQ не имею, и не жалею об этом Вышлите Ваш файл пожалуйста, а то я его скопировал, а он весь получился в одну строчку, и набирать... ну уж очень большой кусок
Пост N: 112
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 11.04.07 09:05. Заголовок: Re:
А я сам, сначала не понял, а когда стал разбираться, то увидел, что из первой четверки теряются два байта. Заменил в; п/п преобразования данных в код ЖКИ HD44780 return на goto, и все заработало
Пост N: 113
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 11.04.07 09:23. Заголовок: Re:
RW1ZK пишет:
цитата:
прикрепить изображение?
Так, вот же он, "мужик в пиджаке" Четырнадцатый с права, потом на открывшемся окошке, указываете путь к рисунку на ПК, затем в левом нижнем углу жмете "загрузить" и после загрузки на сервер, выбираете вариант вывода Вашего рисунка.
Пост N: 60
Зарегистрирован: 25.12.06
Откуда: Россия, Липецк
Рейтинг:
0
Отправлено: 11.04.07 19:15. Заголовок: Re:
Иван, а не желаете ли Вы опубликовать свою программу в "Практикуме..."? Если такое желание есть, то готовьте документацию и пришлите ее мне. Авторство - Ваше. P.S. Хорошая работа.
Пост N: 116
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 13.04.07 13:06. Заголовок: Re:
ikarab пишет:
цитата:
Альберто, процесс еще не дошел до стадии цепной реакции (контуры обозначены не до конца). По моим прикидкам, она начнется с п/раздела 5/4 и далее. Может быть будет некоторая задержка с "перевариванием" информации, но это совершенно естественно. Люди не роботы.
Процесс идет и даже вырывается на белый свет
Немного флейма, Хочу поблагодарить за реальную помощь! Dmitry Dubrovenko - всяческая поддержка на форуме Alberto - много полезных программ Пётр - рограмма перевода текста для HD44780 RW1ZK - программа перевода 2\НЕХ для HD44780 Roslik - программа перевода 2\10
Пост N: 190
Зарегистрирован: 12.01.07
Откуда: Приднестровье
Рейтинг:
1
Отправлено: 14.04.07 11:30. Заголовок: Re:
vintik пишет:
цитата:
Загвоздка получается в сравнении измеренной отрицательной и установленной положительной
А в чём собственно проблема, ведь сравнивать можно косвенным методом. Если 7 бит установлен в 1, значит температура отрицательная если сброшен, положительная.
Пост N: 119
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 14.04.07 11:59. Заголовок: Re:
Заработало! С помощью седьмых битов старших регистров изм. данных и уст. порога, все решилось. Достаточно было расписать логику на бумаге, так что спасибо Петр, за хороший совет, данный вовремя. Причем, проблемы с минусами, вообще не затронулись. Все уже крутится в железе.
Пост N: 50
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 20.04.07 18:19. Заголовок: Re:
Кто разобрался в кодировании значений порогов температуры (регистры TH, TL EEPROM)? Читаю datasheets... 7-й бит ... 0 -> температура положительная, 1 -> температура отрицательная. Остаются биты 6-0. Максимальное число = 127. Смотрю листинг программы DS1820_a.asm. Значение верхнего порога TH: +25 градусов Цельсия ->32H, перевожу в десятичный вид -> 50. Вывод: необходимое значение температуры умножить на 2 и загнать его в регистр TH или TL (по необходимости). А что в сухом остатке... Т.к. максимально возможное число для 7-ми бит (в восьмом знак температуры) равно 127-ми, то получается, что есть возможность установить максимально возможный предел в 63,5 градуса? Что-то не так... Help...
Пост N: 149
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 23.04.07 13:56. Заголовок: Re:
Вообще то в данном случае (DS1820_a.asm) регистры TH и TL не используются по своему прямому назначению (команда Alarm Search (ECh)). В данном случае они были использованы как энегронезависимая память находящаяся непосредственно в датчике (зачем добру пропадать). Здесь просто считывается число из одного из регистров (или TH, или TL: в данный момент под рукой нет листинга программы DS1820_a.asm, поэтому точно сказать не могу) и сравнивается с измеренной температурой. Отсюда и указанный Вами предел. В родном применении точность сравнения была в 1 градус, т.е. бит 7 знак температуры, а оставшиеся биты сама температура с точностью в один градус (111 1111 = 127).
Пост N: 153
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 24.04.07 13:18. Заголовок: Re:
Меня попросили еще раз выложить исходник с исправлениями для работы с датчиком DS18B20, выложил сюда: http://up-file.com/download/ec0bc3882311/DS18B20.zip.html правда хочу напомнить, что это версия без гашения левого незначащего нуля и с разрешением в 0,5 градуса. Все изменения выделены, так что при желании можно те же изменения внести в более новые исходники из рассылки.
Пост N: 156
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 25.04.07 19:42. Заголовок: Re:
RW1ZK пишет:
цитата:
Здесь полная версия термометра с гашением незначащих нулей и разрешением в 0.5 градуса для DS18B20. http://slil.ru/24284622
только что посмотрел Вашу программу и нашел одну ошибку (сам ее допустил, поэтому сразу обратил внимание), она уже обсуждалась здесь, поэтому повторяться не буду (для наводки Ваше сообщение от 30.03.07, сообщение Винтика и мое от того же числа). Это относится к неправильной работе при отрицательных температурах. Поищите, я на эти грабли уже наступил, хороший урок был . Почему не говорю где ошибка? Я так понимаю, что мы здесь новички в программировании, поэтому (лично мне) интереснее найти самому, если будут проблемы (сомневаюсь, но всяко бывает) - помогу.
Пост N: 57
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 25.04.07 20:48. Заголовок: Re:
Alberto пишет:
цитата:
и нашел одну ошибку
Вот я и говорю, там есть над чем поработать. А если серьёзно, то исправленная версия осталась на рабочем компе. Завтра выложу, если всё ещё есть необходимость. Банальная невнимательность! Вот так всегда, когда в наличии несколько компов... Честно говоря, этот проект мной практически заброшен. Жду, когда прийдёт мой заказ из чипинфо (ещё 4 датчика DS18B20). Потом будет продолжение. А пока разработка синтезатора на SAA1057 для FM приёмника и не только... В наличии есть 2 кварцевых фильтра на 25 мгц. Один с полосой пропускания 60 кгц, второй - 15 кгц. Хочу ещё собрать приёмник на 137 мгц для приёма спутников погоды серии NOAA.
Пост N: 157
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 26.04.07 12:50. Заголовок: Re:
RW1ZK пишет:
цитата:
если всё ещё есть необходимость
думаю что имея все подсказки можно дать человеку и самому разобраться - это и полезнее и интереснее. Если будут затруднения, то другое дело. RW1ZK пишет:
цитата:
разработка синтезатора... собрать приёмник на 137 мгц для приёма...
А вот это для меня китайская грамота , может просто потому, что никогда не интересовало.
Пост N: 58
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск
Рейтинг:
1
Отправлено: 26.04.07 15:41. Заголовок: Re:
Alberto пишет:
цитата:
и самому разобраться
Добро, на этом и остановимся... Alberto пишет:
цитата:
это для меня китайская грамота
Приёмник-ничего сложного. Сложнее разобраться с синтезатором. Пока на пике был RC генератор, схема синтезатора работала без проблем. Сейчас на пик поцепил кварц и схема заткнулась. Пока разбираюсь... Достала меня эта SAA1057!
Пост N: 37
Info: ок
Зарегистрирован: 10.01.07
Откуда: Россия, Хабаровск
Рейтинг:
0
Отправлено: 14.05.07 00:32. Заголовок: Re:
Alberto пишет
цитата:
А что за "таблетки"?
Если б я только знал название. На них же не написано. Пробовал считеть ROM посредством устройства для считывания ROM описанного в практикуме. Первый раз считалось что-то осмысленное (не знаю, может контакт ненадёжный был ). А потом полная читаются одни нули и хоть ты тресни. Думал увеличить время заряда паразитной ёмкости. Хрен там, увеличил почти до одной минуты - всё-равно читаются нули. Может там включается защита от считывания и этот флаг записывается в EEPROM? В общем нужна информация, а где взять - не знаю
Пост N: 182
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 14.05.07 12:35. Заголовок: Re:
Ruslan Lipin пишет:
цитата:
На них же не написано.
как так? У меня все как на рисунке: только надпись DS1990A не полукругом внизу, а в виде прямой линии на месте надписи DALLAS. Может просто вытерли? А иначе очень сложно определить конкретный тип. Ruslan Lipin пишет:
цитата:
Думал увеличить время заряда паразитной ёмкости.
с временными параметрами надо осторожно. У меня была похожая проблема. Я сначала разобрался с DS1990A, самый простой приборчик: имеет только серийный номер и ничего больше. Все заработало, сделал замок (работает уже почти год без единого сбоя), потом решил перейти на использование термометров DS1820, пробовал считать s/n (от простого к сложному) и все . Я по глупости своей посчитал что раз протокол один, то и заработать должно. Из десяти заработало только два. Увеличивал подтягивающий резистор, начинали работать еще некоторые. Дошел до 100 кОм - заработало восемь. Что я только не делал: и на форумы разные писал, и ... Потом взял еще раз даташит и прошелся по диаграммам. Оказалось что в даташите (русском), с которым я работал вначале, была ошибка в диаграмме. Для ключей было все равно 60 мкс или 90, а вот для термометров... Увеличил время и все пошло. Если интересно могу скинуть мою старую программу для ключей, отображает на ЖКИ серийный номер, контрольную сумму и тип прибора. Я ее использовал для проверки замка на этапе изучения.
Пост N: 38
Info: ок
Зарегистрирован: 10.01.07
Откуда: Россия, Хабаровск
Рейтинг:
0
Отправлено: 01.06.07 08:42. Заголовок: Re:
Alberto Было бы интересно посмотреть на программу. А можно на мыло? ruslan2651@yandex.ru И ещё ссылку на даташит, пожалуйста! Что касается надписи на ключе - тыльная его часть вклеена в пластиковый брелок, аккуратный такой, если отдеру брелок, то ключ рано или поздно потеряю и в свой подъезд больше не попаду
Пост N: 1
Зарегистрирован: 10.04.07
Откуда: россия, москва
Рейтинг:
0
Отправлено: 28.06.07 16:56. Заголовок: о закрытой части про 1-Wire + Proteus
"работаю", пока только разбираюсь в MPLAB 7.52.0.0 (с сайта www.microchip.ru) + Proteus 6.9.0.5 с сайта www.kazus.ru). Речь идёт о ПП считывания CRC с датчика DS18S20 с помощью кода "CRC_PZU.asm" предложенного Ikarab в самоучителе по 1-Wire. Собственно грабли 1. - подключил в MPLAB схемку PIC16F84A + DS18S20 из Proteusа 2. - попытка №1, прописываю в свойствах DS18S20 в Proteusе серийный номер DS18S20 (например 112233445566) 2.1. - в результате DS18S20 в ответ на команду Read ROM (033h) выдаёт контроллеру следующий наборчик 2.2. - 19_00_00_33_44_55_66_10, где (19) -собственно CRC, (00_00_33_44_55_66) - якобы серийный номер DS18S20 и (10) - код семейства. думаю ладно, счас победю ... 3. - попытка №2 серийный номер DS18S20 - ABSDEF (шесть знаков hex) 3.1. - в ответ на Read ROM получаем 05_00_00_00_AB_CD_EF_10 3.2. - где (05) -собственно CRC, (00_00_00_AB_CD_EF) - якобы серийный номер DS18S20 и (10) - код семейства, пара нулей перед _AB тоже претерпела измения (покраснела).
получается што Proteus выдаёт в MPLAB не весь CRC, первые два числа серийного номера датчика не считываются.
вывод - может я не так как нужно ввожу серийный номер DS18S20 - может DS18S20 в Proteusе думает совсем не так как я - может Proteus считает что всё што нужно MPLABу он уже выдал, а на самом деле всё совсем не так - может быть вообще всё совсем не так.
если у кого есть желание помогите пожалуйста разобраться, мозг уже кипит
если автор темы считает что это грабли Proteusа, то можно стести топик в тему про Proteus, но поскольку код "CRC_PZU.asm" - Ikarab из закрытой части самоучителя и относится к 1-Wire написал сюда.
Пост N: 192
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 28.06.07 17:16. Заголовок: Re:
kormovik пишет:
цитата:
думаю ладно, счас победю ...
В протеусе не победиш, это как костыль с трещеной. С виду вроде нормальный и при легкой нагрузке вроде держит, а как только обопрешся, так он и сломается, здоровью дороже. Так что сильно на него не расчитывай, делай все в железе.
Пост N: 2
Зарегистрирован: 10.04.07
Откуда: россия, москва
Рейтинг:
0
Отправлено: 28.06.07 17:28. Заголовок: Re:
на всякий случай ссылочка на архивчик с файлами http://kormovik.nm.ru/001/ если не затруднит проверьте пожалуйста, всё-таки спокойнее спать буду зная што это не я накосячил с протеусом.
P.S. железа пока нет, но собираюсь, токо учусь есщё.
Пост N: 124
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск, Мурманской обл.
Рейтинг:
1
Отправлено: 28.06.07 19:43. Заголовок: Re:
kormovik пишет:
цитата:
если не затруднит проверьте пожалуйста
http://slil.ru/24569748 Рабочая программа... Почему у Вас программа начинается с адреса 100H? Сравните свою и эту программу... Найдите отличия... Кстати: в версиях MPLAB 7.xx отдельно прописывать PortA, TrisA, EEData, IntCon, PC не нужно. Для подключения служит директива #include. Посмотрите на вышеуказанный листинг... Зачем у Вас подключён в проект линковщик?
Пост N: 195
Зарегистрирован: 26.12.06
Откуда: Одесса
Рейтинг:
0
Отправлено: 28.06.07 20:34. Заголовок: Re:
В протеусе меняются только три байта, очевидно они посчитали что этого достаточно. При этом Scratch RAM свои значения не меняет, а должна. В общем там вопросов больше чем ответов, если схема работает в железе, то в протеусе могут быть сплошные ошибки. Я его использую по очень осторожно, и никак не опираюсь на него.
Пост N: 3
Зарегистрирован: 10.04.07
Откуда: Россия, Москва
Рейтинг:
0
Отправлено: 02.07.07 10:35. Заголовок: Re:
vintik пишет:
цитата:
очевидно они посчитали что этого достаточно
, дааа, а я-то думал что мне в протеусе такое не встретится, теперь только в железе тестить. Но как было просто и легко до этих граблей, эх ......
RW1ZK пишет:
цитата:
Почему у Вас программа начинается с адреса 100H
я ещё только учусь и 90% в глухом тумане, но при старте с нулевого адреса MPLAB выдаёт "MPLINK 4.1, Linker Copyright (c) 2006 Microchip Technology Inc. Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x000000ca Errors : 1"
цитата:
Кстати: в версиях MPLAB 7.xx отдельно прписывать ....
я и не прописывал, пишу сам (так лучше понимаю) код к 1-Wire, но наступил на эти с CRC датчика, думал сам где-то напартачил и для очистки совести обратился к части кода от Ikarab "CRC_PZU.asm" - из закрытой части самоучителя.
цитата:
Зачем у Вас подключён в проект линковщик?
а вот отсюда если можно то поподробнее, или пошлите куда-нибудь где можно именно про это прочитать (как подключать и отключать линковщик, зачем он вообще нужен и што делает и чем грозит его неподключение или подключение). настройки MPLAB использую по умолчанию, создаю проекты рукодствуясь встроеноой справкой.
Пост N: 136
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск, Мурманской обл.
Рейтинг:
1
Отправлено: 02.07.07 12:59. Заголовок: Re:
kormovik пишет:
цитата:
а вот отсюда если можно то поподробнее
Линковщик, он же компоновщик, служит для соединения нескольких объектных файлов в один исполняемый. Объясняю по русски на 2-х пальцах: если Ваш проект слишком большой и не помещается в один файл, или Вам удобнее программу отлаживать по частям.., то сначала создаются объектные файлы (модули) см. ниже... После этого их компилируют (линкуют, компонуют) в один исполняемый. В вашем случае программа короткая, отследить её работу в MPLAB SIM не представляет ни какой трудности, поэтому линковщик не нужен. В проект подключаются: file.asm и file.inc
Объектный модуль (также — объектный файл, англ. object file) — файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код, который может быть объединён с другими объектными файлами при помощи линковщика для получения готового исполняемого модуля либо библиотеки. Объектные файлы представляют собой блоки машинного кода и данных, с неопределенными адресами ссылок на данные и процедуры в других объектных модулях, а также список своих процедур и данных. Линковщик собирает код и данные каждого объектного модуля в итоговую программу, вычисляет и заполняет адреса перекрестных ссылок между модулями. Также в процессе линковки происходит связывание программы со статическими и динамическими библиотеками (являющихся архивами объектных файлов).
Пост N: 4
Зарегистрирован: 10.04.07
Откуда: Россия, Москва
Рейтинг:
0
Отправлено: 03.07.07 08:55. Заголовок: Re:
RW1ZK пишет:
цитата:
Линковщик, он же компоновщик ......
Спасибо за подробное и доходчивое объяснение, "по русски на 2-х пальцах" очень просто и понятно. Но остался открытым вопрос про старт с 0-го адреса, почему MPLAB, точнее наверное этот самый "Линковщик, он же компоновщик" выдаёт; "MPLINK 4.1, Linker Copyright (c) 2006 Microchip Technology Inc. Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x000000ca Errors : 1" Хотя это и не относится к теме ветки.
Пост N: 137
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск, Мурманской обл.
Рейтинг:
1
Отправлено: 03.07.07 09:33. Заголовок: Re:
kormovik пишет:
цитата:
почему этот самый "Линковщик, он же компоновщик" выдаёт...
Потому, что у Вас нет созданных объектных модулей, которые необходимо скомпоновать в один файл... Смотрите пост выше: ликовщик, он же компоновщик, для чего нужен... В Вашем случае имеется 1 исполняемый файл (программа). Удалите его из проекта и да пребудет с Вами счастье!
Пост N: 52
Info: ок
Зарегистрирован: 10.01.07
Откуда: Россия, Хабаровск
Рейтинг:
0
Отправлено: 08.08.07 03:05. Заголовок: Re:
Alberto спасибо! Получил, приступил к колдоству. Отделил таблетку от ключа и выпал в осадок. Там ничего не написано. Пошёл в магазин. DS1990 - тютю. Пробовал работать с имеющимся экземпляром с помощью Вашей заготовки. Результат - читаются одни нули. У меня вопросик есть маленький. После того как ключ сформирует нулевой уровень отклика устройство должно ожидать, когда этот отклик завершиться (на линии снова установится 1)? Или же этот отклик устройство просто пережидает, а потом посылает команду чтения? В вашей заготовке ожидания завершения отклика (плавающая задержка) нет. Пробовал её врезать и... в общем так и не дождался завершения этого отклика даже спустя 1 минуту! Такое впечатление, что вместо начинки у этой хитрой таблетки стоит проволочная перемычка. Хотя подъезд мой открывает. Другой - ни в какую. Значит есть код. Может этой таблетки току не хватает. Если не достану DS1990 то буду наращивать ток, пока не спалю. Ещё раз спасибо! Рано или поздно я взломаю эту тему!
Пост N: 222
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 08.08.07 18:15. Заголовок: Re:
По правильному нужно дождаться импульса присутствия, но это была первая программа где я разбирался с шиной 1-Wire и я данный кусок кода просто не вписал. Если долго (сейчас не вспомню что-то около 1-1,5 мс) держать микроконтроллером шину в "0", то просто не будет заряжаться конденсатор таблетки и она работать не будет, т.е. логика такова: МК посылает импульс сброса (480 мкс) потом выставляет "1" (за счет подтягивающего резистора) и читает импульс "присутствия" (уровень "0" от 60 до 240 мкс), который посылает таблетка через 15-60 мкс после окончания импульса сброса. Поиграйтесь со временем ожидания (оно у меня постоянное, хотя лучше сделать плавающую задержку). Только не забывайте что "таблетка" питается от конденсатора, который в свою очередь заряжается импульсами "1". У меня ест много довольно хороших описаний работы "таблеток" на русском языке, посмотрю дома. Если не забуду, завтра вышлю. На днях могу подправить программу, добавив ожидание (быстро не обещаю - на работе аврал). А палить не стоит , все ж таки хорошая вещь.
Пост N: 53
Info: ок
Зарегистрирован: 10.01.07
Откуда: Россия, Хабаровск
Рейтинг:
0
Отправлено: 09.08.07 00:55. Заголовок: Re:
Альберто. А в какой момент необходимо послать импульс сброса? Насколько я понимаю, если сделать это сразу после включения питания устройства, то очень может быть, что кондёр таблетки окажется ещё не заряженым, и следовательно она ведёт себя неадекватно. Может после включения питания необходимо выставить в линию единичку (посредством подтягивающего резистора) и подождать когда этот кондёр зарядиться (дождаться когда на линии появится 1), а потом начинать посылку импульса сброса. Затем, как Вы говорите через 15-60 мкс, таблетка должна сформировать отклик присутствия (уровень 0 на 60-240 мкс). После появления этого отклика (уровня 0 на линии) микроконтроллер должен тупо пережидать эти 240 мкс или всё-таки посредством плавающей задержки дожидается окончания этого отклика (дожидаться появления 1 на линии)? Сегодня попробую воспользоваться Вашим советом. Интуиция пдсказывает, что если кроме как 0 от этой таблетки мне дождаться так ничего не удалось, то нужно попытаться увеличить ток. У меня стоит резистор на 4,7кОм. Может стоит уменьшить этот номинал?
Пост N: 224
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 09.08.07 13:03. Заголовок: Re:
Ruslan Lipin пишет:
цитата:
Может после включения питания необходимо выставить в линию единичку
дело в том что "таблетка" не подключена к линии все время, т.е. процессор время от времени посылает импульсы сброса "в надежде" обнаружить "таблетку" на линии. Ruslan Lipin пишет:
цитата:
микроконтроллер должен тупо пережидать эти 240 мкс или всё-таки посредством плавающей задержки дожидается окончания этого отклика (дожидаться появления 1 на линии)
у меня тупо пережидает 300 - 400 мкс (сейчас уже не помню, а исходника под рукой нет), хотя правильнее дождаться появления "1". Ruslan Lipin пишет:
цитата:
У меня стоит резистор на 4,7кОм.
у меня тоже. Я сделал около 20 замков, с ними работает больше 300 "таблеток" (правда это были DS1990A) и никаких проблем. Похожая проблема у меня была с DS1820 (при активном питании). Но в той программе что я Вам выслал это уже исправлено. Проверьте подтянули ли Вы 1-Wire шину именно к +5В, у меня как то было похожее: не запускался ЖКИ, а потом оказалось что я подключил переменный резистор к общему проводу (оба крайних вывода). Иногда так бывает. Замотаешься... и... Вот здесь то описание, по которому я изучал (и добился своего) шину 1-Wire, плюс даташит конечно. http://up-file.com/download/3785c7787680/iButton.rar.html плюс схема как надо подключать, сначала у меня был использован вывод RA0 потом я перешел на RA4, но сути дела это не меняет, просто везде советуют для реализации шины 1-Wire использовать именно его, т.к. это вывод с ОК: http://up-file.com/download/edead0178620/ds1990a.wmf.html
Пост N: 236
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 10.08.07 12:29. Заголовок: Re:
Я сделал немного неправильно, что не написал как надо работать с программой. Включаете питание (к шине 1-Wire ничего не подключено), на индикаторе появляется надпись "Listo" ("Готов" по-русски, у нас не найти ЖКИ с русским знакогенератором) и устройство переходит в режим ожидания. При касании "таблетки" на экране высвечивается информация (код семейства, код устройства и CRC), для перезапуска надо отключить и включить питание. Я это сделал что бы было достаточно времени сравнить данные выгравированные на "таблетке" со считанными данными. Там есть строка:
STOP goto STOP
ее лучше заменить на переход на п/п задержки в 3-5 сек и начать весь цикл по новой. Вчера собрал на макетке устройство. Так вот, все нули читаются в двух случаях: 1. если нет подтягивающего резистора; 2. если подключить неправильно таблетку. Обод таблетки - это общий провод, а центр - это контакт шины. Посмотрите внимательно. Еще импульс сброса должен быть от 480 до 960 мкс, это строка выделенная красным:
;--------------------------------------------------------------------------------------------- ; Инициализация шины ;--------------------------------------------------------------------------------------------- DS_Init call Pin_HI ; Установка вывода в высокоимпедансное состояние, ; за счет подтягивающегося резистора, шина уст. в "1" call Pin_LO ; Установка шины в "0"
movlw .49 ; К-во циклов для паузы в 10 мкс call Pause_X ; П/п паузы в 10 мкс call Pin_HI ; Установка вывода в высокоимпедансное состояние, ; за счет подтягивающегося резистора, шина уст. в "1" return
у меня длительность импульса 490 мкс плюс несколько мкс на переключение из "0" в "1", может для Вашего экземпляра это очень мало? "Поиграйте" с этим значением (вплоть до 96 - это будет 960 мкс). Больше 1,2 мс не стоит, т.к. разрядится конденсатор "таблетки".
Пост N: 54
Info: ок
Зарегистрирован: 10.01.07
Откуда: Россия, Хабаровск
Рейтинг:
0
Отправлено: 16.08.07 08:39. Заголовок: Re:
Альберто. Спасибо! Сохранил Ваши рекомендации и программу до лучших времён. Я вчера окончательно разочаровался в своей безымяной таблетке. С подтягивающим резистором у меня всё в норме, но даже с ним на линии при подключенной таблетке не устанавливается единица (я специально под эту проверку программу писал). Без таблетки - единичка, с таблеткой - ноль, хоть целую вечность жди. Затем стал уменьшать номинал подтягивающего резистора. Уменьшил до 430 Ом и только тогда с подключенной таблеткой на линии появилась единица. Только после этого через Вашу программу стали читаться одни единички. Складывается такое впечатление, что этот ключ тупее чем постоянный резистор. Конечно-же это не так. Сегодня подойду к домофону с мультиметром, может наступит осенение
Пост N: 257
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 16.08.07 12:16. Заголовок: Re:
Ruslan Lipin пишет:
цитата:
с таблеткой - ноль, хоть целую вечность жди
попробуйте поменять полярность подключения "таблетки". Ruslan Lipin пишет:
цитата:
Складывается такое впечатление, что этот ключ тупее чем постоянный резистор.
я где-то встречал описание замка на чем-то похожем на "таблетку", но содержащем внутри именно постоянный резистор. И замок работал по принципу измерения сопротивления. Точнее ничего сказать не могу, сильно не вникал. Может у Вас таже ситуация? Попробуйте померить сопротивление Вашей "таблетки" (в обе стороны). А я вечером гляну что показывает мультиметр у меня, может как-то опредилимся с Вашей ситуацией.
Пост N: 259
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
1
Награды:
Отправлено: 17.08.07 12:24. Заголовок: Re:
Вчера посмотрел что покажет мультиметр: при подключении общего вывода мультиметра к общему выводу "таблетки" (ободок) и плюса к центральному выводу "таблетки" мультиметр показывает сопротивление около 1,6 МОм, которое начинает уменьшаться приблизительно за 10 - 15 сек до 0,6 МОм, при обратном подключении - на короткое время появляются показания чуть меньше 2 МОм и потом выходит за границы диапазона измерения.
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет