Пропадает ROM у DS18B20

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
DerMeister
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт июл 17, 2012 17:45:46
Откуда: Тольятти

Пропадает ROM у DS18B20

Сообщение DerMeister »

Здравствуйте Коты!
Делается устройство - 10ти канальный термометр на DS18B20.
Работало все хорошо до того момента пока я не предпринял попытку опрашивать датчики не по порядку, как идут их ROM в массиве, а создать свой массив со своим порядком ROM кодов.
Т.е. Было так: unsigned char rom_rab[devices][9]; объявлен массив
for(i=0;i<devices;i++) //перебираем номера датчиков в массиве по череди
{ temp=ds18b20_temperature(&rom_code[i][0]);} //берем их ROM из массива, спрашиваем температуру.
(В этом массиве номера датчиков идут по порядку: [0][9];[1][9];[2][9];[3][9]; и т.д.)

А хотелось бы так: unsigned char rom_rab[devices][9]; // объявляем свой массив
(В этом массиве номера датчиков идут так, как я их туда запишу: [3][9];[5][9];[1][9];[0][9]; и т.д.)
Затем тем же методом - for(i=0;i<devices;i++) //перебираем номера датчиков в массиве по череди
{ temp=ds18b20_temperature(&rom_rab[i][0]);} //берем их ROM из массива, спрашиваем температуру.
Они уже идут не по порядку как видно.

Запись из rom_code[devices][9] в rom_rab[devices][9] провожу с помощью этой конструкции:

void edit(void)
{char z,e,i;
z=0; //переменная перебора быйтов в массиве
e=0; //номер датчика в массиве rom_code
i=0; //номер датчика в массиве rom_rab

while(i<devices) //Будем делать пока не запишем ROM всех датчиков в rom_rab
{temp=ds18b20_temperature(&rom_code[e][0]); //Просим температуру с первого массива, с датчиком номер e

if(temp>a) //Если она больше установленного значения(я этот датчик нагрел)
{for(z=0;z<9;z++)
{ rom_rab[i][z]=rom_code[e][z]; //Переписываем ROM датчика с номером e в массив rom_rab с номером i
}
while(temp>=a)
{ temp=ds18b20_temperature(&rom_code[e][0]); //Ждем пока датчик остынет
}
i++; //Увеличиваем номер в массиве rom_rab
e=0; //Опрашиваем датчики из массива rom_code заново

}

else{e++;} //если датчик не нагрет - берем температуру со следующего

if(e==devices) //Если опросили все датчики из rom_code
{e=0;} //начинаем опрос заново


}


}

Суть в том, чтоб после этой процедуры опрашивать датчики из rom_rab в нужной мне последовательности, а не как они идут по порядку в rom_code.
Так вот, во время исполнения кода который выше, после определения пары датчиков, следущий перестает видится - т.е. не запрашивается его температура.
Хотя все остальные видятся.(Первый - увидили, второй - увидили, третий - не опрашивается, четвертый - увидили...)
В чем может быть беда? Кто что может подсказать?
Прошу прощения если мутно написал! Спрашивайте что не понятно!
Спасибо заранее всем!
P.S. Могу скинуть исходник, но он не прокоментирован. Так-как было задуманно сделать на "скорую руку"... :)
Боишься? Сиди дома!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Пропадает ROM у DS18B20

Сообщение Gudd-Head »

DerMeister писал(а):Прошу прощения если мутно написал!

Да уж.
DerMeister писал(а):Спрашивайте что не понятно!

Хотелось бы не код видеть, а последовательность команд из ДШ с комментариями чего делается и что хотелось бы иметь в итоге.
DerMeister писал(а):Могу скинуть исходник, но он не прокоментирован.

Пипец :facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
DerMeister
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт июл 17, 2012 17:45:46
Откуда: Тольятти

Re: Пропадает ROM у DS18B20

Сообщение DerMeister »

Мда...
Ладно. Попробуем попроще:
Первая команда датчикам - devices=w1_search(0xf0,rom_code); - поиск всех присутствующих датчиков на шине. devices будет содержать кол-во найденых датчиков(например 4). Уникальные ROM коды этих датчиков будут записаны в двумерный массив rom_code[i][9], где - i - номер датчика, 9 - 9 байт ROM кода.

Вторая - ds18b20_init(&rom_code[i][0], 0, 110, DS18B20_9BIT_RES) - инициализация датчиков. Берем последовательно каждый датчик из массива rom_code[][] и инициализируем его(записываем в его память нижнюю и верхнюю температуру срабатывания сигнализации, выставляем разрешение 9 бит).

Третья - temp=ds18b20_temperature(&rom_code[i][0]); - запрашиваем температуру у датчика с номером i(например у датчика который в массиве rom_cod[][] находится под номером 0). Переменная temp будет содержать температуру.
Первая и вторая команды даются однократно. У меня они идут после инициализации портов контроллера, в самом начале программы.
Третья - естественно по мере надобности в теле проги.

Это все стандартные команды из стандартной библиотеки в CVAVR.

