Перейти к содержанию

VitalForce

Программирование на PicBasic Pro Урок №5

Рекомендуемые сообщения

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

У микроконтроллера нет минусовых значений. Поэтому максимальное число делится пополам и условно считаем, что до 32692 идут положительные числа, потом отрицательные. Coldbit - это по-моему 11бит в ответе датчика температуры. Если этот бит равен единицы, значит температура отрицательная. По нему зажигании или гасим знак минуса.

Если требуется работать с десятками градусов, то проще использовать для вычисления целые числа.

Например, не 25,2°С, а 252°С. При выводе на индикатор просто зажигать точку в нужном разряде.

Для этого целые значения умножаем на десять и прибавляет десятки.

В термостате при этом условия упростятся.

Ошибки в вычислениях могут возникать, если переменные объявлены неправильно. Например переменная BYTE может содержать число от 0 и до 255. WORD - до 65384.

Приведённые формулы исправным и считают правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

 

Я посмотрел модель, действительно косяк в программе, только не в вычислениях, а в другом месте.

 

Во вложении рабочий (в железе рабочий) термостат. Единственное, из-за нехватки ног мк знак минуса не выводится на индикатор. Это дальнейшее развитие 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

 

Во вложении рабочий (в железе рабочий) термостат

...

А где само вложение? Глянуть бы одним глазком  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Спасибо. В общих чертах просмотрел, более детально разбирать буду дома. Осталось дождаться уроков с работой с eeprom.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Разобрался с отрицательными величинами и десятыми долями.  Возник следующий вопрос. Как вычислять переменную для отрицательной температуры? Предположим для температуры 25,2°С переменная будет равна 252. Но! Но и для отрицательной температуры -25,2°С  переменная будет равна тому же значению 252. Я понимаю, что в таких диапазонах температур мало кто что-то делает, но все же. Как избежать ложных срабатываний при таких совпадениях?

 

P.S. В твоей программе (извини, можно на "Ты" перейти?) две переменные не участвуют в процессах 

'q    var byte
'Temp var byte

Это что-то еще планируется добавлять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Ой, и с этим кажется разобрался. Поправь меня если что...  Всего лишь нужно изменить имя переменной для отрицательной температуры.

 

Не, не прокатило...  Нужно в отдельную подпрограмму выносить. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Как правильно вычислить ID датчика (ds18b20). Планирую подключить 2 и более по одной шине. Можно было бы и на разные порты МК кинуть, но не вариант. В протеусе на датчиках выставляю разные коды и использую их, все работает (вычислять не нужно). А с реальных вычислить не получается. Поделись опытом Жень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

@@VitalForce алгоритм довольно замороченый. Проще всего написать программульку для этого же термометра, которая будет считывать 64 бита из датчика. Для этого цепляем первый датчик, отсылает в него код 33h, после чего считываем 64 бита и выводом их на индикатор. Потом тоже самое со вторым датчиком. После чего у нас будет два идентификатора.

В основной программе вместо команды  CCh используем команду 55h и следом передаёт 64 бита нужного датчика. Датчик с указанными 64 битами останется активным, второй отключился. После считывания температуры обязательно отсылает команду сброса, для того, чтобы отключившийся датчик проснулся. Это самый простой вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Программу опроса датчика можно выполнить подпрограммой, которая будет сканировать и записывать данные датчиков во флешку. А вызов подпрограммы повесить на премычку или ещё куда. При смене датчика, втыкаем перемычку и поочереди втыкаем датчики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

 

А вызов подпрограммы повесить на премычку

Тоесть  установить 0 или 1 на каком-то порту и по этому "флагу" выполнять подпрограмму.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Я сделал при включении устройства, если нажата, то поехали считывать ID. А вот на счет долгого удержания, я так и не разобрался пока  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Отслеживание длительности тоже довольно просто

При нажатии кнопки попадаем в подпрограмму отслеживания длительности, примерно такой:

 

buttonon:
'****Определяем длительность****
buttime = buttime + 1
pause 50
if portB.0= 0 and buttime < 40 then
goto buttonon
endif
if buttime < 40 then
goto metka1'меньше 2 секунд
endif
if buttime > 40 then
goto metka2 'Больше 2 секунд
endif
'**************END**************
goto main

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Незачто



После выхода из подпрограммы обнулить не забудь, а то второй раз не сработает короткое нажатие

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти



×
  • Создать...