Jump to content

Welcome to vip-cxema.org

logo3.png

The forum has a section for guests, where you can ask your questions without registration: Вопросы и ответы

By registering, you will be able to send private messages, receive notification of replies to topics. You can always send a message, many restrictions are removed.


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
 
 
 

Спасибо. В общих чертах просмотрел, более детально разбирать буду дома. Осталось дождаться уроков с работой с 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
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...



×
  • Create New...