Jump to content

VitalForce

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
 

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
 

 

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

 

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

Share this post


Link to post
Share on other sites
 

 

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

...

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

Share this post


Link to post
Share on other sites
 
 

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

Share this post


Link to post
Share on other sites
 

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

 

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

'q    var byte
'Temp var byte

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

Share this post


Link to post
Share on other sites
 

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

 

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

Share this post


Link to post
Share on other sites
 

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

Share this post


Link to post
Share on other sites
 

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

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

Share this post


Link to post
Share on other sites
 
 

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

Share this post


Link to post
Share on other sites
 

 

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

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

Share this post


Link to post
Share on other sites
 
 

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

Share this post


Link to post
Share on other sites
 

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

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

 

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

 

Share this post


Link to post
Share on other sites
 
 

Незачто



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

Share this post


Link to post
Share on other sites
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
  • Create New...