Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.04.2007, 22:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
628 пик,4 мега,ds18b20 проект в протеусе на хайтековском коипиляторе.
Схалтурил, конечно, в железе наверняка мерцать будет, по прерыванию надо было делать регенерацию дисплея... По телеку Дом-2 шло, как раз время развеяться с компом...
Прикрепленный файл: 1013717.rar
|
|
|
|
23.04.2007, 03:21
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Сообщение от sanitar249
|
В качестве самого датчика,на мой взгляд, лучшее это далласовские датчики с однопроводным интерфейсом (огромный выбор, низкая цена,малые габариты). собирал на таком термометр (правда обработка на 8051 ядре, а не на ПИКе)он все делает внутри себя, остается только обработать результат.
|
Всеобщее заблуждение про датчики от Dallas:
1. дешевые - сосем не дешевые, LM75A стоит примерно в 2-3 раза дешевле DS18B20
2. удобство интерфейса - тоже не совсем верно, их несложно использовать, когда датчик 1 на линии, если их 2 и больше, необходимо предварительно прочитать адрес каждого, чтобы обращаться к нужному датчику.
При I2c таких проблем нет.
|
|
|
|
23.04.2007, 08:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
да ни фика там сложного нет, я делал считывание серийников из 8 параллельно включенных дс при начальной установке.
|
|
|
|
23.04.2007, 08:46
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Сообщение от urry
|
да ни фика там сложного нет, я делал считывание серийников из 8 параллельно включенных дс при начальной установке.
|
Телодвижения то все равно надо совершать дополнительные! А вдруг вспотеешь?
|
|
|
|
23.04.2007, 09:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
ну... мне было даже интересно... особенно когда лазишь в поисках примеров для МК по инету и понимаешь, что кроме тебя, никто такой херней не страдает. Чувствуешь себя первопроходцем. Херни. Кстати, могу код показать.
|
|
|
|
23.04.2007, 10:03
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 50
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
дешевле всего термосопротивление влепить, с нормальной программой перерасчета в градусы, и индикацию динамическую на дешевом 3символьном индикаторе по 0.8бакс.
|
|
|
|
23.04.2007, 13:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от DAS_WEYDER
|
дешевле всего термосопротивление влепить, с нормальной программой перерасчета в градусы, и индикацию динамическую на дешевом 3символьном индикаторе по 0.8бакс.
|
На терморезисторе-запарно калибровать. С динамической индикацией тоже связываться не стоит, проще взять дискретные семисегментники со встроенным дешифратором(и не моргают, и светят ярче)
|
|
|
|
23.04.2007, 13:51
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Сообщение от urry
|
ну... мне было даже интересно... особенно когда лазишь в поисках примеров для МК по инету и понимаешь, что кроме тебя, никто такой херней не страдает. Чувствуешь себя первопроходцем. Херни. Кстати, могу код показать.
|
Ну отчего же? Страдают...
Вот, например:
http://www.rentron.com/PicBasic/PBP1-wire.htmhttp://www.rentron.com/PicBasic/one-wire2.htm
|
|
|
|
23.04.2007, 14:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
так в ссылке они уже знали серийники, а я их вычислял...
И не 2, а 8...
Код:
|
// считаем количество устройств от 0 до 7 (максимум 8)
for( r=0;r‹8;r++)
{
reset_();
wr_b(0xf0);
find_tst(r,sn);
if(r == 0)
{
// temp3=sn[0];
// temp4=sn[7];
ar_cpy(r_w_m,sn);// копируем считанный серийник в массив записи
kol_vo=1;
wr_ep(0);//на шине есть минимум 1 устройство, раз мы сюда дошли
del_dsp(20);// даем время записаться
}
else
{
if (sverka(kol_vo) == true)//проверили все серийники, ни 1 не совпал - новое устройство
{
ar_cpy(r_w_m,sn);// копируем считанный серийник в массив записи
wr_ep(kol_vo*8); // записываем серийник нового устройства в епром
del_dsp(20);// даем время записаться
kol_vo++;
}
}
// окончание подсчитывания / поиска устройств - в переменной kol_vo - количество устройств, в епром, начиная с адреса 0
// последовательно записаны их серийники
}
static bit sverka(unsigned char k)
{//функция сравнения считанного серийника с записанными в епром, к - количество устройств
static bit z=false;
unsigned char ustr,stroka;
for(ustr=0;ustr‹k;ustr++)
{
rd_ep(ustr*8);
z=false;
for (stroka=0;stroka‹8;stroka++)
{
if(sn[stroka] != r_w_m[stroka]) z=true;
}
if(z == false) return false; // если есть совпадение хотя бы 1 серийника, дальше проверять не надо
}
if(z == true) return true;//возвращает труе, если ни один записанный в епром серийник не совпал со считанным
}
//--------------------------------------------------------
//-------------------------------
void find_tst(unsigned char t,unsigned char *sn)
// каждый вызов этой функции записывает серийный номер в массив sn
{ // t -это маска, которая будет использоваться при совпадениях
unsigned char nbt; // 8 байт серийного номера
unsigned char nbit;// 8 бит в байте
static bit inf0,inf1,inf;
//-----
for (nbt=0;nbt‹8;nbt++)
{
for (nbit=0;nbit‹8;nbit++)
{
sn[nbt]=sn[nbt]››1;// сдвигаем серийный байт на 1 бит вправо,освобождаем место
inf0=read_bit(); // читаем значение - если нет совпадений,
inf1=read_bit(); // то прочитается 10 или 01
if (inf0 != inf1)
{
if (inf0 == 1)
{
sn[nbt]=sn[nbt]+0x80;// ставим 1 в старшем бите, 0 -получился
} // при сдвиге
write_bit(inf0); // выдаем то значение, которое
} // пришло первым
else //------------------- есть совпадение в серийниках
{
//---------------
inf=t&0x01; // читаем то значение бита байта, который мы задавали при вызове
t= t ›› 1; // готовим следующий бит
//---------------
write_bit(inf); // выдаем его
if(inf == 1)
{
sn[nbt]=sn[nbt]+0x80;// если он 1, аналогично пишем в серийник
}
}//-----------------------
}
}
}
//------------------------------------------------------------------------------------------- |
|
|
|
|
23.04.2007, 17:30
|
|
Прописка
Регистрация: 18.06.2006
Сообщений: 179
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Сообщение от urry
|
так в ссылке они уже знали серийники, а я их вычислял...
И не 2, а 8...
|
Я, видимо, не очень понятно объясняю:
проблема не вычислить номера, а сопоставить конкретный номер с физическим положением датчика.
Ну прицепили их на линию 10 штук, в разных местах, скажем в разных кабинетах на этаже.
Как сопоставить датчик и кабинет? Никак, нужно предварительно знать номер датчика и потом уже помещать его в кабинет.
С I2C проще - всегда можно однозначно определить (задать)его адрес, и не нужно ничего предвартельно читать.
Но это так, просто мысли по поводу.
Кому нравится попадья, а кому поповская дочка...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:20.
|
|