VitalForce 67 Report post Posted September 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 reacted to this Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted September 22, 2015 У микроконтроллера нет минусовых значений. Поэтому максимальное число делится пополам и условно считаем, что до 32692 идут положительные числа, потом отрицательные. Coldbit - это по-моему 11бит в ответе датчика температуры. Если этот бит равен единицы, значит температура отрицательная. По нему зажигании или гасим знак минуса. Если требуется работать с десятками градусов, то проще использовать для вычисления целые числа. Например, не 25,2°С, а 252°С. При выводе на индикатор просто зажигать точку в нужном разряде. Для этого целые значения умножаем на десять и прибавляет десятки. В термостате при этом условия упростятся. Ошибки в вычислениях могут возникать, если переменные объявлены неправильно. Например переменная BYTE может содержать число от 0 и до 255. WORD - до 65384. Приведённые формулы исправным и считают правильно. 3 Ростислав Михайлов, VitalForce and dvselectronic reacted to this Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted September 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 and dvselectronic reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted September 22, 2015 Во вложении рабочий (в железе рабочий) термостат ...А где само вложение? Глянуть бы одним глазком Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted September 22, 2015 Не туда нажал... Вот выкладываю. Термоcтат.rar Share this post Link to post Share on other sites
VitalForce 67 Report post Posted September 22, 2015 Спасибо. В общих чертах просмотрел, более детально разбирать буду дома. Осталось дождаться уроков с работой с eeprom. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted September 22, 2015 Разобрался с отрицательными величинами и десятыми долями. Возник следующий вопрос. Как вычислять переменную для отрицательной температуры? Предположим для температуры 25,2°С переменная будет равна 252. Но! Но и для отрицательной температуры -25,2°С переменная будет равна тому же значению 252. Я понимаю, что в таких диапазонах температур мало кто что-то делает, но все же. Как избежать ложных срабатываний при таких совпадениях? P.S. В твоей программе (извини, можно на "Ты" перейти?) две переменные не участвуют в процессах 'q var byte 'Temp var byte Это что-то еще планируется добавлять? Share this post Link to post Share on other sites
VitalForce 67 Report post Posted September 22, 2015 Ой, и с этим кажется разобрался. Поправь меня если что... Всего лишь нужно изменить имя переменной для отрицательной температуры. Не, не прокатило... Нужно в отдельную подпрограмму выносить. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 10, 2015 Как правильно вычислить ID датчика (ds18b20). Планирую подключить 2 и более по одной шине. Можно было бы и на разные порты МК кинуть, но не вариант. В протеусе на датчиках выставляю разные коды и использую их, все работает (вычислять не нужно). А с реальных вычислить не получается. Поделись опытом Жень. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 10, 2015 @@VitalForce алгоритм довольно замороченый. Проще всего написать программульку для этого же термометра, которая будет считывать 64 бита из датчика. Для этого цепляем первый датчик, отсылает в него код 33h, после чего считываем 64 бита и выводом их на индикатор. Потом тоже самое со вторым датчиком. После чего у нас будет два идентификатора. В основной программе вместо команды CCh используем команду 55h и следом передаёт 64 бита нужного датчика. Датчик с указанными 64 битами останется активным, второй отключился. После считывания температуры обязательно отсылает команду сброса, для того, чтобы отключившийся датчик проснулся. Это самый простой вариант. 1 VitalForce reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 11, 2015 Получилось !!! Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 11, 2015 Программу опроса датчика можно выполнить подпрограммой, которая будет сканировать и записывать данные датчиков во флешку. А вызов подпрограммы повесить на премычку или ещё куда. При смене датчика, втыкаем перемычку и поочереди втыкаем датчики. 1 VitalForce reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 11, 2015 А вызов подпрограммы повесить на премычку Тоесть установить 0 или 1 на каком-то порту и по этому "флагу" выполнять подпрограмму. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 11, 2015 ну да Можно по долгому нажатию какой либо кнопки или двух. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 11, 2015 Я сделал при включении устройства, если нажата, то поехали считывать ID. А вот на счет долгого удержания, я так и не разобрался пока Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 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 reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 11, 2015 Во! "Buttime", а я как только не пытался отследить длительность )))) Спасибо. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 11, 2015 Незачто После выхода из подпрограммы обнулить не забудь, а то второй раз не сработает короткое нажатие Share this post Link to post Share on other sites