Проблемы с ds2408 (1-wire)

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ondyon писал(а):ds2408
а где интервал от 200 до 300?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а код программки тестовой можно увидеть? у этого чипа и PRESENCE PULSE тоже короче, чем по стандарту...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 14
Зарегистрирован: Чт апр 16, 2015 13:43:52

Сообщение ondyon »

а где интервал от 200 до 300?
да там всё то же самое, что и после 300. прогнал оба чипа от 1 до 5000

у этого чипа и PRESENCE PULSE тоже короче, чем по стандарту...
да какая разница. Я ловлю любой переход на 0
постоянно читаю без задержек
т.е. время между двумя последовательными READ минимально возможное,
равно времени операции READ + время операции if (a==0)
- не знаю, сколько тактов ардуинки оно занимает, но уж всяко импульс поймает, если он есть

програмку...
да просто модифицированный код функции reset()
ну и вызываю его в бесконечном цикле и пишу потом SUCCESS или FAIL
Спойлер

Код: Выделить всё


uint16_t impulse=200;

uint8_t OneWire::reset(void)
{
	IO_REG_TYPE mask = bitmask;
	volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
	uint8_t r;
	uint8_t retries = 125;

	noInterrupts();
	DIRECT_MODE_INPUT(reg, mask);
	interrupts();

	// wait until the wire is high... just in case
	do {
		if (--retries == 0) return 0;
		delayMicroseconds(4);
	} while ( !DIRECT_READ(reg, mask));
	noInterrupts();


	impulse++;
	if(impulse>1000) impulse=300;

	DIRECT_WRITE_LOW(reg, mask);
	DIRECT_MODE_OUTPUT(reg, mask);	// drive output low

	delayMicroseconds(impulse);

	DIRECT_MODE_INPUT(reg, mask);	// allow it to float

	interrupts();

//	delayMicroseconds(140);	// 70 ORIG  

for(uint16_t n=0;n<1500;n++) {
	r = DIRECT_READ(reg, mask);
	if(!r) { Serial.print("Success"); break; }
}

	interrupts();
	delayMicroseconds(820);	//410 ORIG
        Serial.print("Reset impulse length:");
        Serial.print(impulse);
        Serial.print(" - ");
	return !r;
}
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ondyon, попробуйте это чип перевести на паразитное питание. Вроде все чипы 1-wire после подачи питания должны формировать сигнал присутствие, а reset и будет сбросом питания.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3734207#p3734207"]Вроде все чипы 1-wire после подачи питания должны формировать сигнал присутствие[/uquote]не все
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 14
Зарегистрирован: Чт апр 16, 2015 13:43:52

Сообщение ondyon »

на паразитное - пробовал. В смысле, просто провод который +5в не подключал.

Результат - при больших значениях импульса RESET
на короткое время регистрировался низкий уровень, который не является импульсом присутствуия,
просто питание ещё не зарядилось до 5в, это конец заднего фронта импульса RESET

добавление задержки всего 5мс (а надо по паспорту 70!)
или подключение нормального питания
устраняло этот эффект

Насчёт импулься присутствия после включения питания - никогда не наблюдал
даже у датчиков температуры

Ещё поиграл с изменением резистора PullUp
менял от 2.2к до 10к
пока безрезультатно. (контрольные ds20s18 исправно работали при любом резисторе и даже без него)

Попробовал включить вход данных через резистор 100 ом
всё так же безрезультатно

Заказал ещё партию :)
Реклама
Ответить

Вернуться в «AVR»