VitalForce 67 Жалоба Опубликовано 21 сентября, 2015 1. Хотелось бы понять как происходят вычисления температуры с датчика. Convert: if coldbit <> 1 then tempcel = temper / 16 tempdec = temper * 10 / 16 else tempcel = 65384 - temper tempdat = tempcel + 1 tempcel = tempdat / 16 tempdec = ((tempdat + 1) // 16) * 10 / 16 endif return 2. Отрицательная температура отображается не правильно. При температуре "-1" показывает 95,6 (пришел к выводу - отсчет идет от 4096). Поэтому и хотелось бы разобраться с расчетами и формулой. 3. Термореле. При целых значениях температуры все работает. Пытаюсь подставить десятичные, перестает работать. Возможно не правильно пишу выражение, поправьте меня. Или, возможно, датчик не работает с десятичными (хотя на индикаторе отображается). Termostat: if tempcel <= 26 and tempdec <= 5 then rele = 1 endif if tempcel = 29 and tempdec = 2 then rele = 0 endif return P.S. Нашел на просторах интернета, но тоже без описания процедуры вычисления (с виду код короче): if SignBit=0 then SignC="+" else SignC="-" rawtemp = ~rawtemp+1 endif dummy = rawtemp*625 TempC=DIV32 100 return А целые значения = TempC/100 1 dvselectronic отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 22 сентября, 2015 У микроконтроллера нет минусовых значений. Поэтому максимальное число делится пополам и условно считаем, что до 32692 идут положительные числа, потом отрицательные. Coldbit - это по-моему 11бит в ответе датчика температуры. Если этот бит равен единицы, значит температура отрицательная. По нему зажигании или гасим знак минуса. Если требуется работать с десятками градусов, то проще использовать для вычисления целые числа. Например, не 25,2°С, а 252°С. При выводе на индикатор просто зажигать точку в нужном разряде. Для этого целые значения умножаем на десять и прибавляет десятки. В термостате при этом условия упростятся. Ошибки в вычислениях могут возникать, если переменные объявлены неправильно. Например переменная BYTE может содержать число от 0 и до 255. WORD - до 65384. Приведённые формулы исправным и считают правильно. 3 VitalForce dvselectronic Ростислав Михайлов отреагировали на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 22 сентября, 2015 Я посмотрел модель, действительно косяк в программе, только не в вычислениях, а в другом месте. Во вложении рабочий (в железе рабочий) термостат. Единственное, из-за нехватки ног мк знак минуса не выводится на индикатор. Это дальнейшее развитие 5 урока, то есть я дописал код далее. Сам процесс конвертации я и сам недопонимаю if coldbit <> 1 then 'Если равно нулю, то отрицательная температура tempcel = temptemp /16 'Сырые данные из датчика делим на 16 tempdec = (temptemp // 16) * 10 / 16 'модуль сырых данных умножаем на 10 и делим на 16 else tempcel = 65535- temptemp ' tempdat = tempcel + 1 tempcel = tempdat / 16 tempdec = ((tempdat + 1)//16)*10/16 endif 3 Ростислав Михайлов VitalForce dvselectronic отреагировали на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 22 сентября, 2015 Во вложении рабочий (в железе рабочий) термостат ...А где само вложение? Глянуть бы одним глазком Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 22 сентября, 2015 Не туда нажал... Вот выкладываю. Термоcтат.rar Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 22 сентября, 2015 Спасибо. В общих чертах просмотрел, более детально разбирать буду дома. Осталось дождаться уроков с работой с eeprom. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 22 сентября, 2015 Разобрался с отрицательными величинами и десятыми долями. Возник следующий вопрос. Как вычислять переменную для отрицательной температуры? Предположим для температуры 25,2°С переменная будет равна 252. Но! Но и для отрицательной температуры -25,2°С переменная будет равна тому же значению 252. Я понимаю, что в таких диапазонах температур мало кто что-то делает, но все же. Как избежать ложных срабатываний при таких совпадениях? P.S. В твоей программе (извини, можно на "Ты" перейти?) две переменные не участвуют в процессах 'q var byte 'Temp var byte Это что-то еще планируется добавлять? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 22 сентября, 2015 Ой, и с этим кажется разобрался. Поправь меня если что... Всего лишь нужно изменить имя переменной для отрицательной температуры. Не, не прокатило... Нужно в отдельную подпрограмму выносить. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 10 ноября, 2015 Как правильно вычислить ID датчика (ds18b20). Планирую подключить 2 и более по одной шине. Можно было бы и на разные порты МК кинуть, но не вариант. В протеусе на датчиках выставляю разные коды и использую их, все работает (вычислять не нужно). А с реальных вычислить не получается. Поделись опытом Жень. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 10 ноября, 2015 @@VitalForce алгоритм довольно замороченый. Проще всего написать программульку для этого же термометра, которая будет считывать 64 бита из датчика. Для этого цепляем первый датчик, отсылает в него код 33h, после чего считываем 64 бита и выводом их на индикатор. Потом тоже самое со вторым датчиком. После чего у нас будет два идентификатора. В основной программе вместо команды CCh используем команду 55h и следом передаёт 64 бита нужного датчика. Датчик с указанными 64 битами останется активным, второй отключился. После считывания температуры обязательно отсылает команду сброса, для того, чтобы отключившийся датчик проснулся. Это самый простой вариант. 1 VitalForce отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 11 ноября, 2015 Получилось !!! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 11 ноября, 2015 Программу опроса датчика можно выполнить подпрограммой, которая будет сканировать и записывать данные датчиков во флешку. А вызов подпрограммы повесить на премычку или ещё куда. При смене датчика, втыкаем перемычку и поочереди втыкаем датчики. 1 VitalForce отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 11 ноября, 2015 А вызов подпрограммы повесить на премычку Тоесть установить 0 или 1 на каком-то порту и по этому "флагу" выполнять подпрограмму. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 11 ноября, 2015 ну да Можно по долгому нажатию какой либо кнопки или двух. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 11 ноября, 2015 Я сделал при включении устройства, если нажата, то поехали считывать ID. А вот на счет долгого удержания, я так и не разобрался пока Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 11 ноября, 2015 Отслеживание длительности тоже довольно просто При нажатии кнопки попадаем в подпрограмму отслеживания длительности, примерно такой: buttonon:'****Определяем длительность****buttime = buttime + 1pause 50if portB.0= 0 and buttime < 40 thengoto buttononendifif buttime < 40 thengoto metka1'меньше 2 секундendifif buttime > 40 thengoto metka2 'Больше 2 секундendif'**************END**************goto main 1 VitalForce отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 11 ноября, 2015 Во! "Buttime", а я как только не пытался отследить длительность )))) Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 11 ноября, 2015 Незачто После выхода из подпрограммы обнулить не забудь, а то второй раз не сработает короткое нажатие Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты