Страница 1 из 1

Стрелочный термометр

Добавлено: Вс авг 05, 2012 19:11:21
within
Доброго времени суток!
Предыстория.
Откопал я на работе термометр 1959 года для отопительного котла. Приглянулся он мне уж. И решил я туда вставить современную начинку. После не очень долгих размышлений было принято решение использовать трёхфазный моторчик от флоппика + часть механики от старых часов. После опять же не очень долгих опытов исполнительная часть, шкала и плата были готовы. Для проверки и подгонки шкалы переменную Tnew увеличивал на каждом прерывании на 1. Короче говоря, механика работает неплохо. Хоть и не идеально. Проблема холостого хода механики при изменении направления вращения будет решена позже. Да и вопрос, что же делать, если свет откючили? Не разбирать же его каждый раз) Но это всё потом, а пока...

Были проблемы с чтением датчика. Вроде разобрался. Но есть другие приколы. К примеру, чаще всего синий светодиод не тухнет при превышении порога 0 градусов. Загорается он и второй, в зависимости от условия. Симулировалось в Протэусе 7.8. Сколько раз уже смотрел исходник, но не могу понять, где я протупил. Температура из нормального вида переводится в вид типа: 0=100, 25=125, -25=75. Для удобства расчёта дэльты. На индикатор выводится "контрольная" цифра для периодического контроля измеренной температуры и положения стрелки. Порой при симуляции при положительной температуре цифра говорила "8" и горел синий светодиод. Кому не лень, посмотрите исходник, может я чё провтыкал? Начал писать в 2.05, а компилировалось всё в 1.25.

U2 используется лишь для мигания светодиодом.

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 07:02:25
Minor/2
Я еще сам не проснулся,но уже видно,что Вы только "спрашиваете" у датчика про температуру и никоим образом не настаиваете на том,что бы он её измерил. Алгоритм,в Вашем случае,должен быть приблизительно таким : w1_init() -> Skip ROM [CCh] -> "Convert T [44h]" -> delay_ms(750(вроде бы,не помню точно)) -> Tnew=ds18b20_temperature(0). Хотя,конкретно у меня функция ds18b20_temperature(0) всегда работала спорно, по-мне лучше читать скратчпад самому,но это уже другая история.

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 08:08:21
within
Я бы полностью с Вами согласился, если бы не одно "но". Чтение содрано из проэкта термометра одного. Только он на меге 8 и жки. Содрал оттуда работу с датчиком. Заработало, но вот со сбоями. Подумал... Запихнул в тот проэкт свой алгоритм и вывел на жки значения Told, Tnew, deltaT, temp. Крутил на датчике температуру как только мог. Работает, грубо говоря, идеально. Выводит правильные значения этих переменых в соответствии с замыслом. Может, тинька не тянет? Проверить её с жки не могу, памяти не хватает, жки много жрёт.

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 10:11:10
Minor/2
посмотрел библиотеку - действительно в функцию вставлен "замер". По поводу дисплея есть косячёк со sprintf-ом (великовато для тини :) ). Выводите при помощи UART.
З.Ы. : И все таки я бы читал скратч без функции компилятора, а так w1_write, w1_read.

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 13:34:12
within
Но ведь в чём суть проблемы? Я, конечно, вечером переделаю всё это под мегу и жки, но не ждёт ли меня та же ерунда? Почему раз через раз не тухнет синий светодиод, загорается красный и цифра не та? Вроде условие включения не двузначное. Как может температура быть одновременно меньше 0 и больше 25? Так вот, ответьте мне, это корявость моего кода или проблема тини? И может ли причиной быть стэк? У них он ох какой разный.

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 15:09:08
Minor/2
У Вас это в железе собрано или пока только симулируется в протеусе?

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 15:51:38
within
В железе собрано, кроме датчика. Потому вместо чтения датчика добавлял один градус. В таком случае железо работает корректно. Грешить на симулятор?

Re: Стрелочный термометр

Добавлено: Пн авг 06, 2012 20:11:33
Minor/2
По синему светодиоду похоже здесь затык :

