Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Подключение NTC-термисторов на шину 1Wire как и DS18B20

Форум самогонщиков Приборы и электр(он)ика
1 2 3 4 4
Dry Gin Профессор Челябинск 11.9K 1.9K
Отв.60  26 Окт. 23, 19:32
Я помню времена, не так давно, кстати, когда в массовых смартфонах были матрицы 2-4 мегапикселя. А когда Nokia предложила 50 Mpx, все говорили, мол это голимый маркетинг. А сегодня очень смешно и грустно смотреть на фотки с тех старых смартфонов.
Volume Кандидат наук Уфа 478 274
Отв.61  27 Окт. 23, 15:16
50 Mpx, все говорили, мол это голимый маркетинг. А сегодня очень смешно и грустно смотреть на фотки с тех старых смартфоновDry Gin, 26 Окт. 23, 19:32
ключевое тут "смотреть". На красивые 5тизначные циферки или график, болтающийся туда-сюда в несколько соток, но болтающийся ПЛАВНО, с градацией в тысячные - можно смотреть бесконечно, как на огонь чужую работу текущую воду )
А для автоматики тысячные бессмыслены - в силу дрейфа/нестабильности Т на объекте измерения в единицы сотых, даже если не заморачиваться на шум/дрейф датчика, наводки на схему измерения и собственную погрешность/дрейф схемы измерения. Мимо колонны пройдешь - Т на сотку прыгает, не говоря уж если окно открыть в помещении

Ну чтоб совсем уж не оффтоп.
Делал конструкцию этой ветки, прикольно. Но нормально работало только с программным "мастером" 1w, на ардуинке 328p. С аппаратным драйвером DS2482 не срослось, не видит 1wire устройств на шине
serjrv Кандидат наук Камышин 393 219
Отв.62  27 Окт. 23, 21:45
Делал конструкцию этой ветки, прикольно. Но нормально работало только с программным "мастером" 1w, на ардуинке 328p. С аппаратным драйвером DS2482 не срослось, не видит 1wire устройств на шинеVolume, 27 Окт. 23, 15:16
C DS2482 проблема в следующем, в ее библиотеке (или связанных с ней) использована двойная инициализация DS`ок (какого то хрена ее автор решил что при первой инициализации надо кол-во датчиков посчитать, а потом уже при второй инициализации их серийники запомнить, глупо, но так реализовано), из за этого возникает глюк в либе OneWireHUB, которая собственно и поднимает программный 1-Wire. На 100% разбираться с библиотекой OneWireHUB мне было влом (только критичные глюки подправил), а вот библиотеку под DS2482 я правил немного поболее, но правда уже не шибко помню что менял. Переделывал ее под DS2484 (и не фак что она заработает теперь с DS2482), ну и заодно под OneWireHUB подправил.

Проще говоря, библиотека OneWireHUB не понимает более одной команды на поиск датчиков - Search ROM (0xF0), ну и более быстрый - Alarm Search (0xEC) в этой либе тоже не реализован к сожалению.
Volume Кандидат наук Уфа 478 274
Отв.63  28 Окт. 23, 14:28
C DS2482 проблема в следующем, в ее библиотеке (или связанных с ней) использована двойная инициализация DS`ок (какого то хрена ее автор решилserjrv, 27 Окт. 23, 21:45
нет, там что-то с таймингами не срастается, чип после 1-Wire Reset не взводит бит PPD "presence pulse detected", т.е. устройства на линии не "подергали" шину в ответ на сброс. Копать не стал, особой надобности не было
Сторонней библиотеки нет, драйвер 2482 самописный
serjrv Кандидат наук Камышин 393 219
Отв.64  28 Окт. 23, 19:54
чип после 1-Wire Reset не взводит бит PPD "presence pulse detected", т.е. устройства на линии не "подергали" шину в ответ на сброс.Volume, 28 Окт. 23, 14:28
Ок. Если время свободное появится, проверю с отладкой на эту тему. Сниффер 1-Wire правда еще придется скидать (нам же "железяка DS248x" уже все транслирует), дабы сразу весь анализ на комп вывести, но это не проблема.

Добавлено через 39дн. 17ч. 50мин.:

Volume, В общем ты прав на счет Reset в либе OneWireHUB. В Ардуиновских поделках как то работает, а вот в серьезных проектах уже хренушки, особенно если оптимизация в компиляторе включена. Была необходимость перетащить эту либу на дешманский STM32F030, и как раз столкнулся с этой проблемой.
В итоге практически переписал ее, с привязкой всех критических интервалов отсчетов на таймер. Но реализовал все жестко под конкретный контроллер, нет к сожалению времени на полную переделку либы в "культурный" вариант. Но если кто то возьмется добить эту либу, то вот небольшая наводка где правил:
Скрытый текств platform.h жестко прописал пин отвечающий за 1Wire, хотя по уму надо обрабатывать маски регистров выбранного порта
#include "stm32f030x6.h"
#define DIRECT_READ(base, pin)          (GPIOA->IDR & 0x00000100) // RA8
#define DIRECT_WRITE_LOW(base, pin)     (GPIOA->BSRR |= 0x01000000) // RA8
#define DIRECT_WRITE_HIGH(base, pin)    (GPIOA->BSRR |= 0x00000100) // RA8
#define DIRECT_MODE_INPUT(base, pin)    (GPIOA->MODER &= ~0x00010000) // RA8
#define DIRECT_MODE_OUTPUT(base, pin)   (GPIOA->MODER |= 0x00010000) // RA8
using io_reg_t = uint32_t; // define special datatype for register-access
constexpr uint8_t VALUE_IPL {1};

в OneWireHub.cpp правок относительно много, но вот основные две:
// 1 - подпрограмма отлавливающая сигнал Reset на шине
bool OneWireHub::checkReset(void) {
   DIRECT_MODE_INPUT(pin_baseReg, pin_bitMask);
   if (!DIRECT_READ(pin_baseReg, pin_bitMask)) {
      if (TIM3->CNT > 960) _error = Error::VERY_LONG_RESET;
      return true;
   }
   else {
      if (TIM3->CNT > 360 && TIM3->CNT < 960) {
         if (_error == Error::RESET_IN_PROGRESS) _error = Error::NO_ERROR;
         return false;
      }
      TIM3->EGR |= TIM_EGR_UG; TIM3->CNT = 0;
   }
   return true;
}
// 2 - отсчет задержек на шине
timeOW_t OneWireHub::waitLoopsWhilePinIs(volatile timeOW_t retries, const bool pin_value) const {
   retries /= microsecondsToClockCycles(1); // возвращаем псевдо число задержки в нормальные микросекунды
   TIM3->EGR |= TIM_EGR_UG; TIM3->CNT = 0;
   while ((DIRECT_READ(pin_baseReg, pin_bitMask) == pin_value) && (TIM3->CNT < retries));
   if (retries > TIM3->CNT) return (retries - TIM3->CNT);
   return 0;
}

p.s. Еще чуть не забыл, в функции bool OneWireHub::showPresence(void) ищем строку:
wait(ONEWIRE_TIME_PRESENCE_MIN[od_mode]);
и меняем ее на это:
waitLoopsWhilePinIs(ONEWIRE_TIME_PRESENCE_MIN[od_mode], false);

p.p.s. TIM3 заведен на отсчет в микросекундах в основном коде программы (хотя это опять же надо в либу интегрировать с учетом выбранного контроллера):
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 47; // 1 мкСек
TIM3->CR1 |= TIM_CR1_CEN; // включили таймер
Учитываем, что правки под конкретный камень из серии STM32F030 и естественно не под среду Arduino. Но что именно надо править, для "правильных" временных интервалов, думаю разобраться не проблема.
Volume Кандидат наук Уфа 478 274
Отв.65  15 Февр. 24, 19:23
еще раз про совместимость с DS2482
Взял OneWireHub версии 2.2.3 с гитхаба, ничего не менял. Сваял 2канальный конвертер АЦП в температуру на атмега328р - на базе примера из библиотеки
Подключил к автоматике с DS2482.
1. подключен только эмулятор. Все отлично
2. подключил параллельно шлейфу из 4х реальных ds-ок.
Реальные ds читаются, эмулированных нет, при чтении возвращают FF во всех ячейках. Понаставил в коде отладочных сообщений, после каждой 1w команды. И вдруг па-бам! эмулированные начали читаться. Сбои раз на 20..40 чтений. Убираю отладку - на каждом чтении сбой.
Т.е., попросту не успевает софт эмулятора. Возможно, на более быстрых процах проблем и не будет
serjrv Кандидат наук Камышин 393 219
Отв.66  16 Февр. 24, 10:29
Volume, не выйдет на столь кривой либе, без глобальных изменений, что то путнее выжать. Когда перетаскивал ее на STM, в первозданном виде хоть 1 раз из 10 удавалось опросить 1 - 2 датчика, да и то при определенном уровне включенной оптимизации при компиляции. Когда все временные интервалы в либе завязал на таймер (а не эмпирически подогнанные программные задержки), все чудесным образом заработало и с любым количеством параллельно подключенных DS`ок, и с любым выбранным методом оптимизации компилятора, и прекрасно себя чувствует с SD2484 (SD2482 собственно мало чем отличается).