Подключение ds2406 в длинную шину с несколькими ds18b20

Слаботочка и низкие напряжения через обычные контакты то еще удовольствие, не рабочий вариант.

Поизучал протокол . Судя по осциллке краша обмена

Получается мастер на шину выдал F0 search И ждёт. Ds у нее первый байт адреса 12h или 00010010 . Т.е младший бит ноль. Ds выдает 0 и инверсию 1, далее МК говорит выбираю 0, ds выдает следующий бит 1 и далее ,по идее, должен выдать инверсию 0, но этого не делает. Мастер понимает что 1и 1 быть не может (ведь допускается 10, 01, или 00) и сбрасывает обмен. Почему то ds ка не хочет инверсию первого бита 1 выдавать , то есть 0 и все крашится.

Но на самом деле ds ка может раньше уже умирает , а именно сразу после подачи своего младшего бита 0. Просто дальнейшие типа выдаваемые ей биты это 1, это ведь просто подтяжка шины , пока совпадало что и нужны были 1, а потом единичка мастера уже не устроила. Но ds ка то могла чуть раньше ещё отсохнуть.

Если возле МК всё “устраивает”, а на конце шины нет - дело во влиянии шины. Но так же , возможно , тайминги на грани, и, достаточно мелочи, чтобы не работало.
В библиотеке легко можно изменить время тайм-слотов, главное не запутаться, копию сохранить)))
Например:

void OneWire::write_bit(uint8_t v)
{
	IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask;
	volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg;

	if (v & 1) {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(10);
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(55);
	} else {
		noInterrupts();
		DIRECT_WRITE_LOW(reg, mask);
		DIRECT_MODE_OUTPUT(reg, mask);	// drive output low
		delayMicroseconds(65);
		DIRECT_WRITE_HIGH(reg, mask);	// drive output high
		interrupts();
		delayMicroseconds(5);
	}
}

Это да. Не пойму только почему инверсия на осциллограмме. В запросе четыре пика и четыре плато.
Это какбутто 00001111 - 0F, а не F0.

Про то, что мощи не хватает - такое же предположение.
Может присутствует дефект чипа и внутренний транзистор не справляется с нагрузкой.

Только менять не write нужно, а read. Write не влияет на слейва и интервалы в нем минимальные.

Реальную длительность таймслота, который клиент формирует, получится на короткой шинке промерять. Но, что-то мне подсказывает, что чудес не будет.

Дак биты то задом наперед идут . В уарт также ведь. Младший это правый. Начинается передача от младшего к старшему , то есть справа налево

Думаю все таки врайт надо менять. Потому что , имхо, тацмслоты dsку не устраивают. Поведение МК по осциллке все логично , а вот ds ки непонятно

Просто я не увидел в документации явного указания на порядок следования. Мож читанул диагонально.

Промерь сначала таймслоты слейва. Он же разок отвечает, одним битом. И на короткой шине отвечает, значит нормально ему.

Вобщем, тут измеритель поточнее нужон.

Уверены?

Вопрос с подвохом ? почему я должен быть не уверен? Я же видел адрес , когда ДС Ка видится на шине. К тому же в документацию заглядывал . Семейство 2406 начинается с 12h. И по осциллке , где МК видит ds ку я считал биты, склеил в байты, совпадает с 12h. Ну может если только правильней сказать нулевой байт адреса, тогда вы правы, но это уже придирки из разряда занудства. Все ж поняли о чем речь.

Тут говорили нужно более точно замерять. У меня же есть логический анализатор saleae. Им более точно можно померить тайминги?

Всё увидите, тайминги и расшифровку протокола.