/*Включаем светодиоды в зависимости от температуры*/
if(Tnew<100)//синий
{
PORTA.0=1;
}
else
{
PORTA.1=0;
}

if((Tnew>=100)&&(Tnew<128))//зелёный
{
PORTA.1=1;
}
else
{
PORTA.1=0;
}

if(Tnew>=128)//красный
{
PORTD.1=1;
}
else
{
PORTD.1=0;
}
}

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

Re: Стрелочный термометр

Добавлено: Вт авг 07, 2012 07:37:44
within
Тут провтыкал, спасибо. Сделал вчера под мегу. В общем, проскакивает ужасный глюк. Если температура не меняется, то цикл вращения мотора становится бесконечным, хотя вращаться вообще не должен. Вечером постараюсь выложить. И небольшой вопросик. Сдесь же нет дробной части градуса?

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 08:08:53
within
В каком случае датчик выдаёт –9999?

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 08:31:42
Minor/2
Функция float ds18b20_temperature()
"вернет" Вам -9999 если
ds18b20_read_spd(addr)==0,
если
ds18b20_select(addr)==0
и если
ds18b20_read_spd(addr)==0


Сама функция float и "вернет" Вам соответствующее значение (return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;).

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 08:49:13
within
Выдаёт, если температура не меняется. Честно говоря, запутался уже.

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 11:45:42
within
Ну, а в каких случаях они равны 0? Прошу не ругаться)

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 13:03:02
Minor/2
А чем не нравится,например, вот так :

// Declare your local variables here



char Scratch[9];
char i=0;

init();

w1_init();
w1_write(0xCC);
w1_write(0x44);
delay_ms(800);

while (1)
{
// Place your code here

w1_init();
w1_write(0xCC);
w1_write(0xBE);

for (i=0;i<9;i++){Scratch=w1_read();}

w1_init();
w1_write(0xCC);
w1_write(0x44);
delay_ms(800);

}; ?

Мне кажется так попроще будет ...

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 19:02:44
within
Спасибо, обязательно попробую с целью оптимизации. Но пока хочу разобраться со стандартной библиотекой. Аппаратная ошибка отпадает. На симуляции же работает. А вот где программная? Может задержка в 1 сек. мешает? Посмотрю примеры в вижене.

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 19:05:11
within
while (1)
{
// Place your code here

w1_init();
w1_write(0xCC);
w1_write(0xBE);

for (i=0;i<9;i++){Scratch=w1_read();}

w1_init();
w1_write(0xCC);
w1_write(0x44);
delay_ms(800);

А на выходе что имеем? Число в двоичной, десятичной, MSB/LSB?

Re: Стрелочный термометр

Добавлено: Ср авг 08, 2012 20:46:22
Minor/2
"На выходе" имеем скратчпад сохраненный в массиве Scratch[], из которого,глянув в даташит на датчик,достаем температуру и всё. Вообще если пользоваться функциями кодвижена, то лучше использовать DS18S20.

Re: Стрелочный термометр

Добавлено: Сб авг 11, 2012 17:40:49
within
Оставил стандартную библиотеку. При ошибке чтения вывожу "Е". Так вот, в протэусе выводило , грубо говоря, через раз. Сегодня купил датчик, собрал "на кривой морской". Ошибок чтения пока не обнаружено) Спасибо за советы. Можно было бы использовать и ваши рекомендации, но занято только 23,9% флэша меги. Можно было и тиньку оставлять :( Ну, значит бум фантазировать о доп. функциях :))

Re: Стрелочный термометр

Добавлено: Сб авг 11, 2012 22:36:06
m.ix
off

тут в одном проекте про ГРИ часы
был аналоговый термометр с использованием *светящего столбика* ИН-13
и по моемому 12 или 16 F629 8pin микры.
и там две прошивки
для комнаты 0 - 30*
и улицы -30* - +30*

Re: Стрелочный термометр

Добавлено: Вс авг 12, 2012 21:44:58
within
А можно поподробнее?