Свежие обсуждения
Микроконтроллеры

Помогите разобратся с терморегулятором на ds18b20.

1 2

Вот написал недавно программу на Си для термометра на МК ATtiny233 который работает с датчиком ds18b20. Термометр работает нормально, а вот захотел недавно переделать программу в терморегулятор и вроде всё работает нормально, а вот когда температура заданная "плюсовая" и измеряемая тоже "плюсовая", то сравнение работает нормально. Сравнение должно работать так, если измеряемая температура больше чем заданная, то должен загорется светодиод, а если менше чем заданная, то светодиод должен погаснуть. Так вот при плюсовой всё нормально, а если там минусовая ,а там плюсовая, или наоборот, или там минусовая и там минусовая то сравнение не работает. Вот может поможете. За ранние благодарю.

148357.c

 

-

 

Я не программировал МК, только писал консольные приложения

не могу понять почему сравнение происходит перед считыванием показаний
да и это немного непонятно

temperature=ds18b20_temperature(0); //Читаем температуру

if(temperature>1000)
{
temperature=4096-temperature;
temperature=-temperature;
}

 

А каков сокровенный смысл комбинации операторов:
temperature=4096-temperature;
temperature=-temperature;

это не одно и то же, что:
temperature=temperature-4096;
?

 

Этот код не сравнение:
temperature=ds18b20_temperature(0); //Читаем температуру

if(temperature>1000)
{
temperature=4096-temperature;
temperature=-temperature;
}

Тут я читаю температуру, и если датчик начинает выдавать "минусовую" те мпературу, то от его значений надо отнять 4096 и поставить знак "-".

 

Krik99: то от его значений надо отнять 4096 и поставить знак "-".
вот и ответ
Арс: это не одно и то же, что:
temperature=temperature-4096;
?

 

Так вы мне обясните почему не правельно работает сравнение измеряемой температуры и заданной. Так как сама температура выводится нормально, и у меня с ней проблем нет.
Вот код сравнения :

if(temperature>max) //сравнение
{
PORTB.0=0;
} else {
PORTB.0=1;
};

 

unalex: rik99: то от его значений надо отнять 4096 и поставить знак "-".
вот и ответ
Арс: это не одно и то же, что:
temperature=temperature-4096;
?

Не вижу ответа. Как по мне, математически это одно и то же. Что от большего отнять меньшее а потом поставить минус, что сразу от меньшего отнять большее и результат получить уже с минусом.
Пример:
температура =2000.
По авторскому варианту:
температура = 4096-2000; //температура =2096
температура = -2096;
В итоге имеем результат: -2096.
То же самое получаем одним оператором:
температура = 2000-4096; // температура =-2096
В итоге имеем тот же результат: -2096, но на одну операцию меньше потратили на его получение.

 

Арс: Не вижу ответа
Имелось ввиду не решение конкретной проблемы со знаком а улучшение существующего кода до более оптимального и читабельного вида.

Krik99Существуют определенные правила написания программ, пусть на этой небольшой программе они не играют большой роли но в дальнейшем могут значительно облегчить понимание кода. В аттаче пример этой же программы, но с применением некоторых простых правил

По поводу конкретной проблемы, судя по описанию теряется знак(хотя вроде такого быть не должно), можно попробовать искусственно в теле функции сравнения снова привести переменные к типу signed

if((signed)temperature>max) //сравнение

или записать так(хотя по сути это то же самое что и в исходном коде), но мало ли, вдруг поможет
if((temperature-max)>0)

Прошу извинить за замечания и за мой чайниковский подход, знаний мало, а помочь хочется

148462.c

 

unalex: судя по описанию теряется знак
у меня тоже было такое при сравнении отрицательных температур. Оказалось что у меня переменная была объявленна беззнаковой (по умолчанию). Поменял в объявлении на "знаковую" и все заработало.