Прерывания надо обязательно запретить, т.к.используем точные задержки. Можно и задержки сделать на прерываниях от таимера, в этой либе их надо запрещать.
_________________ Я всё-всё узнAю и стану профессором.
Не пойму только что делаю не так. Видимо мк не считывает данные с 1-wire. Посмотрел примеры - сделал точно так-же. И нифига... ( И времени особо нет... Чёртова суматоха )
Возможно дело в частоте - разбираюсь
_________________ не зная броду не лезь к вольтмоду
А я столкнулся с проблемой - у меня датчик не хочет измерять отрицательные температуры. Я прикладываю к датчику замороженные продукты из морозилки. Температура опускается всего до 5 градусов. Вижу как датчик сам топит лед. 1-wire это конечно круто, но вот то, что процессор датчика, во время измерения температуры разогревается и этим вносит коррективы в работу датчика - это очень плохо. Измерения нельзя производить слишком часто. Я измеряю один раз в секунду! И все равно.....
Сейчас попробую задержку больше по времени.... Но это уже не то - не оперативно... ( Плююсь )
_________________ не зная броду не лезь к вольтмоду
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А я столкнулся с проблемой - у меня датчик не хочет измерять отрицательные температуры. Я прикладываю к датчику замороженные продукты из морозилки. Температура опускается всего до 5 градусов. Вижу как датчик сам топит лед. 1-wire это конечно круто, но вот то, что процессор датчика, во время измерения температуры разогревается и этим вносит коррективы в работу датчика - это очень плохо. Измерения нельзя производить слишком часто. Я измеряю один раз в секунду! И все равно.....
Сейчас попробую задержку больше по времени.... Но это уже не то - не оперативно... ( Плююсь )
Учитывая, что конверсия идёт 0,75сек, то по времени вы только иделаете,что меряете Т. Если настройки не поменяли. Врядли датчик нагреется за микросекунды ощутимо. Мож ошибка в преобразовании данных? Выведите оба байта в УАРТ .
_________________ Я всё-всё узнAю и стану профессором.
Точно! **************************************** Назрел другой вопрос: Что то не пойму как прочитать ID датчика. После команды 0x33 ( READ ROM [33h] ) датчик начнет вещать свой ID. А куда его запишет эта либа ? ( либу прикрепил ) Например, данные о температуре она записывает в первые два байта массива buffer_1w. Массив расчитан на 8 байт данных + 1 байт CRC. ROM соджержит 64 бита данных ( 8 байт ). Неужели в этот же массив запишет - в первые 8 бит ????? Или как ?
Неужели в этот же массив запишет - в первые 8 бит ?????
Точно! Так и есть! почитал... http://chipenable.ru/index.php/programm ... 20-chast-3 Но мне не понятно вот что: Массив переменных состоит из девяти байт ОЗУ. Данные хранятся в первых восьми байтах. В последнем ( в девятом ) байте хранится принятый CRC (циклический избыточный код). Микроконтроллер сам рассчитывает CRC, исходя из первых восьми байт и сравнивает его с принятым CRC. В случае равенства посылка считается верной!
А тут получается, что ROM состоит из 1 байт FAMILY CODE 6 байт SERIAL NUMBER 1 байт CRC Всего 8 байт. ( а ячеек в ОЗУ у нас девять ) и получается что CRC записывается не в свою ячейку ОЗУ Как будет происходить расчет и сравнение CRC ?????????
С проверкой CRC я так и не разобрался. ( Работает и так, но это наверное не правильно - может привести к ошибке !? ) Но программу, тем не менее, написал с распознаванием уникального кода датчиков в режиме обучения МК и записью их в ЕЕПРОМ МК.
единственный недостаток - это то что значение температуры выводится в 16ти ричном виде
Вопрос немного в другом. Как используя данную библиотеку на дисплей выводить на экран значение температуры в десятеричном виде? Спойлер0=0 символ на экране = значение присвоенное регистру R16 1=1 2=2 3=3 4=4 5=5 6=6 7=7 8=8 9=9 a=10 b=11 c=12 d=13 e=14 f=15
_________________ не зная броду не лезь к вольтмоду
Проверяете и запоминаете знак результата -> Умножаете на 100 (для индикации с ценой деления 0,01; для цены деления 0,1 умножаете на 10; для цены деления 1 не умножаете) и делите сдвигом на 16 -> Округляете прибавлением флага C -> На выходе результат*100. Например XH:XL=0x01BD (445d) -> т.к. при умножении на 100 рез-т может не поместиться в XH:XL предварительно расширяем до 3 регистров -> R0:XH:XL. На выходе 445*100/16=2781,25. Т.к. первая цифра после запятой меньше 0,5 флаг C будет равен 0 и в результате округления получите 2781. Далее идет процедура BCD преобразования, конвертация в коды символов, добавление знака.
Проверяете и запоминаете знак результата -> Умножаете на 100 (для индикации с ценой деления 0,01; для цены деления 0,1 умножаете на 10; для цены деления 1 не умножаете) и делите сдвигом на 16 -> Округляете прибавлением флага C -> На выходе результат*100. Например XH:XL=0x01BD (445d) -> т.к. при умножении на 100 рез-т может не поместиться в XH:XL предварительно расширяем до 3 регистров -> R0:XH:XL. На выходе 445*100/16=2781,25. Т.к. первая цифра после запятой меньше 0,5 флаг C будет равен 0 и в результате округления получите 2781.
Это все лишнее. Я сделал проще. Полученные с датчика данные я поделил на 16. ( Доли градуса мне не нужны ).
Цитата:
Далее идет процедура BCD преобразования, конвертация в коды символов, добавление знака.
;******************************************************************************* ; Преобразование из HEX в BCD ;*******************************************************************************
ldi XL, 0x1C ; данные с датчика температуры ( уже поделенные на 16 ) ldi XH, 0x00
mov R16, XL ; копируем только младший байт
rcall HEX_to_BCD ; преобразуем данные из регистра R16
rcall printhex ; печатаем на экран, то что в регистре R16
; подпрограмма преобразования HEX_to_BCD:
clr r17 ; Очищаем регистр help
HEX_to_BCD_l:
subi r16,10 ; temp = temp — 10 brcs HEX_to_BCD_2 ; Прервать, если перенос установлен inc r17 ; Инкрементируем r17 rjmp HEX_to_BCD_l ; Проходим по циклу проверки заново
HEX_to_BCD_2:
subi r16,-10 ; компенсируем отрицательное значение в r16 swap r17 ; Меняем тетрады местами or r16,r17 ; Объединяем полученные значения в Упакованный BCD
ret
Правда есть единственный недостаток Максимальная температура измерения теперь 99 градусов целься В дальнейшем эта подпрограмма не сгодится так как работать буду с температурами превышающими 99 градусов
вот данные с двух датчиков ( врут эти датчики видимо - реальная температура 27,5 градусов по Цельсию ) Ложные данные как следствие разогрева собственного процессора??? Нужно сделать вычисление реже... ( раз в две - три секунды ??? ) ?
_________________ не зная броду не лезь к вольтмоду
Максимальная температура измерения теперь 99 градусов
Просто нарастить по аналогии. Спойлер
Код:
;********************** ; Преобразование из HEX в BCD ;********************** GO_HEX_BCD: LDI XL,LOW(124) mov R16, XL ;
; подпрограмма преобразования HEX_to_BCD:
clr r17 ; Очищаем регистр сотен, десятков
HEX_to_BCD_l0: subi R16,100 ; temp = temp — 100 brcs OUT_10 ; Прервать, если перенос установлен inc r17 ; прибавляем сотни в r17 rjmp HEX_to_BCD_l0 ; Проходим по циклу проверки заново OUT_10: SUBI R16,-100 ; восстановитб значение десятков и единиц SWAP r17 ; сотни в старшую тетраду B1: subi r16,10 ; temp = temp — 10 brcs HEX_to_BCD_OUT ; Прервать, если перенос установлен inc r17 ; Инкрементируем r17 rjmp B1 ; Проходим по циклу проверки заново
HEX_to_BCD_OUT: SUBI R16,-10 ; R17 сотни десятки ; R16 единицы ret
09:20
uwrtey писал(а):
Ложные данные как следствие разогрева собственного процессора??? Нужно сделать вычисление реже... ( раз в две - три секунды ??? ) ?
Можно ещё ограничить разрядность до 9 бит, тем самым уменьшить время преобразования в 8 раз.
Последний раз редактировалось akl Ср ноя 04, 2015 07:21:44, всего редактировалось 1 раз.
Хочу на экране видеть не только значения температуры, но и часы ( желательно с календарем ) Как бы все это организовать? Да еще что бы процессор меги этим не занимать? Подумал сначала, что можно другую мегу этим озадачить, но наверняка есть и другие - готовые решения. А то часы на меге уплывут от настоящего времени скорее всего очень быстро.. Какие есть спец микросборки для данного решения ? Вариант с 1-wire был бы очень круто Видел есть решения с шиной I2C - DS1307 - http://we.easyelectronics.ru/Arduino/ar ... hield.html вот например - http://www.ebay.com/itm/Arduino-I2C-RTC ... xyY3ZRraQc
Сейчас этот форум просматривают: Paktok и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения