Измерительное оборудование Осциллографы, мультиметры, анализаторы и другая измерительная техника необходимая каждому разработчику. |
21.10.2011, 18:39
|
|
Прописка
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Маркировка датчика температуры DS1820
На днях приобрёл датчик с обозначением DS1820, и купил с дуру 2 шт
подключил к рабочей схеме, с возможностью переключать на S и на В.
И в результате эти датчики показывают такую ерунду, при 20гр показывает -33гр. Бился с ними да так и не определил алгоритм вычисления температуры. Может кто знает.
|
|
|
|
22.10.2011, 00:03
|
|
Временная регистрация
Регистрация: 15.05.2010
Сообщений: 58
Сказал спасибо: 0
Сказали Спасибо 33 раз(а) в 16 сообщении(ях)
|
Re: Маркировка датчика температуры DS1820
Что тут спорить? На корпусе DS1820 и DS18S20 пишут просто "DS1820", но упервых корпус высокий PR35, а у других - обычный TO-92. Для DS18B20 на корпусе таки ипишут.
Что касается запрета прерываний при работе с шиной 1-Wire, то он нужен, но только на короткое время:
Код:
|
//--------------------- Генерация импульса сброса: ---------------------------
bool TReset(void)
{
char si;
Port_OWP1_0; //OWP ‹- 0
Delay_us(500); //delay 500 uS
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP1_Z; //OWP ‹- 1
Delay_us(14); //delay 14 uS
if(Pin_OWP1) //если OWP = 0, то ошибка
{
Delay_us(52); //delay 52 uS
if(!Pin_OWP1) //если OWP = 1, то ошибка
{
__restore_interrupt(si); //восстанавление прерываний
Delay_us(250); //delay 250 uS
if(Pin_OWP1) //если OWP = 0, то ошибка
{
return(1); //если ошибок нет, термометр присутствует
}
}
}
__restore_interrupt(si); //восстанавление прерываний в случае ошибки
return(0);
}
//-------------- Запись/чтение байта по однопроводной шине: ------------------
char TByte(char dat)
{
char res;
for(char i = 0; i ‹ 8; i++)
{
res = res ›› 1;
if(TBit(dat & 1)) res |= 0x80;
else res &= ~0x80;
dat = dat ›› 1;
}
return(res);
}
//--------------- Запись/чтение бита по однопроводной шине: ------------------
bool TBit(bool b)
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP1_0; //OWP ‹- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP1_Z; //bit = 1, OWP ‹- 1
Delay_us(13); //delay 13 uS
bool owp = Pin_OWP1; //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP1_Z; //OWP ‹- 1
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
} |
|
|
|
|
22.10.2011, 18:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Маркировка датчика температуры DS1820
Сообщение от shalan
|
Чтобы считывать температуру не запрещая прерывания пришлось поднять частоту кварца с 4-х до 8-ми Мгц
|
А что мешает опрашивать датчик по тем прерываниям, которые Вы не хотите запрещать. Ведь и для часов и для тахометра прерывания будут не супер частые и в промежутке между прерываниями можно вполне передать/принять что-нибудь (один или несколько слотов). Частота следования слотов у DS в сторону уменьшения не регламентируется.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:53.
|
|