Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Не отдаёт температуру DS1821

Пн мар 25, 2019 05:48:25

Всем привет!

Попросили тут разобраться со старой железкой у которой в качестве температурного датчика использовался DS1821 (тот который термостат ещё) в режиме 1-Wire сенсора.
Исходников железки не сохранилось, а датчики сгорают, ломаются, теряются. И вот человек купил новые, а они не работают.
Сел я посмотреть что с ними не так и не могу понять. Неужто паленые какие-то?

Что имею:
1. STM32F103 проц
2. DS1821 из старых запасов, рабочая, 2 шт.
3. DS1821 из новой закупки (много)

Написал примитивную прогу для опроса регистров DS1821 и вывода результатов в UART.
Так вот старые отлично читаются и температуру кажут. А новые не очень. Вроде как на 1Wire Reset отвечает Presence ом. Но дальше сплошной FF FF FF.

Немного практики:
Спойлер
Код:
uint8_t ow_buf[9];

#define OW_0     0x00
#define OW_1     0xff
#define OW_R_1   0xff
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void OW_toBits(uint8_t ow_byte, uint8_t *ow_bits) {
   uint8_t i;
   for (i = 0; i < 8; i++) {
      if (ow_byte & 0x01) {
         *ow_bits = OW_1;
      } else {
         *ow_bits = OW_0;
      }
      ow_bits++;
      ow_byte = ow_byte >> 1;
   }
}

uint8_t OW_toByte(uint8_t *ow_bits) {
   uint8_t ow_byte, i;
   ow_byte = 0;
   for (i = 0; i < 8; i++) {
      ow_byte = ow_byte >> 1;
      if (*ow_bits == OW_R_1) {
         ow_byte |= 0x80;
      }
      ow_bits++;
   }

   return ow_byte;
}
void OW_SetRegister(uint8_t reg)
{
   uint8_t ow_buf[8];
   MX_USART3_UART_Init(115200);
   OW_toBits(reg,ow_buf);
   HAL_UART_Transmit(&huart3, ow_buf, 8, 1);
}

uint8_t OW_ReadRegister(uint8_t reg)
{
   uint8_t ow_buf[8];
   OW_SetRegister(reg);
   memset(ow_buf, 0xFF, 8);
   HAL_UART_Receive_DMA(&huart3, ow_buf, 8);
   HAL_UART_Transmit(&huart3, ow_buf, 8, 2);
   return OW_toByte(ow_buf);
}

void OW_WriteRegister(uint8_t reg, uint8_t value)
{
   uint8_t ow_buf[8];
   OW_SetRegister(reg);
   OW_toBits(value, ow_buf);
   HAL_UART_Transmit(&huart3, ow_buf, 8, 2);
}
//OneWire Reset
uint8_t OW_Reset(void)
{
   uint8_t data = 0xF0;
   MX_USART3_UART_Init(9600);
   HAL_UART_Transmit(&huart3, &data, 1, 2);
   if (HAL_UART_Receive(&huart3, &data, 1, 2)==HAL_OK)
      return data;
   return 0xF0;
}


Логика работы из кучи обмусоливаний с форумов, т.е. Сначала ресет шины, потом команда. Например Чтение статуса:
Код:
OW_Reset();
reg = OW_ReadRegister(0xAC);

или чтение температуры:
Код:
OW_Reset();
uint8_t reg = OW_ReadRegister(0xAA);


Это всё работает со старыми датчиками, а с новыми ни в какую. ЧЯДНТ?

Re: Не отдаёт температуру DS1821

Пн мар 25, 2019 06:44:13

а ты уверенн чт новые это точно 1821 могли подсунуть перемаркированые какоенить гавно вродн 18s20 или еше хужее-нонейм китайский
если старые работают а новы нет =значит....

Re: Не отдаёт температуру DS1821

Пн мар 25, 2019 06:58:40

Это не проверяли ? (даташит)
СпойлерRETURNING TO 1-WIRE MODE FROM THERMOSTAT MODE
The operating mode of the DS1821 is determined at power-up, depending upon the setting of the T/ R bit.
If the T/ R bit is set to a 1, the DS1821 will power up in thermostat mode. In this mode, the device cannot
be written to or read from over the DQ line. However, it is possible to return to the 1-Wire “read” mode
temporarily, in cases where thermostat limits may need to be changed after insertion and use in a system.
To return to the 1-Wire “read” mode, the VDD pin of the DS1821 is brought to 0V while the DQ line is
held high. The DQ line must then be clocked low 16 times. After this is accomplished, the VDD line may
be brought high again, and the DS1821 will then be in 1-Wire “read” mode.
To toggle between modes, VDD is brought low while DQ is held high and then clocked 16 times. When
VDD is brought high again, the part will then be in thermostat mode again. This technique may be used to
toggle between the two operating modes of the DS1821 as often as required.
When both VDD and DQ are low for more than approximately 10 seconds, the part is powered down.
When powered up again, the part will begin operating in the mode set by T/R* bit (1=thermostat mode,
0=“read” mode).

Re: Не отдаёт температуру DS1821

Пн мар 25, 2019 07:06:04

DS1821 официально снят с производства и всё, что вы покупаете - подделка.
Изображение
Рекомендую перейти на актуальные микросхемы термостатов, вроде DS1620 выпускается, хоть и с другим интерфейсом...
Вложения
0.png
(16.97 KiB) Скачиваний: 575

Re: Не отдаёт температуру DS1821

Пн мар 25, 2019 08:07:33

Там гда стоял 1821 в режиме датчика температуры легче поставить 18В20.
Сложнее, если устройство работало как автономный заранее запрограммированный термостат.
Хоша... любая 8-6 лапая МК + DS18B20/Ds18S20 = аналогии с тем 1821, да еще и с возможностью "перепрошивки уставок на ходу".
8)

Re: Не отдаёт температуру DS1821

Пн мар 25, 2019 08:21:13

страно что ВЭСМА востребованый 1821 сняли...походу мешал малому китайскому бизнесу производства термостатоф...
като попадал на нем прибор там рещено интересно было прибор работал ка термостат ХУ при отключеной индикаци в холодиле в момент установки он переводился в режим термометра и записи регистроф уставки потом обратно
периодически схема включает индикацию температуры по запросу(кнопки клавы) или по времени-раз в 5мин
наверно можно и почаше опрос датчика делать с выводом на дисплей

Re: Не отдаёт температуру DS1821

Вт апр 02, 2019 08:35:27

Это не проверяли ? (даташит)

Должен ли он в режиме термостата отвечать на Reset?

Re: Не отдаёт температуру DS1821

Вт апр 02, 2019 09:02:25

Не должен....Команды же только для однопроводного режима...
А что, даташит даже гуглом не перевести ? ...)))

Re: Не отдаёт температуру DS1821

Вт апр 02, 2019 09:04:40

Не должен....Команды же только для однопроводного режима...
А что, даташит даже гуглом не перевести ? ...)))

Это был тонкий подвод к тому, что упоминать это было бесполезно, ибо на ресет они отвечают. О чём я написал в самом начале.
Ну так вот на ресет они отвечают.
Ответить