Вот и все собственно. Кака в том, что при инициализации ROM коды датчиков записываются в массив по очереди, то есть от меньшего к большему. Например:
rom_code[0][5F]
rom_code[1][6F]
rom_code[2][7F]
rom_code[3][8F]
То есть перебирая по очереди i(0,1,2,3) первую температуру получим с того датчика чей ROM код первый в массиве(его ROM самый маленький), а не с того который физически стоит первым(во вложении рисунок).
Идея в том чтоб создать еще один такой же массив rom_rab[i][9] и записать в него ROM коды датчиков в том порядке, в каком они находятся физически. Например: БЫЛО -
rom_code[0][5F]
rom_code[1][6F]
rom_code[2][7F]
rom_code[3][8F]
СТАЛО -
rom_rab[0][5F]
rom_rab[1][8F]
rom_rab[2][7F]
rom_rab[3][6F]
Теперь простым перебором i можем получать температуру с датчиков в той последовательности, в какой они находятся физически на стенде. Например вот так:
for(i=0;i<devices;i++)
{ temp=ds18b20_temperature(&rom_rab[i][0]);} //увеличиваем переменную i от 0 до найденого кол-ва датчиков(0,1,2,3), в переменной temp будет температура нужного датчика в нужной последовательности.

И, как я писал выше, переписывать ROM коды из массива rom_code в массив rom_rab будем с помощью этой функции:

void edit(void)
{char z,e,i;
z=0; //переменная перебора быйтов в массиве
e=0; //номер датчика в массиве rom_code
i=0; //номер датчика в массиве rom_rab

while(i<devices) //Будем делать пока не запишем ROM всех датчиков в rom_rab
{temp=ds18b20_temperature(&rom_code[e][0]); //Просим температуру с первого массива, с датчиком номер e

if(temp>a) //Если она больше установленного значения(я этот датчик нагрел)
{for(z=0;z<9;z++)
{ rom_rab[i][z]=rom_code[e][z]; //Переписываем ROM датчика с номером e в массив rom_rab с номером i
}
while(temp>=a)
{ temp=ds18b20_temperature(&rom_code[e][0]); //Ждем пока датчик остынет
}
i++; //Увеличиваем номер в массиве rom_rab
e=0; //Опрашиваем датчики из массива rom_code заново

}

else{e++;} //если датчик не нагрет - берем температуру со следующего

if(e==devices) //Если опросили все датчики из rom_code
{e=0;} //начинаем опрос заново


}


}

Суть в том, чтоб после этой процедуры опрашивать датчики из rom_rab в нужной мне последовательности, а не как они идут по порядку в rom_code.
Так вот, во время исполнения кода который выше, после определения пары датчиков, следущий перестает видится - т.е. не запрашивается его температура.
Хотя все остальные видятся.(Первый - увидили, второй - увидили, третий - не опрашивается, четвертый - увидили...)


Вобщем... как-то так...
Короче, надо привязать датчики и опрашивать их в той последовательности, в которой они физичеки находятся на стенде.
Все. Как подробнее написать я уж и не знаю...
Вложения
tmp.jpg
Картинка
(50.13 КБ) 345 скачиваний
Боишься? Сиди дома!
orinoko

Re: Пропадает ROM у DS18B20

Сообщение orinoko »

У меня одно время тоже была такая же задача, если я правильно понял вопрос. Решил делать так. В EEPROM МК у меня записывались все номера датчиков, которые могут быть в системе. Датчикам был присвоен порядковый номер (был записан на лейбочке на проводе датчика). Есть таблица соответствия серийному и порядковому номерам. После чего командой контроллеру я мог указать любую последовательность опроса по их порядковому номеру единоразово после включения контроллера. Так как контроллер у меня присоединялся к компу через RS-485, то были предусмотрены все команды, необходимые для этого
DerMeister
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт июл 17, 2012 17:45:46
Откуда: Тольятти

Re: Пропадает ROM у DS18B20

Сообщение DerMeister »

Можно было бы сделать как Вы советуете. Но что делать если один из датчиков выйдет из строя? Его придется заменить, а ROM у него уже будет свой. Ну если есть связь с компом то это не большая проблема. Но у меня устройство будет полностью автономным.
Но, впрочем, проблему я решил иначе.
Я при программировании датчиков, записываю в массив в EEPROM не ROM коды датчиков, а номера датчиков в нужной мне последовательности. А потом в главном цикле вместо номера датчика подставляю номер из этого массива.

for(i=0;i<devices;i++)
{

temp=ds18b20_temperature(&rom_code[select[i]][0]); //просим температуру у датчика с номером из массива select[i].
А уже в массиве последовательность я могу забить какую хочу. Например:
select[4]={0,2,3,1}

Вобщем получилось все довольно красиво.
Однако почему не работала первая идея я так и не понял. Видимо это так и останется тайной.

Всем спасибо, кто попытался помочь ну и кто попытался хотябы понять что я тут замудрил... :)
Боишься? Сиди дома!
Ответить

Вернуться в «Периферия»